Skip to content

Export expr in merge_srv#84

Closed
m7pr wants to merge 3 commits into
mainfrom
export_expr
Closed

Export expr in merge_srv#84
m7pr wants to merge 3 commits into
mainfrom
export_expr

Conversation

@m7pr
Copy link
Copy Markdown
Contributor

@m7pr m7pr commented May 12, 2026

so that we can support old code reproduction like

    anl_inputs <- teal.transform::merge_expression_srv(
      datasets = data,
      selector_list = selector_list,
      merge_function = "dplyr::inner_join"
    )
    anl_q <- reactive({
      obj <- data()
      teal.reporter::teal_card(obj) <-
        c(
          teal.reporter::teal_card(obj),
          teal.reporter::teal_card("## Module's output(s)")
        )
      obj %>% teal.code::eval_code(code = as.expression(anl_inputs()$expr))
    })

@m7pr m7pr added the core label May 12, 2026
Comment thread R/module_merge.R
Comment on lines -225 to -234
variables_selected <- shiny::eventReactive(
selectors_unwrapped(),
{
shiny::req(selectors_unwrapped())
lapply(
.merge_summary_list(selectors_unwrapped(), join_keys = teal.data::join_keys(data()))$mapping,
function(selector) unname(selector$variables)
)
}
)
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This variables_selected is a part of this PR #83

@github-actions
Copy link
Copy Markdown
Contributor

badge

Code Coverage Summary

Filename                  Stmts    Miss  Cover    Missing
----------------------  -------  ------  -------  -------------------------------------------------------------
R/as_picks.R                140      21  85.00%   63, 167-171, 182-186, 201-207, 229-231
R/assertion.R                 5       0  100.00%
R/call_utils.R              147      22  85.03%   23-28, 65, 132-138, 259, 279-280, 283-287, 292
R/helpers.R                   9       0  100.00%
R/interaction.R              42       1  97.62%   95
R/module_merge.R            269      10  96.28%   237-240, 276-279, 350, 629
R/module_picks.R            323      23  92.88%   47-53, 72, 109-110, 299-301, 303-307, 441, 490, 528, 540, 548
R/picks.R                   183       1  99.45%   335
R/print.R                    36       2  94.44%   50, 58
R/resolver.R                141      15  89.36%   110-118, 284-289
R/tidyselect-helpers.R       29       0  100.00%
R/tm_merge.R                 54       0  100.00%
R/ui_containers.R            55       0  100.00%
R/zzz.R                       5       5  0.00%    3-11
TOTAL                      1438     100  93.05%

Diff against main

Filename            Stmts    Miss  Cover
----------------  -------  ------  -------
R/module_merge.R      +12      +8  -2.94%
TOTAL                 +12      +8  -0.50%

Results for commit: 4193fb6

Minimum allowed coverage is 80%

♻️ This comment has been updated with latest results

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 12, 2026

Unit Tests Summary

  1 files   11 suites   18s ⏱️
275 tests 261 ✅ 14 💤 0 ❌
410 runs  395 ✅ 15 💤 0 ❌

Results for commit 4193fb6.

♻️ This comment has been updated with latest results.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 12, 2026

Unit Test Performance Difference

