admiral icon indicating copy to clipboard operation
admiral copied to clipboard

Bug: `derive_param_wbc_abs()` doesn't handle environments properly

Open manciniedoardo opened this issue 6 months ago • 4 comments

What happened?

A user at Roche called derive_param_wbc_abs() from within a wrapper function, and tried to pass to the former some objects defined only within the wrapper function. However, these objects were not recognised by derive_param_wbc_abs().

I think it's the same sort of error that we encountered and fixed for slice_derivation() and call_derivation() in #2244, it's symptomatic of poor environment handling by some of the {admiral} functions. We should probably do a more thorough review of the {admiral} codebase to identify other cases where this occurs, and proactively fix them.

Session Information

sessionInfo() R version 4.3.3 (2024-02-29) Platform: x86_64-pc-linux-gnu (64-bit) Running under: Ubuntu 22.04.4 LTS

Matrix products: default BLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0

locale: [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

time zone: Etc/UTC tzcode source: system (glibc)

attached base packages: [1] stats graphics grDevices utils datasets methods
[7] base

other attached packages: [1] admiral_1.1.1.9004 tibble_3.2.1

loaded via a namespace (and not attached): [1] tidyr_1.3.1 utf8_1.2.4 R6_2.5.1
[4] lubridate_1.9.3 tidyselect_1.2.1 magrittr_2.0.3
[7] glue_1.7.0 stringr_1.5.1 pkgconfig_2.0.3
[10] timechange_0.3.0 generics_0.1.3 dplyr_1.1.4
[13] lifecycle_1.0.4 cli_3.6.2 fansi_1.0.6
[16] vctrs_0.6.5 withr_3.0.0 compiler_4.3.3
[19] admiraldev_1.1.0.9001 purrr_1.0.2 rstudioapi_0.16.0
[22] tools_4.3.3 hms_1.1.3 pillar_1.9.0
[25] rlang_1.1.3 stringi_1.8.3

Reproducible Example

This should work but does not:

library(tibble)
library(admiral)

test_lb <- tribble(
  ~USUBJID, ~PARAMCD, ~AVAL, ~PARAM, ~VISIT,
  "P01", "WBC", 33, "Leukocyte Count (10^9/L)", "CYCLE 1 DAY 1",
  "P01", "WBC", 38, "Leukocyte Count (10^9/L)", "CYCLE 2 DAY 1",
  "P01", "LYMLE", 0.90, "Lymphocytes (fraction of 1)", "CYCLE 1 DAY 1",
  "P01", "LYMLE", 0.70, "Lymphocytes (fraction of 1)", "CYCLE 2 DAY 1"
)

my_fn <- function(data_in){
  
  std_ranges <- tibble(
    ANRLO_LYMPHLS = 1,
    ANRHI_LYMPHLS = 4.8
  )
  
  derive_param_wbc_abs(
    dataset = data_in,
    by_vars = exprs(USUBJID, VISIT),
    set_values_to = exprs(
      PARAMCD = "LYMPH",
      PARAM = "Lymphocytes Abs (10^9/L)",
      DTYPE = "CALCULATION",
      ANRLO = std_ranges$ANRLO_LYMPHLS,
      ANRHI = std_ranges$ANRHI_LYMPHLS,
    ),
    get_unit_expr = extract_unit(PARAM),
    wbc_code = "WBC",
    diff_code = "LYMLE",
    diff_type = "fraction"
  )
}

my_fn(test_lb)

But it does work if you unravel the dummy function my_fn().

manciniedoardo avatar Aug 08 '24 10:08 manciniedoardo