Vatsal Garg
Vatsal Garg

Reputation: 11

Converting summary table to HTML having issues with row level grouping indentations in HTML output

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

Answers (1)

Garini
Garini

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

Related Questions