Additional test case details
Test Suite $Status$ Time on main $±Time$ Test Case
module_merge 💀 $0.63$ $-0.63$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_anl_can_merge_deep_join_tree_by_pair_keys_and_finds_correct_merge_order
module_merge 💀 $0.12$ $-0.12$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_anl_contains_colnames_with_original_names_when_duplicated_for_the_same_dataset
module_merge 💀 $0.26$ $-0.26$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_anl_contains_selected_colnames_with_original_names_if_selected_from_a_multiple_datasets_and_not_duplicated
module_merge 💀 $0.09$ $-0.09$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_anl_contains_selected_colnames_with_original_names_if_variables_are_selected_from_a_single_dataset
module_merge 💀 $0.25$ $-0.25$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_anl_contains_selected_colnames_with_suffixes_names_if_duplicated_across_datasets
module_merge 💀 $0.12$ $-0.12$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_anl_is_filtered_by_POSIXct_choices_when_values_is_selected
module_merge 💀 $0.19$ $-0.19$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_anl_is_filtered_by_POSIXct_range_when_values_is_selected
module_merge 💀 $0.12$ $-0.12$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_anl_is_filtered_by_date_choices_when_values_is_selected
module_merge 💀 $0.18$ $-0.18$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_anl_is_filtered_by_date_range_when_values_is_selected
module_merge 💀 $0.12$ $-0.12$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_anl_is_filtered_by_factor_variable_when_values_is_selected
module_merge 💀 $0.10$ $-0.10$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_anl_is_filtered_by_logical_variable_when_values_is_selected
module_merge 💀 $0.11$ $-0.11$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_anl_is_filtered_by_numeric_choices_when_values_are_selected
module_merge 💀 $0.19$ $-0.19$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_anl_is_filtered_by_numeric_range_when_values_are_selected
module_merge 💀 $0.08$ $-0.08$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_data_returns_reactive_containing_teal_data_with_object_output_name_
module_merge 💀 $0.23$ $-0.23$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_data_returns_teal_data_with_merged_anl_using_join_fun
module_merge 💀 $0.14$ $-0.14$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_fails_when_selected_from_multiple_datasets_and_no_join_keys_between_selected_datasets
module_merge 💀 $0.06$ $-0.06$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_fails_when_selected_from_multiple_datasets_and_no_join_keys_primary_keys
module_merge 💀 $0.20$ $-0.20$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_fails_when_unresolved_picks_are_passed_to_the_module
module_merge 💀 $0.45$ $-0.45$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_join_keys_are_updated_to_contains_anl_anl_components
module_merge 💀 $0.20$ $-0.20$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_keeps_primary_keys_when_only_1_dataset_is_selected
module_merge 💀 $0.07$ $-0.07$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_keeps_the_filter_when_multiple_selectors_are_from_the_same_dataset_and_variable
module_merge 💀 $0.05$ $-0.05$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_returns_list_with_two_reactives_variables_and_data
module_merge 💀 $0.46$ $-0.46$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_selected_join_keys_across_multiple_datasets_refers_to_the_same_column_in_anl_c_O.O_
module_merge 💀 $0.12$ $-0.12$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_successfully_selects_multiple_variables_with_numeric_and_character_values
module_merge 💀 $0.06$ $-0.06$ merge_srv_returns_list_with_data_teal_data_with_anl_and_variables_selected_anl_variables_variables_returns_reactive_list_named_after_selectors
module_merge 👶 $+0.57$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_anl_can_merge_deep_join_tree_by_pair_keys_and_finds_correct_merge_order
module_merge 👶 $+0.12$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_anl_contains_colnames_with_original_names_when_duplicated_for_the_same_dataset
module_merge 👶 $+0.25$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_anl_contains_selected_colnames_with_original_names_if_selected_from_a_multiple_datasets_and_not_duplicated
module_merge 👶 $+0.09$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_anl_contains_selected_colnames_with_original_names_if_variables_are_selected_from_a_single_dataset
module_merge 👶 $+0.25$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_anl_contains_selected_colnames_with_suffixes_names_if_duplicated_across_datasets
module_merge 👶 $+0.13$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_anl_is_filtered_by_POSIXct_choices_when_values_is_selected
module_merge 👶 $+0.18$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_anl_is_filtered_by_POSIXct_range_when_values_is_selected
module_merge 👶 $+0.12$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_anl_is_filtered_by_date_choices_when_values_is_selected
module_merge 👶 $+0.19$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_anl_is_filtered_by_date_range_when_values_is_selected
module_merge 👶 $+0.12$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_anl_is_filtered_by_factor_variable_when_values_is_selected
module_merge 👶 $+0.11$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_anl_is_filtered_by_logical_variable_when_values_is_selected
module_merge 👶 $+0.11$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_anl_is_filtered_by_numeric_choices_when_values_are_selected
module_merge 👶 $+0.19$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_anl_is_filtered_by_numeric_range_when_values_are_selected
module_merge 👶 $+0.08$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_data_returns_reactive_containing_teal_data_with_object_output_name_
module_merge 👶 $+0.24$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_data_returns_teal_data_with_merged_anl_using_join_fun
module_merge 👶 $+0.15$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_fails_when_selected_from_multiple_datasets_and_no_join_keys_between_selected_datasets
module_merge 👶 $+0.06$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_fails_when_selected_from_multiple_datasets_and_no_join_keys_primary_keys
module_merge 👶 $+0.20$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_fails_when_unresolved_picks_are_passed_to_the_module
module_merge 👶 $+0.46$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_join_keys_are_updated_to_contains_anl_anl_components
module_merge 👶 $+0.08$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_keeps_primary_keys_when_only_1_dataset_is_selected
module_merge 👶 $+0.08$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_keeps_the_filter_when_multiple_selectors_are_from_the_same_dataset_and_variable
module_merge 👶 $+0.05$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_returns_list_with_three_reactives_variables_data_and_expr
module_merge 👶 $+0.42$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_selected_join_keys_across_multiple_datasets_refers_to_the_same_column_in_anl_c_O.O_
module_merge 👶 $+0.25$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_successfully_selects_multiple_variables_with_numeric_and_character_values
module_merge 👶 $+0.06$ merge_srv_returns_list_with_data_teal_data_with_anl_variables_and_expr_variables_returns_reactive_list_named_after_selectors

