From 7d2ca7e859da357e468bf21dae299a8c87864ead Mon Sep 17 00:00:00 2001 From: osenan Date: Thu, 9 Jul 2026 11:55:15 +0200 Subject: [PATCH 1/4] refactor: do not use S3 dispatch --- NAMESPACE | 2 +- R/tm_g_events_term_id.R | 128 +++++++---- R/tm_g_events_term_id_picks.R | 407 ---------------------------------- 3 files changed, 84 insertions(+), 453 deletions(-) delete mode 100644 R/tm_g_events_term_id_picks.R diff --git a/NAMESPACE b/NAMESPACE index 18f3d101..8ab49e5e 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -7,8 +7,8 @@ export(srv_g_decorate) export(tm_g_ae_oview) export(tm_g_ae_sub) export(tm_g_butterfly) +export(tm_g_event_term_id) export(tm_g_events_term_id) -export(tm_g_events_term_id.picks) export(tm_g_heat_bygrade) export(tm_g_patient_profile) export(tm_g_spiderplot) diff --git a/R/tm_g_events_term_id.R b/R/tm_g_events_term_id.R index 6d4db895..08610eb2 100644 --- a/R/tm_g_events_term_id.R +++ b/R/tm_g_events_term_id.R @@ -5,11 +5,17 @@ #' @inheritParams teal.widgets::standard_layout #' @inheritParams teal::module #' @inheritParams argument_convention -#' @param term_var (`picks`)\cr -#' [teal.picks::picks()] object for the event term variable (single selection). -#' @param arm_var (`picks`)\cr -#' [teal.picks::picks()] object for the treatment arm variable (single selection). -#' The arm variable must be a factor in the analysis data. +#' @param term_dataname optional (`character(1)`) dataset name used to initialize +#' `term_var` when provided as [teal.picks::variables()] or a legacy +#' `choices_selected` object. +#' @param term_var Either [teal.picks::variables()] (preferred) or a legacy +#' `choices_selected`-style object for the event term variable (single selection). +#' @param arm_dataname optional (`character(1)`) dataset name used to initialize +#' `arm_var` when provided as [teal.picks::variables()] or a legacy +#' `choices_selected` object. +#' @param arm_var Either [teal.picks::variables()] (preferred) or a legacy +#' `choices_selected`-style object for the treatment arm variable (single selection). +#' The selected arm variable must be a factor in the analysis data. #' #' @inherit argument_convention return #' @inheritSection teal::example_module Reporting @@ -31,21 +37,17 @@ #' app <- init( #' data = data, #' modules = modules( -#' tm_g_events_term_id( +#' tm_g_event_term_id( #' label = "Common AE", -#' term_var = teal.picks::picks( -#' teal.picks::datasets("ADAE"), -#' teal.picks::variables( -#' choices = teal.picks::is_categorical(min.len = 2), -#' selected = "AEDECOD" -#' ) +#' term_dataname = "ADAE", +#' term_var = variables( +#' choices = is_categorical(min.len = 2), +#' selected = "AEDECOD" #' ), -#' arm_var = teal.picks::picks( -#' teal.picks::datasets("ADSL"), -#' teal.picks::variables( -#' choices = teal.picks::is_categorical(min.len = 2), -#' selected = "ACTARMCD" -#' ) +#' arm_dataname = "ADSL", +#' arm_var = variables( +#' choices = is_categorical(min.len = 2), +#' selected = "ACTARMCD" #' ), #' plot_height = c(600, 200, 2000) #' ) @@ -55,38 +57,45 @@ #' shinyApp(app$ui, app$server) #' } #' -tm_g_events_term_id <- function(label = "Common AE", - term_var = teal.picks::picks( - teal.picks::datasets(), - teal.picks::variables( - choices = teal.picks::is_categorical(min.len = 2), - selected = 1L - ) - ), - arm_var = teal.picks::picks( - teal.picks::datasets(), - teal.picks::variables( - choices = teal.picks::is_categorical(min.len = 2), - selected = 1L - ) - ), - fontsize = c(5, 3, 7), - plot_height = c(600L, 200L, 2000L), - plot_width = NULL, - transformators = list()) { +#' @export +tm_g_event_term_id <- function(label = "Common AE", + term_dataname = NULL, + term_var = teal.picks::variables( + choices = teal.picks::is_categorical(min.len = 2), + selected = 1L + ), + arm_dataname = NULL, + arm_var = teal.picks::variables( + choices = teal.picks::is_categorical(min.len = 2), + selected = 1L + ), + fontsize = c(5, 3, 7), + plot_height = c(600L, 200L, 2000L), + plot_width = NULL, + transformators = list()) { + message("Initializing tm_g_event_term_id") checkmate::assert_string(label) + checkmate::assert_string(term_dataname, null.ok = TRUE) + checkmate::assert_string(arm_dataname, null.ok = TRUE) + + term_var <- migrate_choices_selected_to_variables(term_var, arg_name = "term_var", multiple = FALSE) + arm_var <- migrate_choices_selected_to_variables(arm_var, arg_name = "arm_var", multiple = FALSE) - checkmate::assert_class(term_var, "picks", .var.name = "term_var") - checkmate::assert_false( - teal.picks::is_pick_multiple(term_var$variables), - .var.name = "`term_var` must use variables(..., multiple = FALSE)" + term_datasets <- if (is.null(term_dataname)) teal.picks::datasets() else teal.picks::datasets(term_dataname) + arm_datasets <- if (is.null(arm_dataname)) teal.picks::datasets() else teal.picks::datasets(arm_dataname) + + term_var <- create_picks_helper( + term_datasets, + term_var ) - checkmate::assert_class(arm_var, "picks", .var.name = "arm_var") - checkmate::assert_false( - teal.picks::is_pick_multiple(arm_var$variables), - .var.name = "`arm_var` must use variables(..., multiple = FALSE)" + arm_var <- create_picks_helper( + arm_datasets, + arm_var ) + .assert_picks_single_var(term_var, "term_var") + .assert_picks_single_var(arm_var, "arm_var") + checkmate::assert( checkmate::check_number(fontsize, finite = TRUE), checkmate::assert( @@ -123,6 +132,35 @@ tm_g_events_term_id <- function(label = "Common AE", ) } +#' Backward-compatible alias of [tm_g_event_term_id()]. +#' +#' @inheritParams tm_g_event_term_id +#' @inherit tm_g_event_term_id return +#' @export +tm_g_events_term_id <- function(label = "Common AE", + term_var = teal.picks::variables( + choices = teal.picks::is_categorical(min.len = 2), + selected = 1L + ), + arm_var = teal.picks::variables( + choices = teal.picks::is_categorical(min.len = 2), + selected = 1L + ), + fontsize = c(5, 3, 7), + plot_height = c(600L, 200L, 2000L), + plot_width = NULL, + transformators = list()) { + tm_g_event_term_id( + label = label, + term_var = term_var, + arm_var = arm_var, + fontsize = fontsize, + plot_height = plot_height, + plot_width = plot_width, + transformators = transformators + ) +} + #' @keywords internal ui_g_events_term_id <- function(id, term_var, diff --git a/R/tm_g_events_term_id_picks.R b/R/tm_g_events_term_id_picks.R deleted file mode 100644 index b7690129..00000000 --- a/R/tm_g_events_term_id_picks.R +++ /dev/null @@ -1,407 +0,0 @@ -#' @describeIn tm_g_events_term_id [teal.picks::picks()]-based encodings (`picks`). -#' @export -tm_g_events_term_id.picks <- function(label = "Common AE", # nolint: object_name_linter. - dataname = NULL, - term_var = teal.picks::picks( - teal.picks::datasets(), - teal.picks::variables( - choices = teal.picks::is_categorical(min.len = 2), - selected = 1L - ) - ), - arm_var = teal.picks::picks( - teal.picks::datasets(), - teal.picks::variables( - choices = teal.picks::is_categorical(min.len = 2), - selected = 1L - ) - ), - fontsize = c(5, 3, 7), - plot_height = c(600L, 200L, 2000L), - plot_width = NULL, - transformators = list()) { - checkmate::assert_string(label) - - checkmate::assert_class(term_var, "picks", .var.name = "term_var") - checkmate::assert_false( - teal.picks::is_pick_multiple(term_var$variables), - .var.name = "`term_var` must use variables(..., multiple = FALSE)" - ) - checkmate::assert_class(arm_var, "picks", .var.name = "arm_var") - checkmate::assert_false( - teal.picks::is_pick_multiple(arm_var$variables), - .var.name = "`arm_var` must use variables(..., multiple = FALSE)" - ) - - checkmate::assert( - checkmate::check_number(fontsize, finite = TRUE), - checkmate::assert( - combine = "and", - .var.name = "fontsize", - checkmate::check_numeric(fontsize, len = 3, any.missing = FALSE, finite = TRUE), - checkmate::check_numeric(fontsize[1], lower = fontsize[2], upper = fontsize[3]) - ) - ) - checkmate::assert_numeric(plot_height, len = 3, any.missing = FALSE, finite = TRUE) - checkmate::assert_numeric( - plot_height[1], - lower = plot_height[2], upper = plot_height[3], .var.name = "plot_height" - ) - checkmate::assert_numeric(plot_width, len = 3, any.missing = FALSE, null.ok = TRUE, finite = TRUE) - checkmate::assert_numeric( - plot_width[1], - lower = plot_width[2], upper = plot_width[3], null.ok = TRUE, .var.name = "plot_width" - ) - - pick_slots <- list(term_var = term_var, arm_var = arm_var) - all_datanames <- unique( - unlist( - lapply( - pick_slots, - function(p) { - ch <- p$datasets$choices - if (checkmate::test_character(ch, min.len = 1L)) { - return(unique(as.character(ch))) - } - sel <- p$datasets$selected - unique(as.character(unlist(sel, recursive = FALSE, use.names = FALSE))) - } - ), - use.names = FALSE - ) - ) - all_datanames <- all_datanames[nzchar(all_datanames) & !is.na(all_datanames)] - - args <- as.list(environment()) - - module( - label = label, - ui = ui_g_events_term_id_picks, - server = srv_g_events_term_id_picks, - ui_args = args[names(args) %in% names(formals(ui_g_events_term_id_picks))], - server_args = args[names(args) %in% names(formals(srv_g_events_term_id_picks))], - transformators = transformators, - datanames = all_datanames - ) -} - -#' @examples -#' # Using the picks method -#' data <- teal_data() %>% -#' within({ -#' ADSL <- rADSL -#' ADAE <- rADAE -#' }) -#' -#' join_keys(data) <- default_cdisc_join_keys[names(data)] -#' -#' app <- init( -#' data = data, -#' modules = modules( -#' tm_g_events_term_id( -#' label = "Common AE", -#' term_var = teal.picks::picks( -#' teal.picks::datasets("ADAE"), -#' teal.picks::variables( -#' choices = teal.picks::is_categorical(min.len = 2), -#' selected = "AEDECOD" -#' ) -#' ), -#' arm_var = teal.picks::picks( -#' teal.picks::datasets("ADSL"), -#' teal.picks::variables( -#' choices = teal.picks::is_categorical(min.len = 2), -#' selected = "ACTARMCD" -#' ) -#' ), -#' plot_height = c(600, 200, 2000) -#' ) -#' ) -#' ) -#' if (interactive()) { -#' shinyApp(app$ui, app$server) -#' } - -#' @keywords internal -ui_g_events_term_id_picks <- function(id, - term_var, - arm_var, - fontsize) { - ns <- NS(id) - teal.widgets::standard_layout( - output = teal.widgets::white_small_well( - plot_decorate_output(id = ns(NULL)) - ), - encoding = tags$div( - tags$label("Encodings", class = "text-primary"), tags$br(), - tags$div( - tags$label("Term variable"), - teal.picks::picks_ui(id = ns("term_var"), picks = term_var) - ), - tags$div( - tags$label("Arm variable"), - teal.picks::picks_ui(id = ns("arm_var"), picks = arm_var) - ), - selectInput( - ns("arm_ref"), - "Control", - choices = NULL - ), - selectInput( - ns("arm_trt"), - "Treatment", - choices = NULL - ), - teal.widgets::optionalSelectInput( - ns("sort"), - "Sort By", - choices = c( - "Term" = "term", - "Risk Difference" = "riskdiff", - "Mean Risk" = "meanrisk" - ), - selected = NULL - ), - teal.widgets::panel_item( - "Confidence interval settings", - teal.widgets::optionalSelectInput( - ns("diff_ci_method"), - "Method for Difference of Proportions CI", - choices = ci_choices, - selected = ci_choices[1] - ), - teal.widgets::optionalSliderInput( - ns("conf_level"), - "Confidence Level", - min = 0.5, - max = 1, - value = 0.95 - ) - ), - teal.widgets::panel_item( - "Additional plot settings", - teal.widgets::optionalSelectInput( - ns("axis"), - "Axis Side", - choices = c("Left" = "left", "Right" = "right"), - selected = "left" - ), - sliderInput( - ns("raterange"), - "Overall Rate Range", - min = 0, - max = 1, - value = c(0.1, 1), - step = 0.01 - ), - sliderInput( - ns("diffrange"), - "Rate Difference Range", - min = -1, - max = 1, - value = c(-0.5, 0.5), - step = 0.01 - ), - checkboxInput( - ns("reverse"), - "Reverse Order", - value = FALSE - ) - ), - ui_g_decorate( - ns(NULL), - fontsize = fontsize, - titles = "Common AE Table", - footnotes = "" - ) - ) - ) -} - -#' @keywords internal -srv_g_events_term_id_picks <- function(id, - data, - term_var, - arm_var, - plot_height, - plot_width) { - checkmate::assert_class(data, "reactive") - checkmate::assert_class(isolate(data()), "teal_data") - - moduleServer(id, function(input, output, session) { - teal.logger::log_shiny_input_changes(input, namespace = "teal.osprey") - - anl_selectors <- teal.picks::picks_srv( - id = "", - picks = list(term_var = term_var, arm_var = arm_var), - data = data - ) - - data_with_card <- reactive({ - obj <- data() - teal.reporter::teal_card(obj) <- - c( - teal.reporter::teal_card(obj), - teal.reporter::teal_card("## Module's output(s)") - ) - obj - }) - - merged_anl <- teal.picks::merge_srv( - "merge_anl", - data = data_with_card, - selectors = anl_selectors, - output_name = "ANL", - join_fun = "dplyr::inner_join" - ) - - anl_q <- merged_anl$data - merge_vars <- merged_anl$variables - - observeEvent(anl_selectors$arm_var(), - { - arm_selector <- anl_selectors$arm_var() - req(arm_selector) - arm_var_name <- arm_selector$variables$selected - arm_dataset <- arm_selector$datasets$selected - req(arm_var_name, arm_dataset) - - arm_data <- data()[[arm_dataset]] - choices <- levels(arm_data[[arm_var_name]]) - - trt_index <- if (length(choices) == 1L) 1L else 2L - - updateSelectInput( - session, - "arm_ref", - selected = choices[1], - choices = choices - ) - updateSelectInput( - session, - "arm_trt", - selected = choices[trt_index], - choices = choices - ) - }, - ignoreNULL = TRUE - ) - - observeEvent(input$sort, - { - sort <- if (is.null(input$sort)) " " else input$sort - updateTextInput( - session, - "title", - value = sprintf( - "Common AE Table %s", - c( - "term" = "Sorted by Term", - "riskdiff" = "Sorted by Risk Difference", - "meanrisk" = "Sorted by Mean Risk", - " " = "" - )[sort] - ) - ) - }, - ignoreNULL = FALSE - ) - - observeEvent(list(input$diff_ci_method, input$conf_level), { - req(!is.null(input$diff_ci_method) && !is.null(input$conf_level)) - diff_ci_method <- input$diff_ci_method - conf_level <- input$conf_level - updateTextAreaInput( - session, - "foot", - value = sprintf( - "Note: %d%% CI is calculated using %s", - round(conf_level * 100), - name_ci(diff_ci_method) - ) - ) - }) - - decorate_output <- srv_g_decorate( - id = NULL, - plt = plot_r, - plot_height = plot_height, - plot_width = plot_width - ) - font_size <- decorate_output$font_size - pws <- decorate_output$pws - - output_q <- reactive({ - merged_vars <- merge_vars() - validate( - need( - length(merged_vars[["term_var"]]) > 0L, - "Please select a term variable" - ), - need( - length(merged_vars[["arm_var"]]) > 0L, - "Please select an arm variable" - ) - ) - - term_var_name <- merged_vars[["term_var"]][[1L]] - arm_var_name <- merged_vars[["arm_var"]][[1L]] - - arm_selector <- anl_selectors$arm_var() - arm_var_orig <- arm_selector$variables$selected - arm_dataset <- arm_selector$datasets$selected - - qenv <- anl_q() - ANL <- qenv[["ANL"]] - - validate( - need( - is.factor(ANL[[arm_var_name]]), - "Arm Variable must be a factor variable." - ), - need( - input$arm_trt %in% ANL[[arm_var_name]] && input$arm_ref %in% ANL[[arm_var_name]], - "Cannot generate plot. The dataset does not contain subjects from both the control and treatment arms." - ), - need( - !isTRUE(input$arm_trt == input$arm_ref), - "Control and Treatment must be different." - ) - ) - - teal::validate_has_data( - ANL, - min_nrow = 10, - msg = "Analysis data set must have at least 10 data points" - ) - - teal.reporter::teal_card(qenv) <- c(teal.reporter::teal_card(qenv), "### Plot") - - teal.code::eval_code( - qenv, - code = bquote( - plot <- osprey::g_events_term_id( - term = ANL[[.(term_var_name)]], - id = ANL$USUBJID, - arm = ANL[[.(arm_var_name)]], - arm_N = table(.(as.name(arm_dataset))[[.(arm_var_orig)]]), - ref = .(input$arm_ref), - trt = .(input$arm_trt), - sort_by = .(input$sort), - rate_range = .(input$raterange), - diff_range = .(input$diffrange), - reversed = .(input$reverse), - conf_level = .(input$conf_level), - diff_ci_method = .(input$diff_ci_method), - axis_side = .(input$axis), - fontsize = .(font_size()), - draw = TRUE - ) - ) - ) - }) - - plot_r <- reactive(output_q()[["plot"]]) - set_chunk_dims(pws, output_q) - }) -} From c1f209efa0f1ac2349d74ca5cbede2f68f8e477c Mon Sep 17 00:00:00 2001 From: osenan Date: Thu, 9 Jul 2026 13:23:51 +0200 Subject: [PATCH 2/4] chore: fix failing checks --- NAMESPACE | 1 - R/tm_g_events_term_id.R | 173 +++++++++--------- .../test-shinytest2-tm_g_events_term_id.R | 2 +- 3 files changed, 84 insertions(+), 92 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 8ab49e5e..37d44b41 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -7,7 +7,6 @@ export(srv_g_decorate) export(tm_g_ae_oview) export(tm_g_ae_sub) export(tm_g_butterfly) -export(tm_g_event_term_id) export(tm_g_events_term_id) export(tm_g_heat_bygrade) export(tm_g_patient_profile) diff --git a/R/tm_g_events_term_id.R b/R/tm_g_events_term_id.R index 08610eb2..5388fcdb 100644 --- a/R/tm_g_events_term_id.R +++ b/R/tm_g_events_term_id.R @@ -1,6 +1,6 @@ #' Events by Term Plot Teal Module #' -#' Display an events-by-term plot as a Shiny module using [teal.picks::picks()] encodings. +#' Display an events-by-term plot as a Shiny module using [teal.picks::variables()] encodings. #' #' @inheritParams teal.widgets::standard_layout #' @inheritParams teal::module @@ -10,7 +10,7 @@ #' `choices_selected` object. #' @param term_var Either [teal.picks::variables()] (preferred) or a legacy #' `choices_selected`-style object for the event term variable (single selection). -#' @param arm_dataname optional (`character(1)`) dataset name used to initialize +#' @param arm_dataname dataset name used to initialize #' `arm_var` when provided as [teal.picks::variables()] or a legacy #' `choices_selected` object. #' @param arm_var Either [teal.picks::variables()] (preferred) or a legacy @@ -37,16 +37,16 @@ #' app <- init( #' data = data, #' modules = modules( -#' tm_g_event_term_id( +#' tm_g_events_term_id( #' label = "Common AE", #' term_dataname = "ADAE", -#' term_var = variables( -#' choices = is_categorical(min.len = 2), +#' term_var = teal.picks::variables( +#' choices = teal.picks::is_categorical(min.len = 2), #' selected = "AEDECOD" #' ), #' arm_dataname = "ADSL", -#' arm_var = variables( -#' choices = is_categorical(min.len = 2), +#' arm_var = teal.picks::variables( +#' choices = teal.picks::is_categorical(min.len = 2), #' selected = "ACTARMCD" #' ), #' plot_height = c(600, 200, 2000) @@ -58,21 +58,21 @@ #' } #' #' @export -tm_g_event_term_id <- function(label = "Common AE", - term_dataname = NULL, - term_var = teal.picks::variables( - choices = teal.picks::is_categorical(min.len = 2), - selected = 1L - ), - arm_dataname = NULL, - arm_var = teal.picks::variables( - choices = teal.picks::is_categorical(min.len = 2), - selected = 1L - ), - fontsize = c(5, 3, 7), - plot_height = c(600L, 200L, 2000L), - plot_width = NULL, - transformators = list()) { +tm_g_events_term_id <- function(label = "Common AE", + term_dataname = NULL, + term_var = teal.picks::variables( + choices = teal.picks::is_categorical(min.len = 2), + selected = 1L + ), + arm_dataname = NULL, + arm_var = teal.picks::variables( + choices = teal.picks::is_categorical(min.len = 2), + selected = 1L + ), + fontsize = c(5, 3, 7), + plot_height = c(600L, 200L, 2000L), + plot_width = NULL, + transformators = list()) { message("Initializing tm_g_event_term_id") checkmate::assert_string(label) checkmate::assert_string(term_dataname, null.ok = TRUE) @@ -132,35 +132,6 @@ tm_g_event_term_id <- function(label = "Common AE", ) } -#' Backward-compatible alias of [tm_g_event_term_id()]. -#' -#' @inheritParams tm_g_event_term_id -#' @inherit tm_g_event_term_id return -#' @export -tm_g_events_term_id <- function(label = "Common AE", - term_var = teal.picks::variables( - choices = teal.picks::is_categorical(min.len = 2), - selected = 1L - ), - arm_var = teal.picks::variables( - choices = teal.picks::is_categorical(min.len = 2), - selected = 1L - ), - fontsize = c(5, 3, 7), - plot_height = c(600L, 200L, 2000L), - plot_width = NULL, - transformators = list()) { - tm_g_event_term_id( - label = label, - term_var = term_var, - arm_var = arm_var, - fontsize = fontsize, - plot_height = plot_height, - plot_width = plot_width, - transformators = transformators - ) -} - #' @keywords internal ui_g_events_term_id <- function(id, term_var, @@ -372,15 +343,19 @@ srv_g_events_term_id <- function(id, output_q <- reactive({ merged_vars <- merge_vars() - validate( - need( - length(merged_vars[["term_var"]]) > 0L, - "Please select a term variable" - ), - need( - length(merged_vars[["arm_var"]]) > 0L, - "Please select an arm variable" - ) + teal::validate_input( + "term_var", + condition = function(term_var_input) { + length(merged_vars[["term_var"]]) > 0L + }, + message = "Please select a term variable" + ) + teal::validate_input( + "arm_var", + condition = function(arm_var_input) { + length(merged_vars[["arm_var"]]) > 0L + }, + message = "Please select an arm variable" ) term_var_name <- merged_vars[["term_var"]][[1L]] @@ -393,19 +368,27 @@ srv_g_events_term_id <- function(id, qenv <- anl_q() ANL <- qenv[["ANL"]] - validate( - need( - is.factor(ANL[[arm_var_name]]), - "Arm Variable must be a factor variable." - ), - need( - input$arm_trt %in% ANL[[arm_var_name]] && input$arm_ref %in% ANL[[arm_var_name]], - "Cannot generate plot. The dataset does not contain subjects from both the control and treatment arms." - ), - need( - !isTRUE(input$arm_trt == input$arm_ref), - "Control and Treatment must be different." - ) + teal::validate_input( + "arm_var", + condition = function(arm_var_input) { + is.factor(ANL[[arm_var_name]]) + }, + message = "Arm Variable must be a factor variable." + ) + teal::validate_input( + c("arm_trt", "arm_ref"), + condition = function(arm_trt, arm_ref) { + arm_trt %in% ANL[[arm_var_name]] && arm_ref %in% ANL[[arm_var_name]] + }, + message = "Cannot generate plot. The dataset does not contain subjects + from both the control and treatment arms." + ) + teal::validate_input( + c("arm_trt", "arm_ref"), + condition = function(arm_trt, arm_ref) { + !isTRUE(arm_trt == arm_ref) + }, + message = "Control and Treatment must be different." ) teal::validate_has_data( @@ -416,27 +399,37 @@ srv_g_events_term_id <- function(id, teal.reporter::teal_card(qenv) <- c(teal.reporter::teal_card(qenv), "### Plot") - teal.code::eval_code( - qenv, - code = bquote( + arm_ref <- input$arm_ref + arm_trt <- input$arm_trt + sort_by <- input$sort + rate_range <- input$raterange + diff_range <- input$diffrange + reversed <- input$reverse + conf_level <- input$conf_level + diff_ci_method <- input$diff_ci_method + axis_side <- input$axis + fontsize <- font_size() + + within(qenv, + { plot <- osprey::g_events_term_id( - term = ANL[[.(term_var_name)]], + term = ANL[[term_var_name]], id = ANL$USUBJID, - arm = ANL[[.(arm_var_name)]], - arm_N = table(.(as.name(arm_dataset))[[.(arm_var_orig)]]), - ref = .(input$arm_ref), - trt = .(input$arm_trt), - sort_by = .(input$sort), - rate_range = .(input$raterange), - diff_range = .(input$diffrange), - reversed = .(input$reverse), - conf_level = .(input$conf_level), - diff_ci_method = .(input$diff_ci_method), - axis_side = .(input$axis), - fontsize = .(font_size()), + arm = ANL[[arm_var_name]], + arm_N = table(get(arm_dataset)[[arm_var_orig]]), + ref = arm_ref, + trt = arm_trt, + sort_by = sort_by, + rate_range = rate_range, + diff_range = diff_range, + reversed = reversed, + conf_level = conf_level, + diff_ci_method = diff_ci_method, + axis_side = axis_side, + fontsize = fontsize, draw = TRUE ) - ) + } ) }) diff --git a/tests/testthat/test-shinytest2-tm_g_events_term_id.R b/tests/testthat/test-shinytest2-tm_g_events_term_id.R index a9fdb1e3..6450019e 100644 --- a/tests/testthat/test-shinytest2-tm_g_events_term_id.R +++ b/tests/testthat/test-shinytest2-tm_g_events_term_id.R @@ -1,4 +1,4 @@ -create_tm_g_events_term_id_data <- function() { +create_tm_g_events_term_id_data <- function() { # nolint: object_length_linter. data <- within(teal.data::teal_data(), { ADSL <- teal.data::rADSL ADAE <- teal.data::rADAE From 90dea425e6d6bf51de4029ab6eb6018cc7ffdd12 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 Jul 2026 11:27:36 +0000 Subject: [PATCH 3/4] [skip style] [skip vbump] Restyle files --- R/tm_g_events_term_id.R | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/R/tm_g_events_term_id.R b/R/tm_g_events_term_id.R index 5388fcdb..de628d42 100644 --- a/R/tm_g_events_term_id.R +++ b/R/tm_g_events_term_id.R @@ -410,27 +410,25 @@ srv_g_events_term_id <- function(id, axis_side <- input$axis fontsize <- font_size() - within(qenv, - { - plot <- osprey::g_events_term_id( - term = ANL[[term_var_name]], - id = ANL$USUBJID, - arm = ANL[[arm_var_name]], - arm_N = table(get(arm_dataset)[[arm_var_orig]]), - ref = arm_ref, - trt = arm_trt, - sort_by = sort_by, - rate_range = rate_range, - diff_range = diff_range, - reversed = reversed, - conf_level = conf_level, - diff_ci_method = diff_ci_method, - axis_side = axis_side, - fontsize = fontsize, - draw = TRUE - ) - } - ) + within(qenv, { + plot <- osprey::g_events_term_id( + term = ANL[[term_var_name]], + id = ANL$USUBJID, + arm = ANL[[arm_var_name]], + arm_N = table(get(arm_dataset)[[arm_var_orig]]), + ref = arm_ref, + trt = arm_trt, + sort_by = sort_by, + rate_range = rate_range, + diff_range = diff_range, + reversed = reversed, + conf_level = conf_level, + diff_ci_method = diff_ci_method, + axis_side = axis_side, + fontsize = fontsize, + draw = TRUE + ) + }) }) plot_r <- reactive(output_q()[["plot"]]) From d91552a70b35f5e4a61f8da04a06733fa1c73f71 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 Jul 2026 11:31:43 +0000 Subject: [PATCH 4/4] [skip roxygen] [skip vbump] Roxygen Man Pages Auto Update --- man/tm_g_events_term_id.Rd | 76 +++++++++++++++----------------------- 1 file changed, 29 insertions(+), 47 deletions(-) diff --git a/man/tm_g_events_term_id.Rd b/man/tm_g_events_term_id.Rd index e3af6ce8..a0e33b38 100644 --- a/man/tm_g_events_term_id.Rd +++ b/man/tm_g_events_term_id.Rd @@ -1,30 +1,17 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/tm_g_events_term_id.R, -% R/tm_g_events_term_id_picks.R +% Please edit documentation in R/tm_g_events_term_id.R \name{tm_g_events_term_id} \alias{tm_g_events_term_id} -\alias{tm_g_events_term_id.picks} \title{Events by Term Plot Teal Module} \usage{ tm_g_events_term_id( label = "Common AE", - term_var = teal.picks::picks(teal.picks::datasets(), teal.picks::variables(choices = - teal.picks::is_categorical(min.len = 2), selected = 1L)), - arm_var = teal.picks::picks(teal.picks::datasets(), teal.picks::variables(choices = - teal.picks::is_categorical(min.len = 2), selected = 1L)), - fontsize = c(5, 3, 7), - plot_height = c(600L, 200L, 2000L), - plot_width = NULL, - transformators = list() -) - -tm_g_events_term_id.picks( - label = "Common AE", - dataname = NULL, - term_var = teal.picks::picks(teal.picks::datasets(), teal.picks::variables(choices = - teal.picks::is_categorical(min.len = 2), selected = 1L)), - arm_var = teal.picks::picks(teal.picks::datasets(), teal.picks::variables(choices = - teal.picks::is_categorical(min.len = 2), selected = 1L)), + term_dataname = NULL, + term_var = teal.picks::variables(choices = teal.picks::is_categorical(min.len = 2), + selected = 1L), + arm_dataname = NULL, + arm_var = teal.picks::variables(choices = teal.picks::is_categorical(min.len = 2), + selected = 1L), fontsize = c(5, 3, 7), plot_height = c(600L, 200L, 2000L), plot_width = NULL, @@ -35,12 +22,20 @@ tm_g_events_term_id.picks( \item{label}{(\code{character(1)}) Label shown in the navigation item for the module or module group. For \code{modules()} defaults to \code{"root"}. See \code{Details}.} -\item{term_var}{(\code{picks})\cr -\code{\link[teal.picks:picks]{teal.picks::picks()}} object for the event term variable (single selection).} +\item{term_dataname}{optional (\code{character(1)}) dataset name used to initialize +\code{term_var} when provided as \code{\link[teal.picks:variables]{teal.picks::variables()}} or a legacy +\code{choices_selected} object.} + +\item{term_var}{Either \code{\link[teal.picks:variables]{teal.picks::variables()}} (preferred) or a legacy +\code{choices_selected}-style object for the event term variable (single selection).} + +\item{arm_dataname}{dataset name used to initialize +\code{arm_var} when provided as \code{\link[teal.picks:variables]{teal.picks::variables()}} or a legacy +\code{choices_selected} object.} -\item{arm_var}{(\code{picks})\cr -\code{\link[teal.picks:picks]{teal.picks::picks()}} object for the treatment arm variable (single selection). -The arm variable must be a factor in the analysis data.} +\item{arm_var}{Either \code{\link[teal.picks:variables]{teal.picks::variables()}} (preferred) or a legacy +\code{choices_selected}-style object for the treatment arm variable (single selection). +The selected arm variable must be a factor in the analysis data.} \item{fontsize}{(\code{numeric(1)} or \code{numeric(3)})\cr Defines initial possible range of font-size. \code{fontsize} is set for @@ -55,22 +50,13 @@ vector to indicate default value, minimum and maximum values.} \item{transformators}{(\code{list} of \code{teal_transform_module}) that will be applied to transform module's data input. To learn more check \code{vignette("transform-input-data", package = "teal")}.} - -\item{dataname}{(\code{character(1)})\cr -analysis data used in the teal module, needs to be -available in the list passed to the \code{data} argument of \code{\link[teal:init]{teal::init()}}.} } \value{ the \code{\link[teal:module]{teal::module()}} object. } \description{ -Display an events-by-term plot as a Shiny module using \code{\link[teal.picks:picks]{teal.picks::picks()}} encodings. +Display an events-by-term plot as a Shiny module using \code{\link[teal.picks:variables]{teal.picks::variables()}} encodings. } -\section{Functions}{ -\itemize{ -\item \code{tm_g_events_term_id.picks()}: \code{\link[teal.picks:picks]{teal.picks::picks()}}-based encodings (\code{picks}). - -}} \section{Reporting}{ @@ -101,19 +87,15 @@ app <- init( modules = modules( tm_g_events_term_id( label = "Common AE", - term_var = teal.picks::picks( - teal.picks::datasets("ADAE"), - teal.picks::variables( - choices = teal.picks::is_categorical(min.len = 2), - selected = "AEDECOD" - ) + term_dataname = "ADAE", + term_var = teal.picks::variables( + choices = teal.picks::is_categorical(min.len = 2), + selected = "AEDECOD" ), - arm_var = teal.picks::picks( - teal.picks::datasets("ADSL"), - teal.picks::variables( - choices = teal.picks::is_categorical(min.len = 2), - selected = "ACTARMCD" - ) + arm_dataname = "ADSL", + arm_var = teal.picks::variables( + choices = teal.picks::is_categorical(min.len = 2), + selected = "ACTARMCD" ), plot_height = c(600, 200, 2000) )