Reputation: 11
I am converting the Rtables/tern summary table to an HTML output for Shiny indentation for row grouping, but it is getting messed up with padding on the left.
Rtables/tern code below output here is correct with correct levels
library(rtables)
library(tern)
adae_A <- ex_adae
tbl <- basic_table() %>%
split_cols_by("ARM") %>%
split_rows_by(
"AEBODSYS",
split_fun = trim_levels_in_group("AEHLGT"),
split_label = "AEBODSYS",
label_pos = "topleft"
) %>%
rtables::summarize_row_groups() %>%
split_rows_by(
"AEHLGT",
split_fun = trim_levels_in_group("AEHLT"),
split_label = "AEHLGT",
label_pos = "topleft"
) %>% rtables::summarize_row_groups() %>%
split_rows_by("AEHLT", split_label = "AEHLT", label_pos = "topleft") %>%
rtables::summarize_row_groups() %>%
add_colcounts() %>%
add_overall_col("Overall") %>% tern::analyze_vars(
vars = c("AEDECOD"),
var_labels = c("AEDECOD"),
.stats = c("count_fraction"),
.labels = c(count_fraction = "n (%)"),
.formats = c(count_fraction = "xx (xx.x%)")
) %>%
build_table(adae_A) %>% prune_table(prune_zeros_only)
tbl
as_html(tbl)
Output
AEBODSYS
AEHLGT A: Drug X B: Placebo C: Combination Overall
AEHLT (N=609) (N=622) (N=703) (N=1934)
———————————————————————————————————————————————————————————————————————————————
cl A.1 132 (21.7%) 130 (20.9%) 160 (22.8%) 422 (21.8%)
hlgt A.1.1 132 (21.7%) 130 (20.9%) 160 (22.8%) 422 (21.8%)
hlt A.1.1.1 132 (21.7%) 130 (20.9%) 160 (22.8%) 422 (21.8%)
dcd A.1.1.1.1 64 (48.5%) 62 (47.7%) 88 (55.0%) 214 (50.7%)
dcd A.1.1.1.2 68 (51.5%) 68 (52.3%) 72 (45.0%) 208 (49.3%)
cl B.1 56 (9.2%) 60 (9.6%) 62 (8.8%) 178 (9.2%)
hlgt B.1.1 56 (9.2%) 60 (9.6%) 62 (8.8%) 178 (9.2%)
hlt B.1.1.1 56 (9.2%) 60 (9.6%) 62 (8.8%) 178 (9.2%)
dcd B.1.1.1.1 56 (100.0%) 60 (100.0%) 62 (100.0%) 178 (100.0%)
cl B.2 129 (21.2%) 138 (22.2%) 143 (20.3%) 410 (21.2%)
hlgt B.2.1 65 (10.7%) 62 (10.0%) 66 (9.4%) 193 (10.0%)
hlt B.2.1.2 65 (10.7%) 62 (10.0%) 66 (9.4%) 193 (10.0%)
dcd B.2.1.2.1 65 (100.0%) 62 (100.0%) 66 (100.0%) 193 (100.0%)
hlgt B.2.2 64 (10.5%) 76 (12.2%) 77 (11.0%) 217 (11.2%)
hlt B.2.2.3 64 (10.5%) 76 (12.2%) 77 (11.0%) 217 (11.2%)
dcd B.2.2.3.1 64 (100.0%) 76 (100.0%) 77 (100.0%) 217 (100.0%)
cl C.1 55 (9.0%) 63 (10.1%) 64 (9.1%) 182 (9.4%)
hlgt C.1.1 55 (9.0%) 63 (10.1%) 64 (9.1%) 182 (9.4%)
hlt C.1.1.1 55 (9.0%) 63 (10.1%) 64 (9.1%) 182 (9.4%)
dcd C.1.1.1.3 55 (100.0%) 63 (100.0%) 64 (100.0%) 182 (100.0%)
cl C.2 48 (7.9%) 53 (8.5%) 65 (9.2%) 166 (8.6%)
hlgt C.2.1 48 (7.9%) 53 (8.5%) 65 (9.2%) 166 (8.6%)
hlt C.2.1.2 48 (7.9%) 53 (8.5%) 65 (9.2%) 166 (8.6%)
dcd C.2.1.2.1 48 (100.0%) 53 (100.0%) 65 (100.0%) 166 (100.0%)
cl D.1 127 (20.9%) 106 (17.0%) 135 (19.2%) 368 (19.0%)
hlgt D.1.1 127 (20.9%) 106 (17.0%) 135 (19.2%) 368 (19.0%)
hlt D.1.1.1 61 (10.0%) 51 (8.2%) 71 (10.1%) 183 (9.5%)
dcd D.1.1.1.1 61 (100.0%) 51 (100.0%) 71 (100.0%) 183 (100.0%)
hlt D.1.1.4 66 (10.8%) 55 (8.8%) 64 (9.1%) 185 (9.6%)
dcd D.1.1.4.2 66 (100.0%) 55 (100.0%) 64 (100.0%) 185 (100.0%)
cl D.2 62 (10.2%) 72 (11.6%) 74 (10.5%) 208 (10.8%)
hlgt D.2.1 62 (10.2%) 72 (11.6%) 74 (10.5%) 208 (10.8%)
hlt D.2.1.5 62 (10.2%) 72 (11.6%) 74 (10.5%) 208 (10.8%)
dcd D.2.1.5.3 62 (100.0%) 72 (100.0%) 74 (100.0%) 208 (100.0%)
Now for Shiny when I convert this using as_html(tbl)
indentation for middle level is messed up.
HTML code output
<div class="rtables-all-parts-block rtables-container">
<div class="rtables-titles-block rtables-container">
<div class="rtables-main-titles-block rtables-container">
<p class="rtables-main-title"></p>
</div>
<div class="rtables-subtitles-block rtables-container"></div>
</div>
<table class="table table-condensed table-hover">
<tr style="white-space: pre;">
<th style="text-align: left;">AEBODSYS</th>
<th style="text-align: center;"></th>
<th style="text-align: center;"></th>
<th style="text-align: center;"></th>
<th style="text-align: center;"></th>
</tr>
<tr style="white-space: pre;">
<th style="text-align: left;"> AEHLGT</th>
<th style="text-align: center;">A: Drug X</th>
<th style="text-align: center;">B: Placebo</th>
<th style="text-align: center;">C: Combination</th>
<th style="text-align: center;">Overall</th>
</tr>
<tr style="white-space: pre;">
<th style="text-align: left; border-bottom: 1px solid black; border-bottom: 1px solid black;"> AEHLT</th>
<th style="text-align: center; border-bottom: 1px solid black;">(N=609)</th>
<th style="text-align: center; border-bottom: 1px solid black;">(N=622)</th>
<th style="text-align: center; border-bottom: 1px solid black;">(N=703)</th>
<th style="text-align: center; border-bottom: 1px solid black;">(N=1934)</th>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left;">cl A.1</td>
<td style="text-align: center;">132 (21.7%)</td>
<td style="text-align: center;">130 (20.9%)</td>
<td style="text-align: center;">160 (22.8%)</td>
<td style="text-align: center;">422 (21.8%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left;"> hlgt A.1.1</td>
<td style="text-align: center;">132 (21.7%)</td>
<td style="text-align: center;">130 (20.9%)</td>
<td style="text-align: center;">160 (22.8%)</td>
<td style="text-align: center;">422 (21.8%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 3ch;"> hlt A.1.1.1</td>
<td style="text-align: center;">132 (21.7%)</td>
<td style="text-align: center;">130 (20.9%)</td>
<td style="text-align: center;">160 (22.8%)</td>
<td style="text-align: center;">422 (21.8%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 6ch;"> dcd A.1.1.1.1</td>
<td style="text-align: center;">64 (48.5%)</td>
<td style="text-align: center;">62 (47.7%)</td>
<td style="text-align: center;">88 (55.0%)</td>
<td style="text-align: center;">214 (50.7%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 9ch;"> dcd A.1.1.1.2</td>
<td style="text-align: center;">68 (51.5%)</td>
<td style="text-align: center;">68 (52.3%)</td>
<td style="text-align: center;">72 (45.0%)</td>
<td style="text-align: center;">208 (49.3%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 9ch;">cl B.1</td>
<td style="text-align: center;">56 (9.2%)</td>
<td style="text-align: center;">60 (9.6%)</td>
<td style="text-align: center;">62 (8.8%)</td>
<td style="text-align: center;">178 (9.2%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left;"> hlgt B.1.1</td>
<td style="text-align: center;">56 (9.2%)</td>
<td style="text-align: center;">60 (9.6%)</td>
<td style="text-align: center;">62 (8.8%)</td>
<td style="text-align: center;">178 (9.2%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 3ch;"> hlt B.1.1.1</td>
<td style="text-align: center;">56 (9.2%)</td>
<td style="text-align: center;">60 (9.6%)</td>
<td style="text-align: center;">62 (8.8%)</td>
<td style="text-align: center;">178 (9.2%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 6ch;"> dcd B.1.1.1.1</td>
<td style="text-align: center;">56 (100.0%)</td>
<td style="text-align: center;">60 (100.0%)</td>
<td style="text-align: center;">62 (100.0%)</td>
<td style="text-align: center;">178 (100.0%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 9ch;">cl B.2</td>
<td style="text-align: center;">129 (21.2%)</td>
<td style="text-align: center;">138 (22.2%)</td>
<td style="text-align: center;">143 (20.3%)</td>
<td style="text-align: center;">410 (21.2%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left;"> hlgt B.2.1</td>
<td style="text-align: center;">65 (10.7%)</td>
<td style="text-align: center;">62 (10.0%)</td>
<td style="text-align: center;">66 (9.4%)</td>
<td style="text-align: center;">193 (10.0%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 3ch;"> hlt B.2.1.2</td>
<td style="text-align: center;">65 (10.7%)</td>
<td style="text-align: center;">62 (10.0%)</td>
<td style="text-align: center;">66 (9.4%)</td>
<td style="text-align: center;">193 (10.0%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 6ch;"> dcd B.2.1.2.1</td>
<td style="text-align: center;">65 (100.0%)</td>
<td style="text-align: center;">62 (100.0%)</td>
<td style="text-align: center;">66 (100.0%)</td>
<td style="text-align: center;">193 (100.0%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 9ch;"> hlgt B.2.2</td>
<td style="text-align: center;">64 (10.5%)</td>
<td style="text-align: center;">76 (12.2%)</td>
<td style="text-align: center;">77 (11.0%)</td>
<td style="text-align: center;">217 (11.2%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 3ch;"> hlt B.2.2.3</td>
<td style="text-align: center;">64 (10.5%)</td>
<td style="text-align: center;">76 (12.2%)</td>
<td style="text-align: center;">77 (11.0%)</td>
<td style="text-align: center;">217 (11.2%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 6ch;"> dcd B.2.2.3.1</td>
<td style="text-align: center;">64 (100.0%)</td>
<td style="text-align: center;">76 (100.0%)</td>
<td style="text-align: center;">77 (100.0%)</td>
<td style="text-align: center;">217 (100.0%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 9ch;">cl C.1</td>
<td style="text-align: center;">55 (9.0%)</td>
<td style="text-align: center;">63 (10.1%)</td>
<td style="text-align: center;">64 (9.1%)</td>
<td style="text-align: center;">182 (9.4%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left;"> hlgt C.1.1</td>
<td style="text-align: center;">55 (9.0%)</td>
<td style="text-align: center;">63 (10.1%)</td>
<td style="text-align: center;">64 (9.1%)</td>
<td style="text-align: center;">182 (9.4%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 3ch;"> hlt C.1.1.1</td>
<td style="text-align: center;">55 (9.0%)</td>
<td style="text-align: center;">63 (10.1%)</td>
<td style="text-align: center;">64 (9.1%)</td>
<td style="text-align: center;">182 (9.4%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 6ch;"> dcd C.1.1.1.3</td>
<td style="text-align: center;">55 (100.0%)</td>
<td style="text-align: center;">63 (100.0%)</td>
<td style="text-align: center;">64 (100.0%)</td>
<td style="text-align: center;">182 (100.0%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 9ch;">cl C.2</td>
<td style="text-align: center;">48 (7.9%)</td>
<td style="text-align: center;">53 (8.5%)</td>
<td style="text-align: center;">65 (9.2%)</td>
<td style="text-align: center;">166 (8.6%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left;"> hlgt C.2.1</td>
<td style="text-align: center;">48 (7.9%)</td>
<td style="text-align: center;">53 (8.5%)</td>
<td style="text-align: center;">65 (9.2%)</td>
<td style="text-align: center;">166 (8.6%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 3ch;"> hlt C.2.1.2</td>
<td style="text-align: center;">48 (7.9%)</td>
<td style="text-align: center;">53 (8.5%)</td>
<td style="text-align: center;">65 (9.2%)</td>
<td style="text-align: center;">166 (8.6%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 6ch;"> dcd C.2.1.2.1</td>
<td style="text-align: center;">48 (100.0%)</td>
<td style="text-align: center;">53 (100.0%)</td>
<td style="text-align: center;">65 (100.0%)</td>
<td style="text-align: center;">166 (100.0%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 9ch;">cl D.1</td>
<td style="text-align: center;">127 (20.9%)</td>
<td style="text-align: center;">106 (17.0%)</td>
<td style="text-align: center;">135 (19.2%)</td>
<td style="text-align: center;">368 (19.0%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left;"> hlgt D.1.1</td>
<td style="text-align: center;">127 (20.9%)</td>
<td style="text-align: center;">106 (17.0%)</td>
<td style="text-align: center;">135 (19.2%)</td>
<td style="text-align: center;">368 (19.0%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 3ch;"> hlt D.1.1.1</td>
<td style="text-align: center;">61 (10.0%)</td>
<td style="text-align: center;">51 (8.2%)</td>
<td style="text-align: center;">71 (10.1%)</td>
<td style="text-align: center;">183 (9.5%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 6ch;"> dcd D.1.1.1.1</td>
<td style="text-align: center;">61 (100.0%)</td>
<td style="text-align: center;">51 (100.0%)</td>
<td style="text-align: center;">71 (100.0%)</td>
<td style="text-align: center;">183 (100.0%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 9ch;"> hlt D.1.1.4</td>
<td style="text-align: center;">66 (10.8%)</td>
<td style="text-align: center;">55 (8.8%)</td>
<td style="text-align: center;">64 (9.1%)</td>
<td style="text-align: center;">185 (9.6%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 6ch;"> dcd D.1.1.4.2</td>
<td style="text-align: center;">66 (100.0%)</td>
<td style="text-align: center;">55 (100.0%)</td>
<td style="text-align: center;">64 (100.0%)</td>
<td style="text-align: center;">185 (100.0%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 9ch;">cl D.2</td>
<td style="text-align: center;">62 (10.2%)</td>
<td style="text-align: center;">72 (11.6%)</td>
<td style="text-align: center;">74 (10.5%)</td>
<td style="text-align: center;">208 (10.8%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left;"> hlgt D.2.1</td>
<td style="text-align: center;">62 (10.2%)</td>
<td style="text-align: center;">72 (11.6%)</td>
<td style="text-align: center;">74 (10.5%)</td>
<td style="text-align: center;">208 (10.8%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 3ch;"> hlt D.2.1.5</td>
<td style="text-align: center;">62 (10.2%)</td>
<td style="text-align: center;">72 (11.6%)</td>
<td style="text-align: center;">74 (10.5%)</td>
<td style="text-align: center;">208 (10.8%)</td>
</tr>
<tr style="white-space: pre;">
<td style="text-align: left; padding-left: 6ch;"> dcd D.2.1.5.3</td>
<td style="text-align: center;">62 (100.0%)</td>
<td style="text-align: center;">72 (100.0%)</td>
<td style="text-align: center;">74 (100.0%)</td>
<td style="text-align: center;">208 (100.0%)</td>
</tr>
<caption style="caption-side: top;"></caption>
</table>
<div class="rtables-footers-block rtables-container"></div>
</div>
Upvotes: 1
Views: 58
Reputation: 1204
The issue is solved in newer versions of {rtables}. There is a safer option that is using {flextable} export as an intermediary. We created {rtables.officer} to deal with more complex customizations, by leveraging {flextable} features. Take a look here: https://github.com/insightsengineering/rtables.officer
Here your table made with the html theme (you can create your own, NULL
is basic {rtables})
library(rtables)
library(rtables.officer)
library(tern)
adae_A <- ex_adae
tbl <- basic_table() %>%
split_cols_by("ARM") %>%
split_rows_by(
"AEBODSYS",
split_fun = trim_levels_in_group("AEHLGT"),
split_label = "AEBODSYS",
label_pos = "topleft"
) %>%
rtables::summarize_row_groups() %>%
split_rows_by(
"AEHLGT",
split_fun = trim_levels_in_group("AEHLT"),
split_label = "AEHLGT",
label_pos = "topleft"
) %>% rtables::summarize_row_groups() %>%
split_rows_by("AEHLT", split_label = "AEHLT", label_pos = "topleft") %>%
rtables::summarize_row_groups() %>%
add_colcounts() %>%
add_overall_col("Overall") %>% tern::analyze_vars(
vars = c("AEDECOD"),
var_labels = c("AEDECOD"),
.stats = c("count_fraction"),
.labels = c(count_fraction = "n (%)"),
.formats = c(count_fraction = "xx (xx.x%)")
) %>%
build_table(adae_A) %>% prune_table(prune_zeros_only)
rtables.officer::tt_to_flextable(tbl, theme = rtables.officer::theme_html_default)
Upvotes: 0