Results for commit aa92170

♻️ This comment has been updated with latest results.

@osenan
Copy link
Copy Markdown
Contributor

osenan commented May 12, 2026

Here there is an example from teal.modules.clinical

Hey, I am observing an issue which potentially is present in all modules, related with teal.picks::merge_srv. In every merging step of the data, there is a relabeling of the columns that is captured in the reproducible code in main.
Take this app as example:

devtools::load_all()
data <- teal_data()
 data <- within(data, {
   library(teal.modules.clinical)
   library(formatters)
   library(dplyr)
   ADSL <- tmc_ex_adsl
   ADLB <- tmc_ex_adlb %>%
     mutate(
       ONTRTFL = case_when(
         AVISIT %in% c("SCREENING", "BASELINE") ~ "",
         TRUE ~ "Y"
       ) %>% with_label("On Treatment Record Flag")
     )
 })
 join_keys(data) <- default_cdisc_join_keys[names(data)]

 ADSL <- data[["ADSL"]]
 ADLB <- data[["ADLB"]]

 app <- init(
   data = data,
   modules = modules(
     tm_t_abnormality(
       label = "Abnormality Table",
       dataname = "ADLB",
       arm_var = choices_selected(
         choices = variable_choices(ADSL, subset = c("ARM", "ARMCD")),
         selected = "ARM"
       ),
       add_total = FALSE,
       by_vars = choices_selected(
         choices = variable_choices(ADLB, subset = c("LBCAT", "PARAM", "AVISIT")),
         selected = c("LBCAT", "PARAM"),
         keep_order = TRUE
       ),
       baseline_var = choices_selected(
         variable_choices(ADLB, subset = "BNRIND"),
         selected = "BNRIND", fixed = TRUE
       ),
       grade = choices_selected(
         choices = variable_choices(ADLB, subset = "ANRIND"),
         selected = "ANRIND",
         fixed = TRUE
       ),
       abnormal = list(low = "LOW", high = "HIGH"),
       exclude_base_abn = FALSE
     )
   )
 )
 if (interactive()) {
   shinyApp(app$ui, app$server)
 }

If I run the app in main branch, this is the reproducible code:

