pharmaverse / pharmaverse/rtables

[Bug]: usage of top_level_section_div in a layout applied to a zero rows dataset fails

Open
#1,079 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
R
Stars
260
Forks
53
PR merge metrics
No merged PRs in 30d

Description

Following reprex illustrates the failure to use build_table using a zero row input dataframe and a layout that includes option top_level_section_div = " ".

library(rtables)
#> Loading required package: formatters
#> 
#> Attaching package: 'formatters'
#> The following object is masked from 'package:base':
#> 
#>     %||%
#> Loading required package: magrittr
#> 
#> Attaching package: 'rtables'
#> The following object is masked from 'package:utils':
#> 
#>     str
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

packageVersion("rtables")
#> [1] '0.6.13'

adsl <- ex_adsl
adae <- ex_adae |> 
  mutate(TRTEMFL = "Y") |> 
  mutate(TRTEMFL = factor(TRTEMFL))

adae2 <- adae[0, ]

my_layout <- function(top_level_section_div = TRUE){
  if (top_level_section_div) {
    lyt_part1 <- basic_table(
      top_level_section_div = " ",
      show_colcounts = TRUE,
      colcount_format = "N=xx"
    ) 
  } else {
    lyt_part1 <- basic_table(
      show_colcounts = TRUE,
      colcount_format = "N=xx"
    )}
  
  lyt_part2 <- lyt_part1 |> 
    split_cols_by("ARM") |> 
    analyze("TRTEMFL")  %>%
    split_rows_by("AEBODSYS",
                  split_label = "System Organ Class",
                  split_fun = trim_levels_in_group("AEDECOD"),
                  label_pos = "topleft",
                  section_div = c(" "),
                  nested = FALSE
    ) %>%
    summarize_row_groups("AEBODSYS") %>%
    analyze("AEDECOD") %>%
    append_topleft("  Preferred Term, n (%)")
  
  lyt_part2
}

lyt_1 <- my_layout(top_level_section_div = FALSE)
lyt_2 <- my_layout(top_level_section_div = TRUE)

# a non-zero rows dataset can be used in both layouts
build_table(lyt_1, adae, adsl)
#> System Organ Class         A: Drug X     B: Placebo    C: Combination
#>   Preferred Term, n (%)      N=134         N=134           N=132     
#> —————————————————————————————————————————————————————————————————————
#> Y                             609           622             703      
#> cl A.1                    132 (98.5%)   130 (97.0%)     160 (121.2%) 
#>   dcd A.1.1.1.1               64             62              88      
#>   dcd A.1.1.1.2               68             68              72      
#>                                                                      
#> cl B.1                    56 (41.8%)     60 (44.8%)      62 (47.0%)  
#>   dcd B.1.1.1.1               56             60              62      
#>                                                                      
#> cl B.2                    129 (96.3%)   138 (103.0%)    143 (108.3%) 
#>   dcd B.2.1.2.1               65             62              66      
#>   dcd B.2.2.3.1               64             76              77      
#>                                                                      
#> cl C.1                    55 (41.0%)     63 (47.0%)      64 (48.5%)  
#>   dcd C.1.1.1.3               55             63              64      
#>                                                                      
#> cl C.2                    48 (35.8%)     53 (39.6%)      65 (49.2%)  
#>   dcd C.2.1.2.1               48             53              65      
#>                                                                      
#> cl D.1                    127 (94.8%)   106 (79.1%)     135 (102.3%) 
#>   dcd D.1.1.1.1               61             51              71      
#>   dcd D.1.1.4.2               66             55              64      
#>                                                                      
#> cl D.2                    62 (46.3%)     72 (53.7%)      74 (56.1%)  
#>   dcd D.2.1.5.3               62             72              74
build_table(lyt_2, adae, adsl)
#> System Organ Class         A: Drug X     B: Placebo    C: Combination
#>   Preferred Term, n (%)      N=134         N=134           N=132     
#> —————————————————————————————————————————————————————————————————————
#> Y                             609           622             703      
#>                                                                      
#> cl A.1                    132 (98.5%)   130 (97.0%)     160 (121.2%) 
#>   dcd A.1.1.1.1               64             62              88      
#>   dcd A.1.1.1.2               68             68              72      
#>                                                                      
#> cl B.1                    56 (41.8%)     60 (44.8%)      62 (47.0%)  
#>   dcd B.1.1.1.1               56             60              62      
#>                                                                      
#> cl B.2                    129 (96.3%)   138 (103.0%)    143 (108.3%) 
#>   dcd B.2.1.2.1               65             62              66      
#>   dcd B.2.2.3.1               64             76              77      
#>                                                                      
#> cl C.1                    55 (41.0%)     63 (47.0%)      64 (48.5%)  
#>   dcd C.1.1.1.3               55             63              64      
#>                                                                      
#> cl C.2                    48 (35.8%)     53 (39.6%)      65 (49.2%)  
#>   dcd C.2.1.2.1               48             53              65      
#>                                                                      
#> cl D.1                    127 (94.8%)   106 (79.1%)     135 (102.3%) 
#>   dcd D.1.1.1.1               61             51              71      
#>   dcd D.1.1.4.2               66             55              64      
#>                                                                      
#> cl D.2                    62 (46.3%)     72 (53.7%)      74 (56.1%)  
#>   dcd D.2.1.5.3               62             72              74

# no issue with a zero row input dataset for layout without top_level_section_div
build_table(lyt_1, adae2, adsl)
#> System Organ Class        A: Drug X   B: Placebo   C: Combination
#>   Preferred Term, n (%)     N=134       N=134          N=132     
#> —————————————————————————————————————————————————————————————————
#> Y                             0           0              0
# issue with a zero row input dataset for layout with top_level_section_div
build_table(lyt_2, adae2, adsl)
#> Error in ret$sect_div_from_path[[nrow(ret)]] <- path: attempt to select less than one element in OneIndex

Created on 2026-03-17 with reprex v2.1.1

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the failure with build_table(lyt_2, adae2, adsl), using the zero-row adae2 dataset and the layout configured with top_level_section_div. Trace build_table and the handling of section divisions for an empty result. Done means the call completes without the OneIndex error and the existing non-empty behavior remains intact.

Written by the indexing model from the issue text.

Assessment

Tech stack
r
Domain
data
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.