diff --git a/R/argument_convention.R b/R/argument_convention.R index 277ddbb5..f2c73023 100644 --- a/R/argument_convention.R +++ b/R/argument_convention.R @@ -21,9 +21,8 @@ #' names that can be used as `arm_var`. See [teal.transform::choices_selected()] for #' details. Column `arm_var` in the `dataname` has to be a factor. #' -#' @param paramcd (`character(1)` or `choices_selected`)\cr +#' @param paramcd Either a (`[teal.picks::variables()]`) or `choices_selected`)\cr #' variable value designating the studied parameter. -#' See [teal.transform::choices_selected()] for details. #' #' @param fontsize (`numeric(1)` or `numeric(3)`)\cr #' Defines initial possible range of font-size. `fontsize` is set for diff --git a/R/tm_g_spiderplot.R b/R/tm_g_spiderplot.R index c941552e..01e67abc 100644 --- a/R/tm_g_spiderplot.R +++ b/R/tm_g_spiderplot.R @@ -7,31 +7,35 @@ #' @inheritParams teal.widgets::standard_layout #' @inheritParams teal::module #' @inheritParams argument_convention -#' @param x_var x-axis variables -#' @param y_var y-axis variables -#' @param marker_var variable dictates marker symbol -#' @param line_colorby_var variable dictates line color -#' @param vref_line vertical reference lines +#' @param x_var Either a ([`teal.picks::variables()`]) object or a +#' ([`teal.transform::choices_selected`]) `choices_selected` object for x-axis variables. +#' @param y_var Either a ([`teal.picks::variables()`]) object or a +#' ([`teal.transform::choices_selected`]) `choices_selected` object for y-axis variables. +#' @param marker_var Either a ([`teal.picks::variables()`]) object or a +#' ([`teal.transform::choices_selected`]) `choices_selected` object for marker symbol. +#' @param line_colorby_var Either a ([`teal.picks::variables()`]) object or a +#' ([`teal.transform::choices_selected`]) `choices_selected` object for line color. +#' @param vref_line vertical reference lines #' @param href_line horizontal reference lines #' @param anno_txt_var annotation text #' @param legend_on boolean value for whether legend is displayed -#' @param xfacet_var variable for x facets -#' @param yfacet_var variable for y facets +#' @param xfacet_var Either a ([`teal.picks::variables()`]) object or a +#' ([`teal.transform::choices_selected`]) `choices_selected` object for x facets. +#' @param yfacet_var Either a ([`teal.picks::variables()`]) object or a +#' ([`teal.transform::choices_selected`]) `choices_selected` object for y facets. #' #' @inherit argument_convention return #' @inheritSection teal::example_module Reporting -#' @export #' #' @template author_zhanc107 #' @template author_liaoc10 #' #' @examples -#' # Example using stream (ADaM) dataset #' data <- teal_data() %>% #' within({ #' library(nestcolor) -#' ADSL <- rADSL -#' ADTR <- rADTR +#' ADSL <- teal.data::rADSL +#' ADTR <- teal.data::rADTR #' }) #' #' join_keys(data) <- default_cdisc_join_keys[names(data)] @@ -40,33 +44,33 @@ #' data = data, #' modules = modules( #' tm_g_spiderplot( -#' label = "Spider plot", +#' label = "Spider plot (picks)", #' dataname = "ADTR", -#' paramcd = choices_selected( -#' choices = "SLDINV", -#' selected = "SLDINV" +#' paramcd = variables( +#' choices = "PARAMCD", +#' selected = "PARAMCD" #' ), -#' x_var = choices_selected( -#' choices = "ADY", -#' selected = "ADY" +#' x_var = variables( +#' choices = dplyr::where(is.numeric), +#' selected = 1L #' ), -#' y_var = choices_selected( +#' y_var = variables( #' choices = c("PCHG", "CHG", "AVAL"), #' selected = "PCHG" #' ), -#' marker_var = choices_selected( +#' marker_var = variables( #' choices = c("SEX", "RACE", "USUBJID"), #' selected = "SEX" #' ), -#' line_colorby_var = choices_selected( +#' line_colorby_var = variables( #' choices = c("SEX", "USUBJID", "RACE"), #' selected = "SEX" #' ), -#' xfacet_var = choices_selected( +#' xfacet_var = variables( #' choices = c("SEX", "ARM"), #' selected = "SEX" #' ), -#' yfacet_var = choices_selected( +#' yfacet_var = variables( #' choices = c("SEX", "ARM"), #' selected = "ARM" #' ), @@ -79,6 +83,7 @@ #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_g_spiderplot <- function(label, dataname, paramcd, @@ -98,15 +103,45 @@ tm_g_spiderplot <- function(label, post_output = NULL, transformators = list()) { message("Initializing tm_g_spiderplot") - checkmate::assert_class(paramcd, classes = "choices_selected") - checkmate::assert_class(x_var, classes = "choices_selected") - checkmate::assert_class(y_var, classes = "choices_selected") - checkmate::assert_class(marker_var, classes = "choices_selected") - checkmate::assert_class(line_colorby_var, classes = "choices_selected") - checkmate::assert_class(xfacet_var, classes = "choices_selected") - checkmate::assert_class(yfacet_var, classes = "choices_selected") - checkmate::assert_string(vref_line) - checkmate::assert_string(href_line) + checkmate::assert_string(label) + checkmate::assert_string(dataname) + + paramcd <- migrate_choices_selected_to_variables(paramcd) + x_var <- migrate_choices_selected_to_variables(x_var) + y_var <- migrate_choices_selected_to_variables(y_var) + marker_var <- migrate_choices_selected_to_variables(marker_var) + line_colorby_var <- migrate_choices_selected_to_variables(line_colorby_var) + xfacet_var <- migrate_choices_selected_to_variables(xfacet_var, null.ok = TRUE) + yfacet_var <- migrate_choices_selected_to_variables(yfacet_var, null.ok = TRUE) + + paramcd <- create_picks_helper(teal.picks::datasets(dataname, dataname), paramcd) + x_var <- create_picks_helper(teal.picks::datasets(dataname, dataname), x_var) + y_var <- create_picks_helper(teal.picks::datasets(dataname, dataname), y_var) + marker_var <- create_picks_helper(teal.picks::datasets(dataname, dataname), marker_var) + line_colorby_var <- create_picks_helper(teal.picks::datasets(dataname, dataname), line_colorby_var) + if (!is.null(xfacet_var)) { + xfacet_var <- create_picks_helper(teal.picks::datasets(dataname, dataname), xfacet_var) + } + if (!is.null(yfacet_var)) { + yfacet_var <- create_picks_helper(teal.picks::datasets(dataname, dataname), yfacet_var) + } + + paramcd <- force_pick_to_single(paramcd, "paramcd") + x_var <- force_pick_to_single(x_var, "x_var") + y_var <- force_pick_to_single(y_var, "y_var") + marker_var <- force_pick_to_single(marker_var, "marker_var") + line_colorby_var <- force_pick_to_single(line_colorby_var, "line_colorby_var") + + checkmate::assert_class(paramcd, "picks") + checkmate::assert_class(x_var, "picks") + checkmate::assert_class(y_var, "picks") + checkmate::assert_class(marker_var, "picks") + checkmate::assert_class(line_colorby_var, "picks") + checkmate::assert_class(xfacet_var, "picks", null.ok = TRUE) + checkmate::assert_class(yfacet_var, "picks", null.ok = TRUE) + + checkmate::assert_string(vref_line, null.ok = TRUE) + checkmate::assert_string(href_line, null.ok = TRUE) checkmate::assert_flag(anno_txt_var) checkmate::assert_flag(legend_on) checkmate::assert_numeric(plot_height, len = 3, any.missing = FALSE, finite = TRUE) @@ -125,22 +160,29 @@ tm_g_spiderplot <- function(label, label = label, datanames = c("ADSL", dataname), server = srv_g_spider, - server_args = list( - dataname = dataname, - paramcd = paramcd, - label = label, - plot_height = plot_height, - plot_width = plot_width - ), + server_args = args[names(args) %in% names(formals(srv_g_spider))], ui = ui_g_spider, - ui_args = args, + ui_args = args[names(args) %in% names(formals(ui_g_spider))], transformators = transformators ) } -ui_g_spider <- function(id, ...) { +ui_g_spider <- function(id, + dataname, + paramcd, + x_var, + y_var, + marker_var, + line_colorby_var, + xfacet_var, + yfacet_var, + vref_line, + href_line, + anno_txt_var, + legend_on, + pre_output, + post_output) { ns <- NS(id) - a <- list(...) shiny::tagList( teal.widgets::standard_layout( output = teal.widgets::white_small_well( @@ -148,65 +190,55 @@ ui_g_spider <- function(id, ...) { ), encoding = tags$div( tags$label("Encodings", class = "text-primary"), - helpText("Analysis data:", tags$code(a$dataname)), - left_bordered_div( - teal.widgets::optionalSelectInput( - ns("paramcd"), - paste("Parameter - from", a$dataname), - multiple = FALSE - ), - teal.widgets::optionalSelectInput( - ns("x_var"), - "X-axis Variable", - get_choices(a$x_var$choices), - a$x_var$selected, - multiple = FALSE - ), - teal.widgets::optionalSelectInput( - ns("y_var"), - "Y-axis Variable", - get_choices(a$y_var$choices), - a$y_var$selected, - multiple = FALSE - ), - teal.widgets::optionalSelectInput( - ns("line_colorby_var"), - "Color By Variable (Line)", - get_choices(a$line_colorby_var$choices), - a$line_colorby_var$selected, - multiple = FALSE - ), - teal.widgets::optionalSelectInput( - ns("marker_var"), - "Marker Symbol By Variable", - get_choices(a$marker_var$choices), - a$marker_var$selected, - multiple = FALSE - ), - teal.widgets::optionalSelectInput( - ns("xfacet_var"), - "X-facet By Variable", - get_choices(a$xfacet_var$choices), - a$xfacet_var$selected, - multiple = TRUE - ), - teal.widgets::optionalSelectInput( - ns("yfacet_var"), - "Y-facet By Variable", - get_choices(a$yfacet_var$choices), - a$yfacet_var$selected, - multiple = TRUE - ) + helpText("Analysis data:", tags$code(dataname)), + tags$div( + tags$strong("Parameter Column"), + teal.picks::picks_ui(id = ns("paramcd"), picks = paramcd) + ), + teal.widgets::optionalSelectInput( + ns("paramcd_val"), + label = "Parameter Value", + choices = NULL, + selected = NULL, + multiple = FALSE + ), + tags$div( + tags$strong("X-axis Variable"), + teal.picks::picks_ui(id = ns("x_var"), picks = x_var) + ), + tags$div( + tags$strong("Y-axis Variable"), + teal.picks::picks_ui(id = ns("y_var"), picks = y_var) + ), + tags$div( + tags$strong("Color By Variable (Line)"), + teal.picks::picks_ui(id = ns("line_colorby_var"), picks = line_colorby_var) ), + tags$div( + tags$strong("Marker Symbol By Variable"), + teal.picks::picks_ui(id = ns("marker_var"), picks = marker_var) + ), + if (!is.null(xfacet_var)) { + tags$div( + tags$strong("X-facet By Variable"), + teal.picks::picks_ui(id = ns("xfacet_var"), picks = xfacet_var) + ) + }, + if (!is.null(yfacet_var)) { + tags$div( + tags$strong("Y-facet By Variable"), + teal.picks::picks_ui(id = ns("yfacet_var"), picks = yfacet_var) + ) + }, checkboxInput( ns("anno_txt_var"), "Add subject ID label", - value = a$anno_txt_var + value = anno_txt_var ), checkboxInput( ns("legend_on"), "Add legend", - value = a$legend_on + value = legend_on ), textInput( ns("vref_line"), @@ -219,7 +251,7 @@ ui_g_spider <- function(id, ...) { ) ) ), - value = a$vref_line + value = vref_line ), textInput( ns("href_line"), @@ -232,98 +264,116 @@ ui_g_spider <- function(id, ...) { ) ) ), - value = a$href_line + value = href_line ) ), - pre_output = a$pre_output, - post_output = a$post_output + pre_output = pre_output, + post_output = post_output ) ) } -srv_g_spider <- function(id, data, dataname, paramcd, label, plot_height, plot_width) { +srv_g_spider <- function( + id, + data, + dataname, + paramcd, + x_var, + y_var, + marker_var, + line_colorby_var, + xfacet_var, + yfacet_var, + label, + plot_height, + plot_width +) { checkmate::assert_class(data, "reactive") checkmate::assert_class(shiny::isolate(data()), "teal_data") moduleServer(id, function(input, output, session) { teal.logger::log_shiny_input_changes(input, namespace = "teal.osprey") - env <- as.list(isolate(data())) - resolved_paramcd <- teal.transform::resolve_delayed(paramcd, env) + # Build picks list (exclude NULL optional picks) + picks_list <- list( + paramcd = paramcd, + x_var = x_var, + y_var = y_var, + marker_var = marker_var, + line_colorby_var = line_colorby_var, + xfacet_var = xfacet_var, + yfacet_var = yfacet_var + ) - teal.widgets::updateOptionalSelectInput( - session = session, - inputId = "paramcd", - choices = resolved_paramcd$choices, - selected = resolved_paramcd$selected + # Initialize picks selectors + selectors <- teal.picks::picks_srv( + picks = picks_list, + data = data ) - iv <- reactive({ - ADSL <- data()[["ADSL"]] - ADTR <- data()[[dataname]] + # Merge datasets based on picks selections + merged <- teal.picks::merge_srv( + "merge", + data = data, + selectors = selectors, + output_name = "ANL" + ) - iv <- shinyvalidate::InputValidator$new() - iv$add_rule("paramcd", shinyvalidate::sv_required( - message = "Parameter is required" - )) - iv$add_rule("x_var", shinyvalidate::sv_required( - message = "X Axis Variable is required" - )) - iv$add_rule("y_var", shinyvalidate::sv_required( - message = "Y Axis Variable is required" - )) - iv$add_rule("line_colorby_var", shinyvalidate::sv_required( - message = "Color Variable is required" - )) - iv$add_rule("marker_var", shinyvalidate::sv_required( - message = "Marker Symbol Variable is required" - )) - fac_dupl <- function(value, other) { - if (length(value) * length(other) > 0L && anyDuplicated(c(value, other))) { - "X- and Y-facet Variables must not overlap" + # populate paramcd_val choices from the selected paramcd column + observeEvent(merged$variables()$paramcd, + { + paramcd_col <- merged$variables()$paramcd + if (!is.null(paramcd_col) && paramcd_col %in% names(merged$data()[["ANL"]])) { + choices <- unique(as.character(merged$data()[["ANL"]][[paramcd_col]])) |> + sort() + teal.widgets::updateOptionalSelectInput( + session, + "paramcd_val", + choices = choices, + selected = choices[1] + ) } - } - iv$add_rule("xfacet_var", fac_dupl, other = input$yfacet_var) - iv$add_rule("yfacet_var", fac_dupl, other = input$xfacet_var) - iv$add_rule("vref_line", ~ if (anyNA(suppressWarnings(as_numeric_from_comma_sep_str(.)))) { - "Vertical reference line(s) are invalid" - }) - iv$add_rule("href_line", ~ if (anyNA(suppressWarnings(as_numeric_from_comma_sep_str(.)))) { - "Horizontal Reference Line(s) are invalid" - }) - iv$enable() - }) - - vals <- reactiveValues(spiderplot = NULL) + }, + ignoreNULL = FALSE + ) # render plot output_q <- reactive({ - obj <- data() - teal.reporter::teal_card(obj) <- + qenv <- merged$data() + teal.reporter::teal_card(qenv) <- c( - teal.reporter::teal_card(obj), + teal.reporter::teal_card(qenv), teal.reporter::teal_card("## Module's output(s)") ) - obj <- teal.code::eval_code(obj, "library(dplyr)") + qenv <- teal.code::eval_code(qenv, "library(dplyr)") - # get datasets --- - ADSL <- obj[["ADSL"]] - ADTR <- obj[[dataname]] + # We add USUBJID if from ADSL if it is not present in the merge keys + qenv <- teal.code::eval_code( + qenv, + code = bquote({ + if (!"USUBJID" %in% names(ANL)) { + ANL[["USUBJID"]] <- .(as.name(dataname))[["USUBJID"]] + } + }) + ) - teal::validate_inputs(iv()) + # get datasets --- + validated_q <- qenv + ADTR <- validated_q[[dataname]] - teal::validate_has_data(ADSL, min_nrow = 1, msg = sprintf("%s data has zero rows", "ADSL")) + teal::validate_has_data(validated_q[["ANL"]], min_nrow = 1, msg = "ANL data has zero rows") teal::validate_has_data(ADTR, min_nrow = 1, msg = sprintf("%s data has zero rows", dataname)) - paramcd <- input$paramcd - x_var <- input$x_var - y_var <- input$y_var - marker_var <- input$marker_var - line_colorby_var <- input$line_colorby_var + paramcd_col <- merged$variables()$paramcd + paramcd <- input$paramcd_val + x_var <- merged$variables()$x_var + y_var <- merged$variables()$y_var + marker_var <- merged$variables()$marker_var + line_colorby_var <- merged$variables()$line_colorby_var anno_txt_var <- input$anno_txt_var legend_on <- input$legend_on - xfacet_var <- input$xfacet_var - yfacet_var <- input$yfacet_var + xfacet_var <- merged$variables()$xfacet_var + yfacet_var <- merged$variables()$yfacet_var vref_line <- input$vref_line href_line <- input$href_line @@ -331,30 +381,25 @@ srv_g_spider <- function(id, data, dataname, paramcd, label, plot_height, plot_w vref_line <- as_numeric_from_comma_sep_str(vref_line) href_line <- as_numeric_from_comma_sep_str(href_line) - # define variables --- - # if variable is not in ADSL, then take from domain VADs - varlist <- c(xfacet_var, yfacet_var, marker_var, line_colorby_var) - varlist_from_adsl <- varlist[varlist %in% names(ADSL)] - varlist_from_anl <- varlist[!varlist %in% names(ADSL)] - - adsl_vars <- unique(c("USUBJID", "STUDYID", varlist_from_adsl)) - adtr_vars <- unique(c("USUBJID", "STUDYID", "PARAMCD", x_var, y_var, varlist_from_anl)) - - # preprocessing of datasets to qenv --- - - # vars definition - adtr_vars <- adtr_vars[adtr_vars != "None"] - adtr_vars <- adtr_vars[!is.null(adtr_vars)] + shiny::validate( + teal::need_input( + inputId = "paramcd-variables-selected", + condition = length(paramcd_col) > 0, + message = "Parameter Column is required." + ), + teal::need_input( + inputId = "paramcd_val", + condition = length(paramcd) > 0, + message = "Parameter Value is required." + ) + ) - # merge + # format and filter (ANL already merged by merge_srv) q1 <- teal.code::eval_code( - obj, + validated_q, code = bquote({ - ADSL <- ADSL[, .(adsl_vars)] %>% as.data.frame() - ADTR <- .(as.name(dataname))[, .(adtr_vars)] %>% as.data.frame() - ANL <- merge(ADSL, ADTR, by = c("USUBJID", "STUDYID")) ANL <- ANL %>% - group_by(USUBJID, PARAMCD) %>% + group_by(USUBJID, .(as.name(paramcd_col))) %>% arrange(ANL[, .(x_var)]) %>% as.data.frame() }) @@ -366,7 +411,7 @@ srv_g_spider <- function(id, data, dataname, paramcd, label, plot_height, plot_w code = bquote({ ANL$USUBJID <- unlist(lapply(strsplit(ANL$USUBJID, "-", fixed = TRUE), tail, 1)) ANL_f <- ANL %>% - filter(PARAMCD == .(paramcd)) %>% + filter(.data[[.(paramcd_col)]] == .(paramcd)) %>% as.data.frame() }) ) @@ -384,70 +429,82 @@ srv_g_spider <- function(id, data, dataname, paramcd, label, plot_height, plot_w # plot code to qenv --- teal.reporter::teal_card(q1) <- c(teal.reporter::teal_card(q1), "### Plot") - if (!is.null(input$paramcd) || !is.null(input$xfacet_var) || !is.null(input$yfacet_var)) { + if (!is.null(paramcd) || !is.null(xfacet_var) || !is.null(yfacet_var)) { teal.reporter::teal_card(q1) <- c(teal.reporter::teal_card(q1), "### Selected Options") } - if (!is.null(input$paramcd)) { + if (!is.null(paramcd)) { teal.reporter::teal_card(q1) <- - c(teal.reporter::teal_card(q1), paste0("Parameter - (from ", dataname, "): ", input$paramcd, ".")) + c( + teal.reporter::teal_card(q1), + paste0("Parameter - ", paramcd_col, " == ", paramcd, " (from ", dataname, ").") + ) } - if (!is.null(input$xfacet_var)) { + if (!is.null(xfacet_var)) { teal.reporter::teal_card(q1) <- c( teal.reporter::teal_card(q1), - sprintf("Faceted horizontally by: %s.", paste(input$xfacet_var, collapse = ", ")) + sprintf("Faceted horizontally by: %s.", paste(xfacet_var, collapse = ", ")) ) } - if (!is.null(input$yfacet_var)) { + if (!is.null(yfacet_var)) { teal.reporter::teal_card(q1) <- c( teal.reporter::teal_card(q1), - sprintf("Faceted vertically by: %s.", paste(input$yfacet_var, collapse = ", ")) + sprintf("Faceted vertically by: %s.", paste(yfacet_var, collapse = ", ")) ) } - q1 <- teal.code::eval_code( - q1, - code = bquote({ + q1 <- within(q1, + { plot <- osprey::g_spiderplot( - marker_x = ANL_f[, .(x_var)], + marker_x = ANL_f[[x_var]], marker_id = ANL_f$USUBJID, - marker_y = ANL_f[, .(y_var)], - line_colby = .(if (line_colorby_var != "None") { - bquote(ANL_f[, .(line_colorby_var)]) + marker_y = ANL_f[[y_var]], + line_colby = if (line_colorby_var != "None") { + ANL_f[[line_colorby_var]] } else { NULL - }), - marker_shape = .(if (marker_var != "None") { - bquote(ANL_f[, .(marker_var)]) + }, + marker_shape = if (marker_var != "None") { + ANL_f[[marker_var]] } else { NULL - }), + }, marker_size = 4, datalabel_txt = lbl, - facet_rows = .(if (!is.null(yfacet_var)) { - bquote(data.frame(ANL_f[, .(yfacet_var)])) + facet_rows = if (!is.null(yfacet_var)) { + data.frame(ANL_f[, yfacet_var, drop = FALSE]) } else { NULL - }), - facet_columns = .(if (!is.null(xfacet_var)) { - bquote(data.frame(ANL_f[, .(xfacet_var)])) + }, + facet_columns = if (!is.null(xfacet_var)) { + data.frame(ANL_f[, xfacet_var, drop = FALSE]) } else { NULL - }), - vref_line = .(vref_line), - href_line = .(href_line), - x_label = if (is.null(formatters::var_labels(ADTR[.(x_var)], fill = FALSE))) { - .(x_var) + }, + vref_line = vref_line, + href_line = href_line, + x_label = if (is.null(formatters::var_labels(get(dataname)[x_var], fill = FALSE))) { + x_var } else { - formatters::var_labels(ADTR[.(x_var)], fill = FALSE) + formatters::var_labels(get(dataname)[x_var], fill = FALSE) }, - y_label = if (is.null(formatters::var_labels(ADTR[.(y_var)], fill = FALSE))) { - .(y_var) + y_label = if (is.null(formatters::var_labels(get(dataname)[y_var], fill = FALSE))) { + y_var } else { - formatters::var_labels(ADTR[.(y_var)], fill = FALSE) + formatters::var_labels(get(dataname)[y_var], fill = FALSE) }, - show_legend = .(legend_on) + show_legend = legend_on ) - }) + }, + x_var = x_var, + y_var = y_var, + line_colorby_var = line_colorby_var, + marker_var = marker_var, + yfacet_var = yfacet_var, + xfacet_var = xfacet_var, + vref_line = vref_line, + href_line = href_line, + dataname = dataname, + legend_on = legend_on ) }) diff --git a/man/argument_convention.Rd b/man/argument_convention.Rd index e78a18e4..8ee7778a 100644 --- a/man/argument_convention.Rd +++ b/man/argument_convention.Rd @@ -16,9 +16,8 @@ object with all available choices and the pre-selected option for variable names that can be used as \code{arm_var}. See \code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} for details. Column \code{arm_var} in the \code{dataname} has to be a factor.} -\item{paramcd}{(\code{character(1)} or \code{choices_selected})\cr -variable value designating the studied parameter. -See \code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} for details.} +\item{paramcd}{Either a (\verb{[teal.picks::variables()]}) or \code{choices_selected})\cr +variable value designating the studied parameter.} \item{fontsize}{(\code{numeric(1)} or \code{numeric(3)})\cr Defines initial possible range of font-size. \code{fontsize} is set for diff --git a/man/tm_g_spiderplot.Rd b/man/tm_g_spiderplot.Rd index 3c98e64e..903035b1 100644 --- a/man/tm_g_spiderplot.Rd +++ b/man/tm_g_spiderplot.Rd @@ -33,21 +33,26 @@ For \code{modules()} defaults to \code{"root"}. See \code{Details}.} 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()}}.} -\item{paramcd}{(\code{character(1)} or \code{choices_selected})\cr -variable value designating the studied parameter. -See \code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} for details.} +\item{paramcd}{Either a (\verb{[teal.picks::variables()]}) or \code{choices_selected})\cr +variable value designating the studied parameter.} -\item{x_var}{x-axis variables} +\item{x_var}{Either a (\code{\link[teal.picks:variables]{teal.picks::variables()}}) object or a +(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected}}) \code{choices_selected} object for x-axis variables.} -\item{y_var}{y-axis variables} +\item{y_var}{Either a (\code{\link[teal.picks:variables]{teal.picks::variables()}}) object or a +(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected}}) \code{choices_selected} object for y-axis variables.} -\item{marker_var}{variable dictates marker symbol} +\item{marker_var}{Either a (\code{\link[teal.picks:variables]{teal.picks::variables()}}) object or a +(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected}}) \code{choices_selected} object for marker symbol.} -\item{line_colorby_var}{variable dictates line color} +\item{line_colorby_var}{Either a (\code{\link[teal.picks:variables]{teal.picks::variables()}}) object or a +(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected}}) \code{choices_selected} object for line color.} -\item{xfacet_var}{variable for x facets} +\item{xfacet_var}{Either a (\code{\link[teal.picks:variables]{teal.picks::variables()}}) object or a +(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected}}) \code{choices_selected} object for x facets.} -\item{yfacet_var}{variable for y facets} +\item{yfacet_var}{Either a (\code{\link[teal.picks:variables]{teal.picks::variables()}}) object or a +(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected}}) \code{choices_selected} object for y facets.} \item{vref_line}{vertical reference lines} @@ -95,12 +100,11 @@ For more information on reporting in \code{teal}, see the vignettes: } \examples{ -# Example using stream (ADaM) dataset data <- teal_data() \%>\% within({ library(nestcolor) - ADSL <- rADSL - ADTR <- rADTR + ADSL <- teal.data::rADSL + ADTR <- teal.data::rADTR }) join_keys(data) <- default_cdisc_join_keys[names(data)] @@ -109,33 +113,33 @@ app <- init( data = data, modules = modules( tm_g_spiderplot( - label = "Spider plot", + label = "Spider plot (picks)", dataname = "ADTR", - paramcd = choices_selected( - choices = "SLDINV", - selected = "SLDINV" + paramcd = variables( + choices = "PARAMCD", + selected = "PARAMCD" ), - x_var = choices_selected( - choices = "ADY", - selected = "ADY" + x_var = variables( + choices = dplyr::where(is.numeric), + selected = 1L ), - y_var = choices_selected( + y_var = variables( choices = c("PCHG", "CHG", "AVAL"), selected = "PCHG" ), - marker_var = choices_selected( + marker_var = variables( choices = c("SEX", "RACE", "USUBJID"), selected = "SEX" ), - line_colorby_var = choices_selected( + line_colorby_var = variables( choices = c("SEX", "USUBJID", "RACE"), selected = "SEX" ), - xfacet_var = choices_selected( + xfacet_var = variables( choices = c("SEX", "ARM"), selected = "SEX" ), - yfacet_var = choices_selected( + yfacet_var = variables( choices = c("SEX", "ARM"), selected = "ARM" ), diff --git a/tests/testthat/test-tm_g_spiderplot.R b/tests/testthat/test-tm_g_spiderplot.R new file mode 100644 index 00000000..cb6c0ab6 --- /dev/null +++ b/tests/testthat/test-tm_g_spiderplot.R @@ -0,0 +1,217 @@ +paramcd_cs <- teal.transform::choices_selected( + choices = "SLDINV", + selected = "SLDINV" +) + +x_var_cs <- teal.transform::choices_selected( + choices = "ADY", + selected = "ADY" +) + +y_var_cs <- teal.transform::choices_selected( + choices = c("PCHG", "CHG", "AVAL"), + selected = "PCHG" +) + +marker_var_cs <- teal.transform::choices_selected( + choices = c("SEX", "RACE", "USUBJID"), + selected = "SEX" +) + +line_colorby_var_cs <- teal.transform::choices_selected( + choices = c("SEX", "USUBJID", "RACE"), + selected = "SEX" +) + +xfacet_var_cs <- teal.transform::choices_selected( + choices = c("SEX", "ARM"), + selected = "SEX", +) + +yfacet_var_cs <- teal.transform::choices_selected( + choices = c("SEX", "ARM"), + selected = "ARM", +) + +paramcd_picks <- teal.picks::variables( + choices = "PARAMCD", + selected = "PARAMCD" +) + +x_var_picks <- teal.picks::variables( + choices = c("ADY", "AGE"), + selected = "ADY" +) + +y_var_picks <- teal.picks::variables( + choices = c("PCHG", "CHG", "AVAL"), + selected = "PCHG" +) + +marker_var_picks <- teal.picks::variables( + choices = c("SEX", "RACE", "USUBJID"), + selected = "SEX" +) + +line_colorby_var_picks <- teal.picks::variables( + choices = c("SEX", "USUBJID", "RACE"), + selected = "SEX" +) + +xfacet_var_picks <- teal.picks::variables( + choices = c("SEX", "ARM"), + selected = "SEX" +) + +yfacet_var_picks <- teal.picks::variables( + choices = c("SEX", "ARM"), + selected = "ARM" +) + +testthat::describe("tm_g_spiderplot argument verification", { + testthat::it("plot arguments input validation", { + testthat::expect_error( + { + suppressWarnings( + tm_g_spiderplot( + label = "Spider Plot", + dataname = "ADTR", + paramcd = paramcd_cs, + x_var = x_var_cs, + y_var = y_var_cs, + marker_var = marker_var_cs, + line_colorby_var = line_colorby_var_cs, + xfacet_var = xfacet_var_cs, + yfacet_var = yfacet_var_cs, + vref_line = "10, 37", + href_line = "-20, 0", + plot_height = c(600, 2000, 200) + ), + classes = "picks_delayed" + ) + }, + "Assertion on 'plot_height' failed" + ) + + testthat::expect_error( + { + suppressWarnings( + tm_g_spiderplot( + label = "Spider Plot", + dataname = "ADTR", + paramcd = paramcd_cs, + x_var = x_var_cs, + y_var = y_var_cs, + marker_var = marker_var_cs, + line_colorby_var = line_colorby_var_cs, + xfacet_var = xfacet_var_cs, + yfacet_var = yfacet_var_cs, + vref_line = "10, 37", + href_line = "-20, 0", + plot_width = c(600, 2000, 200) + ), + classes = "picks_delayed" + ) + }, + "Assertion on 'plot_width' failed" + ) + }) + + testthat::it("Forcing Conversion from multiple picks to single", { + testthat::expect_error( + { + suppressWarnings( + tm_g_spiderplot( + label = "Spider Plot", + dataname = "ADTR", + paramcd = paramcd_cs, + x_var = teal.picks::variables( + choices = c("ADY", "AGE"), + selected = "ADY", + multiple = TRUE + ), + y_var = y_var_cs, + marker_var = marker_var_cs, + line_colorby_var = line_colorby_var_cs, + xfacet_var = xfacet_var_cs, + yfacet_var = yfacet_var_cs, + vref_line = "10, 37", + href_line = "-20, 0" + ), + classes = "picks_delayed" + ) + }, + "metadata does not match the requirement for x_var" + ) + + testthat::expect_error( + { + suppressWarnings( + tm_g_spiderplot( + label = "Spider Plot", + dataname = "ADTR", + paramcd = teal.picks::variables( + choices = "PARAMCD", + selected = "PARAMCD", + multiple = TRUE + ), + x_var = x_var_picks, + y_var = y_var_picks, + marker_var = marker_var_picks, + line_colorby_var = line_colorby_var_picks, + xfacet_var = xfacet_var_picks, + yfacet_var = yfacet_var_picks, + vref_line = "10, 37", + href_line = "-20, 0" + ), + classes = "picks_delayed" + ) + }, + "metadata does not match the requirement for paramcd" + ) + }) +}) + +testthat::describe("tm_g_spiderplot module creation", { + testthat::it("creates a teal module using choices_selected (default method)", { + mod <- suppressWarnings( + tm_g_spiderplot( + label = "Spider Plot", + dataname = "ADTR", + paramcd = paramcd_cs, + x_var = x_var_cs, + y_var = y_var_cs, + marker_var = marker_var_cs, + line_colorby_var = line_colorby_var_cs, + xfacet_var = xfacet_var_cs, + yfacet_var = yfacet_var_cs, + vref_line = "10, 37", + href_line = "-20, 0", + plot_height = c(600, 200, 2000) + ), + classes = "picks_delayed" + ) + testthat::expect_s3_class(mod, "teal_module") + }) + + testthat::it("creates a teal module using picks (.pick method)", { + mod <- suppressWarnings( + tm_g_spiderplot( + label = "Spider Plot", + dataname = "ADTR", + paramcd = paramcd_picks, + x_var = x_var_picks, + y_var = y_var_picks, + marker_var = marker_var_picks, + line_colorby_var = line_colorby_var_picks, + xfacet_var = xfacet_var_picks, + yfacet_var = yfacet_var_picks, + vref_line = "10, 37", + href_line = "-20, 0", + plot_height = c(600, 200, 2000) + ), + classes = "picks_delayed" + ) + testthat::expect_s3_class(mod, "teal_module") + }) +})