ADSL <- tmc_ex_adsl
ADCM <- tmc_ex_adcm
stopifnot(rlang::hash(ADSL) == "a5ae18b41288b967988d7c260b5fb4f6") # @linksto ADSL
stopifnot(rlang::hash(ADCM) == "d25d56ea0b515edf76027c33b4a3eea3") # @linksto ADCM
.raw_data <- list2env(list(ADSL = ADSL, ADCM = ADCM))
lockEnvironment(.raw_data) # @linksto .raw_data
ADCM <- dplyr::inner_join(x = ADCM, y = ADSL[, c("STUDYID", "USUBJID"), drop = FALSE], by = c("STUDYID", "USUBJID"))
library(magrittr)
ANL_1 <- ADSL %>% dplyr::select(STUDYID, USUBJID, ARM)
ANL_2 <- ADCM %>% dplyr::select(STUDYID, USUBJID, CMSEQ, ATC1, ATC2, ATC3, ATC4, CMDECOD)
ANL <- ANL_1
ANL <- dplyr::inner_join(ANL, ANL_2, by = c("STUDYID", "USUBJID"))
ANL <- ANL %>% teal.data::col_relabel(ARM = "Description of Planned Arm", CMSEQ = "Sponsor-Defined Identifier", ATC1 = "ATC Level 1 Text", ATC2 = "ATC Level 2 Text", ATC3 = "ATC Level 3 Text", ATC4 = "ATC Level 4 Text", CMDECOD = "Standardized Medication Name")
library(magrittr)
ANL_ADSL_1 <- ADSL %>% dplyr::select(STUDYID, USUBJID, ARM)
ANL_ADSL <- ANL_ADSL_1
ANL_ADSL <- ANL_ADSL %>% teal.data::col_relabel(ARM = "Description of Planned Arm")
anl <- ANL
anl <- anl %>% dplyr::mutate(ARM = droplevels(ARM))
arm_levels <- levels(anl[["ARM"]])
ANL_ADSL <- ANL_ADSL %>% dplyr::filter(ARM %in% arm_levels)
ANL_ADSL <- ANL_ADSL %>% dplyr::mutate(ARM = droplevels(ARM))
anl <- anl %>% tern::df_explicit_na(omit_columns = setdiff(names(anl), c("ATC1", "ATC2", "ATC3", "ATC4", "CMDECOD")))
anl <- anl %>% dplyr::mutate(CMSEQ = as.factor(CMSEQ))
ANL_ADSL <- tern::df_explicit_na(ANL_ADSL, na_level = "<Missing>")
split_fun <- rtables::drop_split_levels
lyt <- rtables::basic_table(title = "Concomitant Medications by ATC Level 1 Text, ATC Level 2 Text, ATC Level 3 Text, ATC Level 4 Text and Standardized Medication Name", show_colcounts = TRUE) %>% rtables::split_cols_by(var = "ARM") %>% rtables::add_overall_col(label = "All Patients") %>% tern::summarize_num_patients(var = "USUBJID", count_by = "CMSEQ", .stats = c("unique", "nonunique"), .labels = c(unique = "Total number of patients with at least one treatment", nonunique = "Total number of treatments")) %>% 
    rtables::split_rows_by("ATC1", child_labels = "visible", nested = FALSE, indent_mod = -1L, split_fun = split_fun, label_pos = "topleft", split_label = teal.data::col_labels(ANL["ATC1"])) %>% rtables::split_rows_by("ATC2", child_labels = "visible", nested = TRUE, indent_mod = 0L, split_fun = split_fun, label_pos = "topleft", split_label = teal.data::col_labels(ANL["ATC2"])) %>% rtables::split_rows_by("ATC3", child_labels = "visible", nested = TRUE, indent_mod = 0L, split_fun = split_fun, label_pos = "topleft", 
    split_label = teal.data::col_labels(ANL["ATC3"])) %>% rtables::split_rows_by("ATC4", child_labels = "visible", nested = TRUE, indent_mod = 0L, split_fun = split_fun, label_pos = "topleft", split_label = teal.data::col_labels(ANL["ATC4"])) %>% tern::summarize_num_patients(var = "USUBJID", count_by = "CMSEQ", .stats = c("unique", "nonunique"), .labels = c(unique = "Total number of patients with at least one treatment", nonunique = "Total number of treatments")) %>% tern::count_occurrences(vars = "CMDECOD", 
    .indent_mods = -1L) %>% tern::append_varlabels(ANL, "CMDECOD", indent = 4L)
result <- rtables::build_table(lyt = lyt, df = anl, alt_counts_df = ANL_ADSL)
sorted_result <- result %>% rtables::sort_at_path(path = c("ATC1", "*", "ATC2", "*", "ATC3", "*", "ATC4", "*", "CMDECOD"), scorefun = tern::score_occurrences)
table <- sorted_result
table

But if I run in branch 279-interactive_variables@main this is the result:

library(teal.modules.clinical)
library(formatters)
library(dplyr)
ADSL <- tmc_ex_adsl
ADLB <- tmc_ex_adlb %>% mutate(ONTRTFL = case_when(AVISIT %in% c("SCREENING", "BASELINE") ~ "", TRUE ~ "Y") %>% with_label("On Treatment Record Flag"))
stopifnot(rlang::hash(ADSL) == "a5ae18b41288b967988d7c260b5fb4f6") # @linksto ADSL
stopifnot(rlang::hash(ADLB) == "f543e0605350d0956874bcd4a7a65324") # @linksto ADLB
.raw_data <- list2env(list(ADSL = ADSL, ADLB = ADLB))
lockEnvironment(.raw_data) # @linksto .raw_data
ADLB <- dplyr::inner_join(x = ADLB, y = ADSL[, c("STUDYID", "USUBJID"), drop = FALSE], by = c("STUDYID", "USUBJID"))
ANL <- dplyr::select(ADSL, STUDYID, USUBJID, ARM) %>% dplyr::inner_join(y = dplyr::select(ADLB, STUDYID, USUBJID, LBCAT, PARAM, ANRIND, BNRIND, ONTRTFL) %>% dplyr::filter(ONTRTFL == "Y"), by = c(STUDYID = "STUDYID", USUBJID = "USUBJID"), suffix = c("", "_ADLB"))
ANL_ADSL <- dplyr::select(ADSL, STUDYID, USUBJID, ARM)
anl <- ANL %>% dplyr::filter(ONTRTFL %in% "Y" & !is.na(ANRIND) & ANRIND != "<Missing>")
anl <- anl %>% dplyr::mutate(ARM = droplevels(ARM))
arm_levels <- levels(anl[["ARM"]])
ANL_ADSL <- ANL_ADSL %>% dplyr::filter(ARM %in% arm_levels)
ANL_ADSL <- ANL_ADSL %>% dplyr::mutate(ARM = droplevels(ARM))
anl <- tern::df_explicit_na(anl, na_level = "<Missing>")
ANL_ADSL <- tern::df_explicit_na(ANL_ADSL, na_level = "<Missing>")
map <- tern::h_map_for_count_abnormal(df = anl, variables = list(anl = "ANRIND", split_rows = c("LBCAT", "PARAM")), abnormal = list(low = "LOW", high = "HIGH"), method = "default", na_str = "<Missing>")
lyt <- rtables::basic_table(show_colcounts = TRUE, title = "Laboratory Abnormality summary by Category for Lab Test, Parameter", main_footer = "Variables without observed abnormalities are excluded.") %>% rtables::split_cols_by(var = "ARM") %>% rtables::split_rows_by("LBCAT", split_label = teal.data::col_labels(ANL, fill = FALSE)[["LBCAT"]], label_pos = "topleft", split_fun = rtables::trim_levels_to_map(map = map)) %>% rtables::split_rows_by("PARAM", split_label = teal.data::col_labels(ANL, fill = FALSE)[["PARAM"]], 
    label_pos = "topleft", split_fun = rtables::trim_levels_to_map(map = map)) %>% tern::count_abnormal(var = "ANRIND", abnormal = list(low = "LOW", high = "HIGH"), variables = list(id = "USUBJID", baseline = "BNRIND"), .indent_mods = 4L, exclude_base_abn = FALSE) %>% tern::append_varlabels(ANL, "ANRIND", indent = 2L)
table <- rtables::build_table(lyt = lyt, df = anl, alt_counts_df = ANL_ADSL) %>% rtables::prune_table()
table

The col relabel is missing

@averissimo
Copy link
Copy Markdown
Contributor

averissimo commented May 12, 2026

@osenan it seems that this is something being done in teal.transform::merge_datasets() and is missing from teal.picks.

image

I don't understand why we need to return the expr if the xx$data() already has the code

edit: See code below, as the code is already executed.

If we need to add report, then we can do that earlier on execution inside the module

shiny::reactiveConsole(TRUE)
on.exit(reactiveConsole(FALSE))
data <- teal.data::teal_data()
data <- within(data, {
  adsl <- data.frame(studyid = "A", usubjid = c("1", "2"), age = c(30, 40))
})
teal.data::join_keys(data) <- teal.data::join_keys(
  teal.data::join_key("adsl", "adsl", c("studyid", "usubjid"))
)

selectors <- list(a = shiny::reactive(picks(datasets("adsl", "adsl"), variables("age", "age"))))
out <- shiny::withReactiveDomain(
  domain = shiny::MockShinySession$new(),
  expr = merge_srv(id = "test", data = shiny::reactive(data), selectors = selectors, output_name = "anl")
)

out$data() |> teal.code::get_code() |> cat()
#> adsl <- data.frame(studyid = "A", usubjid = c("1", "2"), age = c(30, 40))
#> anl <- dplyr::select(adsl, studyid, usubjid, age)
out$expr() |> deparse1() |> cat()
#> [1] "anl <- dplyr::select(adsl, studyid, usubjid, age)"

@m7pr m7pr closed this May 12, 2026
@github-actions github-actions Bot locked and limited conversation to collaborators May 12, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants