From bd3dee24edd6476479949a143051aac6ad177df6 Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Thu, 1 Feb 2024 11:20:22 -0500 Subject: [PATCH 001/126] Clean up documentation for `tm_t_binary_outcome` (#994) Fixes #968 --- R/argument_convention.R | 4 +- R/tm_t_binary_outcome.R | 91 ++++++++------------------- R/tm_t_shift_by_arm_by_worst.R | 4 +- R/tm_t_shift_by_grade.R | 7 ++- man/module_arguments.Rd | 2 +- man/template_arguments.Rd | 3 + man/template_binary_outcome.Rd | 32 ++-------- man/template_shift_by_arm_by_worst.Rd | 3 + man/template_shift_by_grade.Rd | 3 + man/tm_t_binary_outcome.Rd | 38 +++++------ man/tm_t_shift_by_arm_by_worst.Rd | 4 +- man/tm_t_shift_by_grade.Rd | 8 ++- 12 files changed, 77 insertions(+), 122 deletions(-) diff --git a/R/argument_convention.R b/R/argument_convention.R index ed146795d5..a5e1ea69ca 100644 --- a/R/argument_convention.R +++ b/R/argument_convention.R @@ -79,6 +79,8 @@ #' @param worst_flag_indicator (`character`)\cr value indicating worst grade. #' @param worst_flag_var (`character`)\cr name of the worst flag variable. #' +#' @return a `list` of expressions to generate a table or plot object. +#' #' @name template_arguments #' @keywords internal NULL @@ -168,7 +170,7 @@ NULL #' @param worst_flag_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object #' with all available choices and preselected option for variable names that can be used as worst flag variable. #' -#' @return a [teal::module()] object which can be added to a `teal` app via [teal::init()]. +#' @return a `teal_module` object. #' #' @name module_arguments #' @keywords internal diff --git a/R/tm_t_binary_outcome.R b/R/tm_t_binary_outcome.R index 908b32ba19..770f25767d 100644 --- a/R/tm_t_binary_outcome.R +++ b/R/tm_t_binary_outcome.R @@ -1,42 +1,21 @@ #' Template: Binary Outcome #' -#' Creates a valid expression for binary outcome analysis. +#' Creates a valid expression to generate a binary outcome analysis. #' #' @inheritParams template_arguments #' @param control (`list`)\cr list of settings for the analysis. #' @param responder_val (`character`)\cr the short label for observations to -#' translate `AVALC` into responder / non-responder. +#' translate `AVALC` into responder/non-responder. #' @param responder_val_levels (`character`)\cr the levels of responses that will be shown in the multinomial -#' response estimations. +#' response estimations. #' @param show_rsp_cat (`logical`)\cr display the multinomial response estimations. #' @param paramcd (`character`)\cr response parameter value to use in the table title. #' -#' @seealso [tm_t_binary_outcome()] -#' @keywords internal -#' @examples -#' if (interactive()) { -#' # Preparation of the test case. -#' adsl <- tmc_ex_adsl -#' adrs <- tmc_ex_adrs +#' @inherit template_arguments return #' -#' # Generate an expression for the analysis of responders. -#' a <- template_binary_outcome( -#' dataname = "adrs", -#' parentname = "adsl", -#' arm_var = "ARMCD", -#' paramcd = "BESRSPI", -#' ref_arm = "ARM A", -#' comp_arm = c("ARM B"), -#' compare_arm = TRUE, -#' show_rsp_cat = TRUE -#' ) -#' -#' b <- mapply(expr = a, FUN = eval) -#' b$data -#' b$layout -#' b$table -#' } +#' @seealso [tm_t_binary_outcome()] #' +#' @keywords internal template_binary_outcome <- function(dataname, parentname, arm_var, @@ -50,20 +29,9 @@ template_binary_outcome <- function(dataname, responder_val = c("Complete Response (CR)", "Partial Response (PR)"), responder_val_levels = responder_val, control = list( - global = list( - method = "waldcc", - conf_level = 0.95 - ), - unstrat = list( - method_ci = "waldcc", - method_test = "schouten", - odds = TRUE - ), - strat = list( - method_ci = "cmh", - method_test = "cmh", - strat = NULL - ) + global = list(method = "waldcc", conf_level = 0.95), + unstrat = list(method_ci = "waldcc", method_test = "schouten", odds = TRUE), + strat = list(method_ci = "cmh", method_test = "cmh", strat = NULL) ), add_total = FALSE, total_label = default_total_label(), @@ -357,37 +325,28 @@ template_binary_outcome <- function(dataname, y } -#' Teal Module: Binary Outcome Table +#' teal Module: Binary Outcome Table #' -#' @description -#' This module produces a binary outcome response summary -#' table, with the option to match the STREAM template `RSPT01`. +#' This module produces a binary outcome response summary table, with the option to match the template for +#' response table `RSPT01` available in the TLG Catalog [here]( +#' https://insightsengineering.github.io/tlg-catalog/stable/tables/efficacy/rspt01.html). #' #' @inheritParams module_arguments #' @inheritParams template_binary_outcome -#' @param rsp_table (`logical`)\cr should the initial set-up of the module match `RSPT01`. (default FALSE) -#' -#' @details Additional standard UI inputs include `responders`, -#' `ref_arm`, `comp_arm` and `combine_comp_arms` (default FALSE) +#' @param rsp_table (`logical`)\cr whether the initial set-up of the module should match `RSPT01`. Defaults to `FALSE`. #' -#' Default values of the inputs `var_arm`, `ref_arm` and -#' `comp_arm` are set to NULL, and updated accordingly based on selection -#' of `paramcd` and `var_arm` +#' @details +#' * The display order of response categories inherits the factor level order of the source data. Use +#' [base::factor()] and its `levels` argument to manipulate the source data in order to include/exclude +#' or re-categorize response categories and arrange the display order. If response categories are `"Missing"`, +#' `"Not Evaluable (NE)"`, or `"Missing or unevaluable"`, 95% confidence interval will not be calculated. #' -#' This display order of response categories in partitioned statistics section -#' inherits the factor level order of the source data. Use -#' [base::factor()] and its `levels` argument to manipulate -#' the source data in order to include/exclude or re-categorize response -#' categories and arrange the display order. If response categories are -#' "Missing" or "Not Evaluable (NE)" or "Missing or unevaluable", 95\% -#' confidence interval will not be calculated. +#' * Reference arms are automatically combined if multiple arms selected as reference group. #' -#' Reference arms automatically combined if multiple arms selected as -#' reference group. +#' @inherit module_arguments return #' -#' @return an [teal::module()] object -#' -#' @export +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. #' #' @examples #' ADSL <- tmc_ex_adsl @@ -460,6 +419,7 @@ template_binary_outcome <- function(dataname, #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_t_binary_outcome <- function(label, dataname, parentname = ifelse( @@ -538,6 +498,7 @@ tm_t_binary_outcome <- function(label, ) } +#' @keywords internal ui_t_binary_outcome <- function(id, ...) { a <- list(...) is_single_dataset_value <- teal.transform::is_single_dataset( @@ -726,7 +687,7 @@ ui_t_binary_outcome <- function(id, ...) { ) } -#' @noRd +#' @keywords internal srv_t_binary_outcome <- function(id, data, reporter, diff --git a/R/tm_t_shift_by_arm_by_worst.R b/R/tm_t_shift_by_arm_by_worst.R index 07774b293a..a0d69edea2 100644 --- a/R/tm_t_shift_by_arm_by_worst.R +++ b/R/tm_t_shift_by_arm_by_worst.R @@ -8,6 +8,8 @@ #' @param baseline_var (`character`)\cr name of the baseline reference range indicator variable. #' @param worst_flag (`character`)\cr value indicating worst analysis indicator level. #' +#' @inherit template_arguments return +#' #' @seealso [tm_t_shift_by_arm()] #' #' @keywords internal @@ -184,7 +186,7 @@ template_shift_by_arm_by_worst <- function(dataname, y } -#' Teal Module: Shift by Arm by Worst Analysis Indicator Level +#' teal Module: Shift by Arm by Worst Analysis Indicator Level #' #' This module produces a summary table of worst analysis indicator variable level per subject by arm. #' diff --git a/R/tm_t_shift_by_grade.R b/R/tm_t_shift_by_grade.R index 4cd158c86d..261446e1f1 100644 --- a/R/tm_t_shift_by_grade.R +++ b/R/tm_t_shift_by_grade.R @@ -7,6 +7,8 @@ #' @param base_toxgrade_var (`character`)\cr name of the variable indicating the baseline toxicity grade. #' @param code_missing_baseline (`logical`)\cr whether missing baseline grades should be counted as grade 0. #' +#' @inherit template_arguments return +#' #' @seealso [tm_t_shift_by_grade()] #' #' @keywords internal @@ -460,7 +462,7 @@ template_shift_by_grade <- function(parentname, y } -#' Teal Module: Grade Summary Table +#' teal Module: Grade Summary Table #' #' This module produces a summary table of worst grades per subject by visit and parameter. #' @@ -473,6 +475,9 @@ template_shift_by_grade <- function(parentname, #' #' @inherit module_arguments return #' +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. +#' #' @examples #' ADSL <- tmc_ex_adsl #' ADLB <- tmc_ex_adlb diff --git a/man/module_arguments.Rd b/man/module_arguments.Rd index 91a70cf49f..e17351692d 100644 --- a/man/module_arguments.Rd +++ b/man/module_arguments.Rd @@ -108,7 +108,7 @@ value indicating worst grade.} with all available choices and preselected option for variable names that can be used as worst flag variable.} } \value{ -a \code{\link[teal:module]{teal::module()}} object which can be added to a \code{teal} app via \code{\link[teal:init]{teal::init()}}. +a \code{teal_module} object. } \description{ The documentation to this function lists all the arguments in teal modules diff --git a/man/template_arguments.Rd b/man/template_arguments.Rd index 8034554b15..7aa0f33bd6 100644 --- a/man/template_arguments.Rd +++ b/man/template_arguments.Rd @@ -120,6 +120,9 @@ records in \code{treatment_flag_var}.} \item{worst_flag_var}{(\code{character})\cr name of the worst flag variable.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ The documentation to this function lists all the arguments in teal module templates that are used repeatedly to express an analysis. diff --git a/man/template_binary_outcome.Rd b/man/template_binary_outcome.Rd index 0086625cf2..5640d93362 100644 --- a/man/template_binary_outcome.Rd +++ b/man/template_binary_outcome.Rd @@ -48,7 +48,7 @@ template_binary_outcome( \item{show_rsp_cat}{(\code{logical})\cr display the multinomial response estimations.} \item{responder_val}{(\code{character})\cr the short label for observations to -translate \code{AVALC} into responder / non-responder.} +translate \code{AVALC} into responder/non-responder.} \item{responder_val_levels}{(\code{character})\cr the levels of responses that will be shown in the multinomial response estimations.} @@ -71,33 +71,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } -\description{ -Creates a valid expression for binary outcome analysis. -} -\examples{ -if (interactive()) { - # Preparation of the test case. - adsl <- tmc_ex_adsl - adrs <- tmc_ex_adrs - - # Generate an expression for the analysis of responders. - a <- template_binary_outcome( - dataname = "adrs", - parentname = "adsl", - arm_var = "ARMCD", - paramcd = "BESRSPI", - ref_arm = "ARM A", - comp_arm = c("ARM B"), - compare_arm = TRUE, - show_rsp_cat = TRUE - ) - - b <- mapply(expr = a, FUN = eval) - b$data - b$layout - b$table +\value{ +a \code{list} of expressions to generate a table or plot object. } - +\description{ +Creates a valid expression to generate a binary outcome analysis. } \seealso{ \code{\link[=tm_t_binary_outcome]{tm_t_binary_outcome()}} diff --git a/man/template_shift_by_arm_by_worst.Rd b/man/template_shift_by_arm_by_worst.Rd index 8a9aaa4498..f3d0d4cc5b 100644 --- a/man/template_shift_by_arm_by_worst.Rd +++ b/man/template_shift_by_arm_by_worst.Rd @@ -65,6 +65,9 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ Creates a valid expression to generate a summary table of analysis indicator levels by arm. } diff --git a/man/template_shift_by_grade.Rd b/man/template_shift_by_grade.Rd index bdd3b09da2..5a715401e2 100644 --- a/man/template_shift_by_grade.Rd +++ b/man/template_shift_by_grade.Rd @@ -67,6 +67,9 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ Creates a valid expression to generate a grade summary table. } diff --git a/man/tm_t_binary_outcome.Rd b/man/tm_t_binary_outcome.Rd index ed00a23a36..9fcb43b413 100644 --- a/man/tm_t_binary_outcome.Rd +++ b/man/tm_t_binary_outcome.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_binary_outcome.R \name{tm_t_binary_outcome} \alias{tm_t_binary_outcome} -\title{Teal Module: Binary Outcome Table} +\title{teal Module: Binary Outcome Table} \usage{ tm_t_binary_outcome( label, @@ -65,7 +65,7 @@ and contain arrays, each name corresponding to a single value of \code{paramcd}. may contain default response values or named arrays \code{rsp} of default selected response values and \code{levels} of default level choices.} -\item{rsp_table}{(\code{logical})\cr should the initial set-up of the module match \code{RSPT01}. (default FALSE)} +\item{rsp_table}{(\code{logical})\cr whether the initial set-up of the module should match \code{RSPT01}. Defaults to \code{FALSE}.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} @@ -90,30 +90,20 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ -an \code{\link[teal:module]{teal::module()}} object +a \code{teal_module} object. } \description{ -This module produces a binary outcome response summary -table, with the option to match the STREAM template \code{RSPT01}. +This module produces a binary outcome response summary table, with the option to match the template for +response table \code{RSPT01} available in the TLG Catalog \href{https://insightsengineering.github.io/tlg-catalog/stable/tables/efficacy/rspt01.html}{here}. } \details{ -Additional standard UI inputs include \code{responders}, -\code{ref_arm}, \code{comp_arm} and \code{combine_comp_arms} (default FALSE) - -Default values of the inputs \code{var_arm}, \code{ref_arm} and -\code{comp_arm} are set to NULL, and updated accordingly based on selection -of \code{paramcd} and \code{var_arm} - -This display order of response categories in partitioned statistics section -inherits the factor level order of the source data. Use -\code{\link[base:factor]{base::factor()}} and its \code{levels} argument to manipulate -the source data in order to include/exclude or re-categorize response -categories and arrange the display order. If response categories are -"Missing" or "Not Evaluable (NE)" or "Missing or unevaluable", 95\\% -confidence interval will not be calculated. - -Reference arms automatically combined if multiple arms selected as -reference group. +\itemize{ +\item The display order of response categories inherits the factor level order of the source data. Use +\code{\link[base:factor]{base::factor()}} and its \code{levels} argument to manipulate the source data in order to include/exclude +or re-categorize response categories and arrange the display order. If response categories are \code{"Missing"}, +\code{"Not Evaluable (NE)"}, or \code{"Missing or unevaluable"}, 95\% confidence interval will not be calculated. +\item Reference arms are automatically combined if multiple arms selected as reference group. +} } \examples{ ADSL <- tmc_ex_adsl @@ -187,3 +177,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} diff --git a/man/tm_t_shift_by_arm_by_worst.Rd b/man/tm_t_shift_by_arm_by_worst.Rd index cf4b8ad3d7..d77f0a249e 100644 --- a/man/tm_t_shift_by_arm_by_worst.Rd +++ b/man/tm_t_shift_by_arm_by_worst.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_shift_by_arm_by_worst.R \name{tm_t_shift_by_arm_by_worst} \alias{tm_t_shift_by_arm_by_worst} -\title{Teal Module: Shift by Arm by Worst Analysis Indicator Level} +\title{teal Module: Shift by Arm by Worst Analysis Indicator Level} \usage{ tm_t_shift_by_arm_by_worst( label, @@ -86,7 +86,7 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ -a \code{\link[teal:module]{teal::module()}} object which can be added to a \code{teal} app via \code{\link[teal:init]{teal::init()}}. +a \code{teal_module} object. } \description{ This module produces a summary table of worst analysis indicator variable level per subject by arm. diff --git a/man/tm_t_shift_by_grade.Rd b/man/tm_t_shift_by_grade.Rd index e038da5976..21539c47f9 100644 --- a/man/tm_t_shift_by_grade.Rd +++ b/man/tm_t_shift_by_grade.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_shift_by_grade.R \name{tm_t_shift_by_grade} \alias{tm_t_shift_by_grade} -\title{Teal Module: Grade Summary Table} +\title{teal Module: Grade Summary Table} \usage{ tm_t_shift_by_grade( label, @@ -98,7 +98,7 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ -a \code{\link[teal:module]{teal::module()}} object which can be added to a \code{teal} app via \code{\link[teal:init]{teal::init()}}. +a \code{teal_module} object. } \description{ This module produces a summary table of worst grades per subject by visit and parameter. @@ -156,3 +156,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} From 37eaa3f903d680ba48f1bac4e2336811968d6f4d Mon Sep 17 00:00:00 2001 From: edelarua Date: Thu, 1 Feb 2024 16:21:18 +0000 Subject: [PATCH 002/126] [skip actions] Bump version to 0.8.16.9046 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 1443545d4c..337d780863 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9045 +Version: 0.8.16.9046 Date: 2024-02-01 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 35f623fb6a..37eaffef5d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9045 +# teal.modules.clinical 0.8.16.9046 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 9deba47993ece969d6a21130948e9bcb83afce62 Mon Sep 17 00:00:00 2001 From: edelarua Date: Thu, 1 Feb 2024 16:22:24 +0000 Subject: [PATCH 003/126] [skip actions] Update WORDLIST --- inst/WORDLIST | 2 -- 1 file changed, 2 deletions(-) diff --git a/inst/WORDLIST b/inst/WORDLIST index 9bf701544e..160ba33ad9 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -2,7 +2,6 @@ ADAE ADSL ADaM ANCOVA -Evaluable Facetting Forkers Getter @@ -28,5 +27,4 @@ responders songy timepoint unadjusted -unevaluable univariable From 3b5340e41219f6d4fc07014ec6fd2c8c050218b2 Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Fri, 2 Feb 2024 10:45:51 -0500 Subject: [PATCH 004/126] Clean up documentation for `tm_t_summary_by` (#1003) Fixes #978 --- R/argument_convention.R | 10 +++-- R/tm_t_summary_by.R | 45 ++++++++++------------ man/module_arguments.Rd | 2 + man/prepare_arm_levels.Rd | 7 ++-- man/template_abnormality.Rd | 7 ++-- man/template_abnormality_by_worst_grade.Rd | 7 ++-- man/template_arguments.Rd | 10 +++-- man/template_events.Rd | 7 ++-- man/template_events_by_grade.Rd | 7 ++-- man/template_events_col_by_grade.Rd | 7 ++-- man/template_events_patyear.Rd | 7 ++-- man/template_mult_events.Rd | 7 ++-- man/template_shift_by_grade.Rd | 7 ++-- man/template_smq.Rd | 7 ++-- man/template_summary.Rd | 7 ++-- man/template_summary_by.Rd | 26 +++++++------ man/tm_t_abnormality.Rd | 7 ++-- man/tm_t_abnormality_by_worst_grade.Rd | 7 ++-- man/tm_t_events.Rd | 7 ++-- man/tm_t_events_by_grade.Rd | 7 ++-- man/tm_t_events_patyear.Rd | 7 ++-- man/tm_t_mult_events.Rd | 7 ++-- man/tm_t_shift_by_grade.Rd | 7 ++-- man/tm_t_smq.Rd | 7 ++-- man/tm_t_summary_by.Rd | 35 +++++++++-------- 25 files changed, 147 insertions(+), 114 deletions(-) diff --git a/R/argument_convention.R b/R/argument_convention.R index a5e1ea69ca..ad8dad0b7e 100644 --- a/R/argument_convention.R +++ b/R/argument_convention.R @@ -34,9 +34,10 @@ #' population from the column total is used as the denominator. With option `n`, the number of non-missing #' records in this row and column intersection is used as the denominator. If `omit` is chosen, then the #' percentage is omitted. -#' @param drop_arm_levels (`logical`)\cr drop the unused `arm_var` levels. -#' When `TRUE`, `arm_var` levels are set to those used in the `dataname` dataset. When `FALSE`, -#' `arm_var` levels are set to those used in the `parantname` dataset. +#' @param drop_arm_levels (`logical`)\cr whether to drop unused levels of `arm_var`. If `TRUE`, `arm_var` levels are +#' set to those used in the `dataname` dataset. If `FALSE`, `arm_var` levels are set to those used in the +#' `parentname` dataset. If `dataname` and `parentname` are the same, then `drop_arm_levels` is set to `TRUE` and +#' user input for this parameter is ignored. #' @param ggplot2_args optional, (`ggplot2_args`)\cr object created by [teal.widgets::ggplot2_args()] with settings #' for the module plot. The argument is merged with option `teal.ggplot2_args` and with default module arguments #' (hard coded in the module body). @@ -54,6 +55,8 @@ #' in character or factor variables in the data. Defaults to `""`. To set a #' default `na_level` to apply in all modules, run `set_default_na_str("new_default")`. #' @param na.rm (`logical`)\cr whether `NA` values should be removed prior to analysis. +#' @param numeric_stats (`character`)\cr names of statistics to display for numeric summary variables. Available +#' statistics are `n`, `mean_sd`, `mean_ci`, `median`, `median_ci`, `quantiles`, `range`, and `geom_mean`. #' @param paramcd (`character`)\cr variable value designating the studied parameter. #' @param parentname (`character`)\cr parent analysis data used in teal module, usually this refers to `ADSL`. #' @param prune_diff (`number`)\cr threshold to use for trimming table using as criteria difference in @@ -123,6 +126,7 @@ NULL #' confidence level, each within range of (0, 1). #' @param cov_var (`choices_selected` or `data_extract_spec`)\cr object with all available choices and preselected #' option for the covariates variables. +#' @param dataname (`character`)\cr analysis data used in teal module. #' @param default_responses (`list` or `character`)\cr defines #' the default codes for the response variable in the module per value of `paramcd`. #' A passed vector is transmitted for all `paramcd` values. A passed `list` must be named diff --git a/R/tm_t_summary_by.R b/R/tm_t_summary_by.R index d513121f66..7f82a2b7d9 100644 --- a/R/tm_t_summary_by.R +++ b/R/tm_t_summary_by.R @@ -1,18 +1,18 @@ #' Template: Summarize Variables by Row Groups Module #' +#' Creates a valid expression to generate a table to summarize variables by row groups. +#' #' @inheritParams template_arguments -#' @param parallel_vars (`logical`)\cr used to display `summarize_vars` as parallel columns -#' (`FALSE` on default). Can be used only if all chosen analysis variables are numeric. -#' @param row_groups (`logical`)\cr used to display `summarize_vars` as row groups -#' (`FALSE` on default). -#' @param numeric_stats (`character`)\cr -#' selected statistics for numeric summarize variables to be displayed. Possible values are `n`, `mean_sd`, `mean_ci`, -#' `median`, `median_ci`, `quantiles`, `range`. All are selected by default. -#' @param drop_zero_levels (`logical`)\cr used to remove rows with zero counts from the result table. +#' @param parallel_vars (`logical`)\cr whether summarized variables should be arranged in columns. Can only be set to +#' `TRUE` if all chosen analysis variables are numeric. +#' @param row_groups (`logical`)\cr whether summarized variables should be arranged in row groups. +#' @param drop_zero_levels (`logical`)\cr whether rows with zero counts in all columns should be removed from the table. +#' +#' @inherit template_arguments return #' #' @seealso [tm_t_summary_by()] -#' @keywords internal #' +#' @keywords internal template_summary_by <- function(parentname, dataname, arm_var, @@ -106,7 +106,6 @@ template_summary_by <- function(parentname, ) } - table_title <- paste("Summary Table for", paste(sum_vars, collapse = ", "), "by", paste(by_vars, collapse = ", ")) parsed_basic_table_args <- teal.widgets::parse_basic_table_args( @@ -314,21 +313,18 @@ template_summary_by <- function(parentname, y } -#' Teal Module: Summarize Variables by Row Groups Module +#' teal Module: Summarize Variables by Row Groups +#' +#' This module produces a table to summarize variables by row groups. #' -#' @param drop_arm_levels (`logical`)\cr drop the unused `arm_var` levels. -#' When `TRUE`, `arm_var` levels are set to those used in the `dataname` dataset. When `FALSE`, -#' `arm_var` levels are set to those used in the `parentname` dataset. -#' If `dataname` dataset and `parentname` dataset are the same (i.e. `ADSL`), then `drop_arm_levels` will always be -#' TRUE regardless of the user choice when `tm_t_summary_by` is called. -#' @param numeric_stats (`character`)\cr -#' selected statistics for numeric summarize variables to be displayed. Possible values are `n`, `mean_sd`, `mean_ci`, -#' `median`, `median_ci`, `range`, `geom_mean`. By default, `n`, `mean_sd`, `median`, `range` are selected. -#' @param drop_zero_levels (`logical`)\cr used to remove rows with zero counts from the result table. #' @inheritParams module_arguments #' @inheritParams template_summary_by #' -#' @export +#' @inherit module_arguments return +#' +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. +#' #' @examples #' ADSL <- tmc_ex_adsl #' ADLB <- tmc_ex_adlb @@ -370,6 +366,8 @@ template_summary_by <- function(parentname, #' if (interactive()) { #' shinyApp(app$ui, app$server) #' } +#' +#' @export tm_t_summary_by <- function(label, dataname, parentname = ifelse( @@ -455,7 +453,7 @@ tm_t_summary_by <- function(label, ) } -#' @noRd +#' @keywords internal ui_summary_by <- function(id, ...) { ns <- shiny::NS(id) a <- list(...) @@ -576,8 +574,7 @@ ui_summary_by <- function(id, ...) { ) } - -#' @noRd +#' @keywords internal srv_summary_by <- function(id, data, reporter, diff --git a/man/module_arguments.Rd b/man/module_arguments.Rd index e17351692d..7e5c85b759 100644 --- a/man/module_arguments.Rd +++ b/man/module_arguments.Rd @@ -36,6 +36,8 @@ confidence level, each within range of (0, 1).} \item{cov_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected option for the covariates variables.} +\item{dataname}{(\code{character})\cr analysis data used in teal module.} + \item{default_responses}{(\code{list} or \code{character})\cr defines the default codes for the response variable in the module per value of \code{paramcd}. A passed vector is transmitted for all \code{paramcd} values. A passed \code{list} must be named diff --git a/man/prepare_arm_levels.Rd b/man/prepare_arm_levels.Rd index ac657cc5bf..bf3872e3d3 100644 --- a/man/prepare_arm_levels.Rd +++ b/man/prepare_arm_levels.Rd @@ -13,9 +13,10 @@ prepare_arm_levels(dataname, parentname, arm_var, drop_arm_levels = TRUE) \item{arm_var}{(\code{character})\cr variable names that can be used as \code{arm_var}.} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} } \description{ This function generates the standard expression for pre-processing of dataset diff --git a/man/template_abnormality.Rd b/man/template_abnormality.Rd index 9d8dd6f282..ef337df693 100644 --- a/man/template_abnormality.Rd +++ b/man/template_abnormality.Rd @@ -56,9 +56,10 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} \item{exclude_base_abn}{(\code{logical})\cr whether to exclude patients who had abnormal values at baseline.} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} \item{na_level}{(\code{character})\cr the NA level in the input dataset, default to \code{""}.} diff --git a/man/template_abnormality_by_worst_grade.Rd b/man/template_abnormality_by_worst_grade.Rd index 1f4ab7d8dc..c20e64665a 100644 --- a/man/template_abnormality_by_worst_grade.Rd +++ b/man/template_abnormality_by_worst_grade.Rd @@ -48,9 +48,10 @@ Worst Low Grade flag} enabled (see \code{add_total}). Defaults to \code{"All Patients"}. To set a new default \code{total_label} to apply in all modules, run \code{set_default_total_label("new_default")}.} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default diff --git a/man/template_arguments.Rd b/man/template_arguments.Rd index 7aa0f33bd6..f92506ecc0 100644 --- a/man/template_arguments.Rd +++ b/man/template_arguments.Rd @@ -47,9 +47,10 @@ population from the column total is used as the denominator. With option \code{n records in this row and column intersection is used as the denominator. If \code{omit} is chosen, then the percentage is omitted.} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments @@ -77,6 +78,9 @@ default \code{na_level} to apply in all modules, run \code{set_default_na_str("n \item{na.rm}{(\code{logical})\cr whether \code{NA} values should be removed prior to analysis.} +\item{numeric_stats}{(\code{character})\cr names of statistics to display for numeric summary variables. Available +statistics are \code{n}, \code{mean_sd}, \code{mean_ci}, \code{median}, \code{median_ci}, \code{quantiles}, \code{range}, and \code{geom_mean}.} + \item{paramcd}{(\code{character})\cr variable value designating the studied parameter.} \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} diff --git a/man/template_events.Rd b/man/template_events.Rd index 5dfe349d21..2c39368a0d 100644 --- a/man/template_events.Rd +++ b/man/template_events.Rd @@ -66,9 +66,10 @@ alphabetically.} \item{prune_diff}{(\code{number})\cr threshold to use for trimming table using as criteria difference in rates between any two columns.} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} \item{incl_overall_sum}{(\code{flag})\cr whether two rows which summarize the overall number of adverse events should be included at the top of the table.} diff --git a/man/template_events_by_grade.Rd b/man/template_events_by_grade.Rd index 6d553a4cb4..e7b8c8f6b3 100644 --- a/man/template_events_by_grade.Rd +++ b/man/template_events_by_grade.Rd @@ -63,9 +63,10 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default diff --git a/man/template_events_col_by_grade.Rd b/man/template_events_col_by_grade.Rd index 2f0bb932f1..bf52d4555d 100644 --- a/man/template_events_col_by_grade.Rd +++ b/man/template_events_col_by_grade.Rd @@ -67,9 +67,10 @@ rates between any two columns.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default diff --git a/man/template_events_patyear.Rd b/man/template_events_patyear.Rd index 99e9bd028d..52da1d76a6 100644 --- a/man/template_events_patyear.Rd +++ b/man/template_events_patyear.Rd @@ -44,9 +44,10 @@ default \code{na_level} to apply in all modules, run \code{set_default_na_str("n \item{control}{(\code{list})\cr list of settings for the analysis.} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default diff --git a/man/template_mult_events.Rd b/man/template_mult_events.Rd index a094394caf..29ecf4aee1 100644 --- a/man/template_mult_events.Rd +++ b/man/template_mult_events.Rd @@ -45,9 +45,10 @@ default \code{na_level} to apply in all modules, run \code{set_default_na_str("n \item{event_type}{(\code{character})\cr type of event that is summarized (e.g. adverse event, treatment). Default is "event".} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default diff --git a/man/template_shift_by_grade.Rd b/man/template_shift_by_grade.Rd index 5a715401e2..3794b17ffc 100644 --- a/man/template_shift_by_grade.Rd +++ b/man/template_shift_by_grade.Rd @@ -45,9 +45,10 @@ template_shift_by_grade( \item{paramcd}{(\code{character})\cr variable value designating the studied parameter.} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} diff --git a/man/template_smq.Rd b/man/template_smq.Rd index 4bd192634c..d1946624cf 100644 --- a/man/template_smq.Rd +++ b/man/template_smq.Rd @@ -39,9 +39,10 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} by decreasing total number of patients with event. Alternative option \code{alpha} sorts events alphabetically.} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} \item{na_level}{(\code{string})\cr used to replace all \code{NA} or empty values in character or factor variables in the data. Defaults to \code{""}. To set a diff --git a/man/template_summary.Rd b/man/template_summary.Rd index d484dca8d1..cd9ab11ce7 100644 --- a/man/template_summary.Rd +++ b/man/template_summary.Rd @@ -57,9 +57,10 @@ population from the column total is used as the denominator. With option \code{n records in this row and column intersection is used as the denominator. If \code{omit} is chosen, then the percentage is omitted.} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default diff --git a/man/template_summary_by.Rd b/man/template_summary_by.Rd index 68e27e340f..4fb6a3a2a1 100644 --- a/man/template_summary_by.Rd +++ b/man/template_summary_by.Rd @@ -47,11 +47,10 @@ template_summary_by( enabled (see \code{add_total}). Defaults to \code{"All Patients"}. To set a new default \code{total_label} to apply in all modules, run \code{set_default_total_label("new_default")}.} -\item{parallel_vars}{(\code{logical})\cr used to display \code{summarize_vars} as parallel columns -(\code{FALSE} on default). Can be used only if all chosen analysis variables are numeric.} +\item{parallel_vars}{(\code{logical})\cr whether summarized variables should be arranged in columns. Can only be set to +\code{TRUE} if all chosen analysis variables are numeric.} -\item{row_groups}{(\code{logical})\cr used to display \code{summarize_vars} as row groups -(\code{FALSE} on default).} +\item{row_groups}{(\code{logical})\cr whether summarized variables should be arranged in row groups.} \item{na.rm}{(\code{logical})\cr whether \code{NA} values should be removed prior to analysis.} @@ -59,20 +58,20 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{numeric_stats}{(\code{character})\cr -selected statistics for numeric summarize variables to be displayed. Possible values are \code{n}, \code{mean_sd}, \code{mean_ci}, -\code{median}, \code{median_ci}, \code{quantiles}, \code{range}. All are selected by default.} +\item{numeric_stats}{(\code{character})\cr names of statistics to display for numeric summary variables. Available +statistics are \code{n}, \code{mean_sd}, \code{mean_ci}, \code{median}, \code{median_ci}, \code{quantiles}, \code{range}, and \code{geom_mean}.} \item{denominator}{(\code{character})\cr chooses how percentages are calculated. With option \code{N}, the reference population from the column total is used as the denominator. With option \code{n}, the number of non-missing records in this row and column intersection is used as the denominator. If \code{omit} is chosen, then the percentage is omitted.} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} -\item{drop_zero_levels}{(\code{logical})\cr used to remove rows with zero counts from the result table.} +\item{drop_zero_levels}{(\code{logical})\cr whether rows with zero counts in all columns should be removed from the table.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default @@ -80,8 +79,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Template: Summarize Variables by Row Groups Module +Creates a valid expression to generate a table to summarize variables by row groups. } \seealso{ \code{\link[=tm_t_summary_by]{tm_t_summary_by()}} diff --git a/man/tm_t_abnormality.Rd b/man/tm_t_abnormality.Rd index 4484e9f22a..efa947e19b 100644 --- a/man/tm_t_abnormality.Rd +++ b/man/tm_t_abnormality.Rd @@ -72,9 +72,10 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} \item{exclude_base_abn}{(\code{logical})\cr whether to exclude patients who had abnormal values at baseline.} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. For example a title.} diff --git a/man/tm_t_abnormality_by_worst_grade.Rd b/man/tm_t_abnormality_by_worst_grade.Rd index ad589bd719..c37f3d3158 100644 --- a/man/tm_t_abnormality_by_worst_grade.Rd +++ b/man/tm_t_abnormality_by_worst_grade.Rd @@ -68,9 +68,10 @@ value indicating worst grade.} enabled (see \code{add_total}). Defaults to \code{"All Patients"}. To set a new default \code{total_label} to apply in all modules, run \code{set_default_total_label("new_default")}.} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. For example a title.} diff --git a/man/tm_t_events.Rd b/man/tm_t_events.Rd index 049d4cdb4c..a005da7b6d 100644 --- a/man/tm_t_events.Rd +++ b/man/tm_t_events.Rd @@ -68,9 +68,10 @@ alphabetically.} \item{prune_diff}{(\code{number})\cr threshold to use for trimming table using as criteria difference in rates between any two columns.} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} \item{incl_overall_sum}{(\code{flag})\cr whether two rows which summarize the overall number of adverse events should be included at the top of the table.} diff --git a/man/tm_t_events_by_grade.Rd b/man/tm_t_events_by_grade.Rd index 8be99b2cd3..81ff7559ae 100644 --- a/man/tm_t_events_by_grade.Rd +++ b/man/tm_t_events_by_grade.Rd @@ -65,9 +65,10 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. For example a title.} diff --git a/man/tm_t_events_patyear.Rd b/man/tm_t_events_patyear.Rd index 04886bc19a..56157d4bfc 100644 --- a/man/tm_t_events_patyear.Rd +++ b/man/tm_t_events_patyear.Rd @@ -64,9 +64,10 @@ default \code{na_level} to apply in all modules, run \code{set_default_na_str("n \item{conf_level}{(\code{choices_selected})\cr object with all available choices and preselected option for the confidence level, each within range of (0, 1).} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. For example a title.} diff --git a/man/tm_t_mult_events.Rd b/man/tm_t_mult_events.Rd index b37c788875..72755a009e 100644 --- a/man/tm_t_mult_events.Rd +++ b/man/tm_t_mult_events.Rd @@ -56,9 +56,10 @@ default \code{na_level} to apply in all modules, run \code{set_default_na_str("n \item{event_type}{(\code{character})\cr type of event that is summarized (e.g. adverse event, treatment). Default is "event".} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. For example a title.} diff --git a/man/tm_t_shift_by_grade.Rd b/man/tm_t_shift_by_grade.Rd index 21539c47f9..bc38b51c80 100644 --- a/man/tm_t_shift_by_grade.Rd +++ b/man/tm_t_shift_by_grade.Rd @@ -75,9 +75,10 @@ variable for baseline toxicity grade.} enabled (see \code{add_total}). Defaults to \code{"All Patients"}. To set a new default \code{total_label} to apply in all modules, run \code{set_default_total_label("new_default")}.} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. For example a title.} diff --git a/man/tm_t_smq.Rd b/man/tm_t_smq.Rd index 1acd10819b..171096a797 100644 --- a/man/tm_t_smq.Rd +++ b/man/tm_t_smq.Rd @@ -53,9 +53,10 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} by decreasing total number of patients with event. Alternative option \code{alpha} sorts events alphabetically.} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parantname} dataset.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} \item{na_level}{(\code{string})\cr used to replace all \code{NA} or empty values in character or factor variables in the data. Defaults to \code{""}. To set a diff --git a/man/tm_t_summary_by.Rd b/man/tm_t_summary_by.Rd index d1a7b2731d..fb24914fce 100644 --- a/man/tm_t_summary_by.Rd +++ b/man/tm_t_summary_by.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_summary_by.R \name{tm_t_summary_by} \alias{tm_t_summary_by} -\title{Teal Module: Summarize Variables by Row Groups Module} +\title{teal Module: Summarize Variables by Row Groups} \usage{ tm_t_summary_by( label, @@ -60,11 +60,10 @@ summarized.} enabled (see \code{add_total}). Defaults to \code{"All Patients"}. To set a new default \code{total_label} to apply in all modules, run \code{set_default_total_label("new_default")}.} -\item{parallel_vars}{(\code{logical})\cr used to display \code{summarize_vars} as parallel columns -(\code{FALSE} on default). Can be used only if all chosen analysis variables are numeric.} +\item{parallel_vars}{(\code{logical})\cr whether summarized variables should be arranged in columns. Can only be set to +\code{TRUE} if all chosen analysis variables are numeric.} -\item{row_groups}{(\code{logical})\cr used to display \code{summarize_vars} as row groups -(\code{FALSE} on default).} +\item{row_groups}{(\code{logical})\cr whether summarized variables should be arranged in row groups.} \item{useNA}{(\code{character})\cr whether missing data (\code{NA}) should be displayed as a level.} @@ -72,22 +71,20 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{numeric_stats}{(\code{character})\cr -selected statistics for numeric summarize variables to be displayed. Possible values are \code{n}, \code{mean_sd}, \code{mean_ci}, -\code{median}, \code{median_ci}, \code{range}, \code{geom_mean}. By default, \code{n}, \code{mean_sd}, \code{median}, \code{range} are selected.} +\item{numeric_stats}{(\code{character})\cr names of statistics to display for numeric summary variables. Available +statistics are \code{n}, \code{mean_sd}, \code{mean_ci}, \code{median}, \code{median_ci}, \code{quantiles}, \code{range}, and \code{geom_mean}.} \item{denominator}{(\code{character})\cr chooses how percentages are calculated. With option \code{N}, the reference population from the column total is used as the denominator. With option \code{n}, the number of non-missing records in this row and column intersection is used as the denominator. If \code{omit} is chosen, then the percentage is omitted.} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parentname} dataset. -If \code{dataname} dataset and \code{parentname} dataset are the same (i.e. \code{ADSL}), then \code{drop_arm_levels} will always be -TRUE regardless of the user choice when \code{tm_t_summary_by} is called.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} -\item{drop_zero_levels}{(\code{logical})\cr used to remove rows with zero counts from the result table.} +\item{drop_zero_levels}{(\code{logical})\cr whether rows with zero counts in all columns should be removed from the table.} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. For example a title.} @@ -101,8 +98,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -Teal Module: Summarize Variables by Row Groups Module +This module produces a table to summarize variables by row groups. } \examples{ ADSL <- tmc_ex_adsl @@ -145,4 +145,9 @@ app <- init( if (interactive()) { shinyApp(app$ui, app$server) } + +} +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. } From 0eeaed928a795faf13f8760157b200d16ae7fcdf Mon Sep 17 00:00:00 2001 From: edelarua Date: Fri, 2 Feb 2024 15:46:52 +0000 Subject: [PATCH 005/126] [skip actions] Bump version to 0.8.16.9047 --- DESCRIPTION | 4 ++-- NEWS.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 337d780863..63ce6044a4 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9046 -Date: 2024-02-01 +Version: 0.8.16.9047 +Date: 2024-02-02 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), person("Jana", "Stoilova", , "jana.stoilova@roche.com", role = "aut"), diff --git a/NEWS.md b/NEWS.md index 37eaffef5d..76334358b2 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9046 +# teal.modules.clinical 0.8.16.9047 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 7b5828c46b911d15335c9e692c6563718a2aa584 Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Fri, 2 Feb 2024 11:02:25 -0500 Subject: [PATCH 006/126] Clean up documentation for `tm_t_summary` (#1004) Fixes #953 --- R/tm_t_summary.R | 53 +++++++++++++++-------------------------- man/template_summary.Rd | 14 ++++++----- man/tm_t_summary.Rd | 45 ++++++++++++++++------------------ 3 files changed, 47 insertions(+), 65 deletions(-) diff --git a/R/tm_t_summary.R b/R/tm_t_summary.R index a14c3af221..3c9e3bf320 100644 --- a/R/tm_t_summary.R +++ b/R/tm_t_summary.R @@ -1,15 +1,16 @@ #' Template: Summary of Variables #' -#' @param show_labels (`character`)\cr -#' defines whether the labels for `sum_vars` should display. For details see [rtables::analyze()]. -#' @param numeric_stats (`character`)\cr -#' selected statistics for numeric summarize variables to be displayed. Possible values are `n`, `mean_sd`, `mean_ci`, -#' `median`, `median_ci`, `quantiles`, `range` and `geom_mean`. All are selected by default. +#' Creates a valid expression to generate a table to summarize variables. +#' #' @inheritParams template_arguments +#' @param show_labels (`character`)\cr defines whether variable labels should be displayed. Options are +#' `"default"`, `"visible"`, and `"hidden"`. +#' +#' @inherit template_arguments return #' #' @seealso [tm_t_summary()] -#' @keywords internal #' +#' @keywords internal template_summary <- function(dataname, parentname, arm_var, @@ -192,46 +193,29 @@ template_summary <- function(dataname, y } -#' Teal Module: Summary of Variables +#' teal Module: Summary of Variables +#' +#' This module produces a table to summarize variables. #' #' @inheritParams module_arguments #' @inheritParams template_summary -#' @param arm_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' object with all available choices and preselected option for variable names that can be used as `arm_var`. -#' It defines the grouping variable(s) in the results table. If there are two elements selected for `arm_var`, -#' second variable will be nested under the first variable. -#' @param drop_arm_levels (`logical`)\cr drop the unused `arm_var` levels. -#' When `TRUE`, `arm_var` levels are set to those used in the `dataname` dataset. When `FALSE`, -#' `arm_var` levels are set to those used in the `parentname` dataset. -#' If `dataname` dataset and `parentname` dataset are the same (i.e. `ADSL`), then `drop_arm_levels` will always be -#' TRUE regardless of the user choice when `tm_t_summary` is called. -#' @param numeric_stats (`character`)\cr -#' selected statistics for numeric summarize variables to be displayed. Possible values are `n`, `mean_sd`, `mean_ci`, -#' `median`, `median_ci`, `quantiles`, `range` and `geom_mean`. By default, `n`, `mean_sd`, `median`, `range` are -#' selected. #' -#' @export +#' @inherit module_arguments return +#' +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. +#' #' @examples -#' # Preparation of the test case +#' # Preparation of the test case - use `EOSDY` and `DCSREAS` variables to demonstrate missing data. #' ADSL <- tmc_ex_adsl #' ADSL$EOSDY[1] <- NA_integer_ #' -#' # Include `EOSDY` and `DCSREAS` variables below because they contain missing data. -#' stopifnot( -#' any(is.na(ADSL$EOSDY)), -#' any(is.na(ADSL$DCSREAS)) -#' ) -#' #' app <- init( #' data = cdisc_data( #' ADSL = ADSL, #' code = " #' ADSL <- tmc_ex_adsl #' ADSL$EOSDY[1] <- NA_integer_ -#' stopifnot( -#' any(is.na(ADSL$EOSDY)), -#' any(is.na(ADSL$DCSREAS)) -#' ) #' " #' ), #' modules = modules( @@ -252,6 +236,7 @@ template_summary <- function(dataname, #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_t_summary <- function(label, dataname, parentname = ifelse( @@ -317,7 +302,7 @@ tm_t_summary <- function(label, ) } -#' @noRd +#' @keywords internal ui_summary <- function(id, ...) { ns <- shiny::NS(id) a <- list(...) @@ -402,7 +387,7 @@ ui_summary <- function(id, ...) { ) } -#' @noRd +#' @keywords internal srv_summary <- function(id, data, reporter, diff --git a/man/template_summary.Rd b/man/template_summary.Rd index cd9ab11ce7..59a9d6e38f 100644 --- a/man/template_summary.Rd +++ b/man/template_summary.Rd @@ -31,8 +31,8 @@ template_summary( \item{sum_vars}{(\code{character})\cr names of the variables that should be summarized.} -\item{show_labels}{(\code{character})\cr -defines whether the labels for \code{sum_vars} should display. For details see \code{\link[rtables:analyze]{rtables::analyze()}}.} +\item{show_labels}{(\code{character})\cr defines whether variable labels should be displayed. Options are +\code{"default"}, \code{"visible"}, and \code{"hidden"}.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} @@ -48,9 +48,8 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{numeric_stats}{(\code{character})\cr -selected statistics for numeric summarize variables to be displayed. Possible values are \code{n}, \code{mean_sd}, \code{mean_ci}, -\code{median}, \code{median_ci}, \code{quantiles}, \code{range} and \code{geom_mean}. All are selected by default.} +\item{numeric_stats}{(\code{character})\cr names of statistics to display for numeric summary variables. Available +statistics are \code{n}, \code{mean_sd}, \code{mean_ci}, \code{median}, \code{median_ci}, \code{quantiles}, \code{range}, and \code{geom_mean}.} \item{denominator}{(\code{character})\cr chooses how percentages are calculated. With option \code{N}, the reference population from the column total is used as the denominator. With option \code{n}, the number of non-missing @@ -68,8 +67,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Template: Summary of Variables +Creates a valid expression to generate a table to summarize variables. } \seealso{ \code{\link[=tm_t_summary]{tm_t_summary()}} diff --git a/man/tm_t_summary.Rd b/man/tm_t_summary.Rd index 0569f659f1..753dbdcb0f 100644 --- a/man/tm_t_summary.Rd +++ b/man/tm_t_summary.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_summary.R \name{tm_t_summary} \alias{tm_t_summary} -\title{Teal Module: Summary of Variables} +\title{teal Module: Summary of Variables} \usage{ tm_t_summary( label, @@ -31,9 +31,10 @@ tm_t_summary( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -object with all available choices and preselected option for variable names that can be used as \code{arm_var}. -It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, +\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices +and preselected option for variable names that can be used as \code{arm_var}. +It defines the grouping variable(s) in the results table. +If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} \item{summarize_vars}{(\code{choices_selected} or \code{data_extract_spec})\cr names of the variables that should be @@ -51,21 +52,18 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{numeric_stats}{(\code{character})\cr -selected statistics for numeric summarize variables to be displayed. Possible values are \code{n}, \code{mean_sd}, \code{mean_ci}, -\code{median}, \code{median_ci}, \code{quantiles}, \code{range} and \code{geom_mean}. By default, \code{n}, \code{mean_sd}, \code{median}, \code{range} are -selected.} +\item{numeric_stats}{(\code{character})\cr names of statistics to display for numeric summary variables. Available +statistics are \code{n}, \code{mean_sd}, \code{mean_ci}, \code{median}, \code{median_ci}, \code{quantiles}, \code{range}, and \code{geom_mean}.} \item{denominator}{(\code{character})\cr chooses how percentages are calculated. With option \code{N}, the reference population from the column total is used as the denominator. With option \code{n}, the number of non-missing records in this row and column intersection is used as the denominator. If \code{omit} is chosen, then the percentage is omitted.} -\item{drop_arm_levels}{(\code{logical})\cr drop the unused \code{arm_var} levels. -When \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. When \code{FALSE}, -\code{arm_var} levels are set to those used in the \code{parentname} dataset. -If \code{dataname} dataset and \code{parentname} dataset are the same (i.e. \code{ADSL}), then \code{drop_arm_levels} will always be -TRUE regardless of the user choice when \code{tm_t_summary} is called.} +\item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are +set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the +\code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and +user input for this parameter is ignored.} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. For example a title.} @@ -79,30 +77,23 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -Teal Module: Summary of Variables +This module produces a table to summarize variables. } \examples{ -# Preparation of the test case +# Preparation of the test case - use `EOSDY` and `DCSREAS` variables to demonstrate missing data. ADSL <- tmc_ex_adsl ADSL$EOSDY[1] <- NA_integer_ -# Include `EOSDY` and `DCSREAS` variables below because they contain missing data. -stopifnot( - any(is.na(ADSL$EOSDY)), - any(is.na(ADSL$DCSREAS)) -) - app <- init( data = cdisc_data( ADSL = ADSL, code = " ADSL <- tmc_ex_adsl ADSL$EOSDY[1] <- NA_integer_ - stopifnot( - any(is.na(ADSL$EOSDY)), - any(is.na(ADSL$DCSREAS)) - ) " ), modules = modules( @@ -124,3 +115,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} From 4049034315a144200d1b5c153aa99262c24e87d2 Mon Sep 17 00:00:00 2001 From: edelarua Date: Fri, 2 Feb 2024 16:03:26 +0000 Subject: [PATCH 007/126] [skip actions] Bump version to 0.8.16.9048 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 63ce6044a4..5aea6e589c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9047 +Version: 0.8.16.9048 Date: 2024-02-02 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 76334358b2..090071a265 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9047 +# teal.modules.clinical 0.8.16.9048 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 441f680e9f016ceda4772e27b5be263a1424e830 Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Fri, 2 Feb 2024 11:21:00 -0500 Subject: [PATCH 008/126] Clean up documentation for `tm_t_pp_basic_info` (#1024) Fixes #965 --- R/argument_convention.R | 2 ++ R/tm_t_pp_basic_info.R | 29 ++++++++++++++++------------- man/module_arguments.Rd | 2 ++ man/template_arguments.Rd | 2 ++ man/template_basic_info.Rd | 12 +++++++++--- man/tm_t_pp_basic_info.Rd | 13 ++++++++----- 6 files changed, 39 insertions(+), 21 deletions(-) diff --git a/R/argument_convention.R b/R/argument_convention.R index ad8dad0b7e..940a9f26d3 100644 --- a/R/argument_convention.R +++ b/R/argument_convention.R @@ -59,6 +59,7 @@ #' statistics are `n`, `mean_sd`, `mean_ci`, `median`, `median_ci`, `quantiles`, `range`, and `geom_mean`. #' @param paramcd (`character`)\cr variable value designating the studied parameter. #' @param parentname (`character`)\cr parent analysis data used in teal module, usually this refers to `ADSL`. +#' @param patient_id (`character`)\cr patient ID. #' @param prune_diff (`number`)\cr threshold to use for trimming table using as criteria difference in #' rates between any two columns. #' @param prune_freq (`number`)\cr threshold to use for trimming table using event incidence rate in any column. @@ -146,6 +147,7 @@ NULL #' @param llt (`choices_selected` or `data_extract_spec`)\cr name of the variable with low level term for events. #' @param paramcd (`choices_selected` or `data_extract_spec`)\cr variable value designating the studied parameter. #' @param parentname (`character`)\cr parent analysis data used in teal module, usually this refers to `ADSL`. +#' @param patient_col (`character`)\cr name of patient ID variable. #' @param plot_height optional, (`numeric`)\cr a vector of length three with `c(value, min, max)`. Specifies the #' height of the main plot and renders a slider on the plot to interactively adjust the plot height. #' @param plot_width optional, (`numeric`)\cr a vector of length three with `c(value, min, max)`. Specifies the width diff --git a/R/tm_t_pp_basic_info.R b/R/tm_t_pp_basic_info.R index 4c7e68b983..de57922ac2 100644 --- a/R/tm_t_pp_basic_info.R +++ b/R/tm_t_pp_basic_info.R @@ -1,12 +1,15 @@ -#' Template: Basic Info +#' Template: Patient Profile Basic Info #' -#' Creates a basic info template. +#' Creates a valid expression to generate a patient profile basic info report using ADaM datasets. #' #' @inheritParams template_arguments -#' @param vars (`character`)\cr variable names to be shown in Basic Info tab. -#' @param patient_id (`character`)\cr patient ID. -#' @keywords internal +#' @param vars (`character`)\cr names of the variables to be shown in the table. +#' +#' @inherit template_arguments return +#' +#' @seealso [tm_t_pp_basic_info()] #' +#' @keywords internal template_basic_info <- function(dataname = "ANL", vars, patient_id = NULL) { @@ -52,18 +55,16 @@ template_basic_info <- function(dataname = "ANL", y } - -#' Teal Module: Patient Profile Basic Info Teal Module +#' teal Module: Patient Profile Basic Info #' -#' This teal module produces a patient profile basic info report using `ADaM` datasets. +#' This module produces a patient profile basic info report using ADaM datasets. #' #' @inheritParams module_arguments #' @inheritParams template_basic_info -#' @param patient_col (`character`)\cr patient ID column to be used. -#' @param vars ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `ADSL` columns to be shown in Basic Info tab. +#' @param vars ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for variables from `dataname` to show in the table. #' -#' @export +#' @inherit module_arguments return #' #' @examples #' ADSL <- tmc_ex_adsl @@ -89,6 +90,7 @@ template_basic_info <- function(dataname = "ANL", #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_t_pp_basic_info <- function(label, dataname = "ADSL", patient_col = "USUBJID", @@ -124,6 +126,7 @@ tm_t_pp_basic_info <- function(label, ) } +#' @keywords internal ui_t_basic_info <- function(id, ...) { ui_args <- list(...) is_single_dataset_value <- teal.transform::is_single_dataset(ui_args$vars) @@ -162,7 +165,7 @@ ui_t_basic_info <- function(id, ...) { ) } - +#' @keywords internal srv_t_basic_info <- function(id, data, reporter, diff --git a/man/module_arguments.Rd b/man/module_arguments.Rd index 7e5c85b759..35fce73d83 100644 --- a/man/module_arguments.Rd +++ b/man/module_arguments.Rd @@ -67,6 +67,8 @@ needed, the default option is \code{FALSE}.} \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} +\item{patient_col}{(\code{character})\cr name of patient ID variable.} + \item{plot_height}{optional, (\code{numeric})\cr a vector of length three with \code{c(value, min, max)}. Specifies the height of the main plot and renders a slider on the plot to interactively adjust the plot height.} diff --git a/man/template_arguments.Rd b/man/template_arguments.Rd index f92506ecc0..5741dc6b0e 100644 --- a/man/template_arguments.Rd +++ b/man/template_arguments.Rd @@ -85,6 +85,8 @@ statistics are \code{n}, \code{mean_sd}, \code{mean_ci}, \code{median}, \code{me \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} +\item{patient_id}{(\code{character})\cr patient ID.} + \item{prune_diff}{(\code{number})\cr threshold to use for trimming table using as criteria difference in rates between any two columns.} diff --git a/man/template_basic_info.Rd b/man/template_basic_info.Rd index 83789f1831..36be19624e 100644 --- a/man/template_basic_info.Rd +++ b/man/template_basic_info.Rd @@ -2,18 +2,24 @@ % Please edit documentation in R/tm_t_pp_basic_info.R \name{template_basic_info} \alias{template_basic_info} -\title{Template: Basic Info} +\title{Template: Patient Profile Basic Info} \usage{ template_basic_info(dataname = "ANL", vars, patient_id = NULL) } \arguments{ \item{dataname}{(\code{character})\cr analysis data used in teal module.} -\item{vars}{(\code{character})\cr variable names to be shown in Basic Info tab.} +\item{vars}{(\code{character})\cr names of the variables to be shown in the table.} \item{patient_id}{(\code{character})\cr patient ID.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Creates a basic info template. +Creates a valid expression to generate a patient profile basic info report using ADaM datasets. +} +\seealso{ +\code{\link[=tm_t_pp_basic_info]{tm_t_pp_basic_info()}} } \keyword{internal} diff --git a/man/tm_t_pp_basic_info.Rd b/man/tm_t_pp_basic_info.Rd index 234f58caf9..eec7520422 100644 --- a/man/tm_t_pp_basic_info.Rd +++ b/man/tm_t_pp_basic_info.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_pp_basic_info.R \name{tm_t_pp_basic_info} \alias{tm_t_pp_basic_info} -\title{Teal Module: Patient Profile Basic Info Teal Module} +\title{teal Module: Patient Profile Basic Info} \usage{ tm_t_pp_basic_info( label, @@ -18,10 +18,10 @@ tm_t_pp_basic_info( \item{dataname}{(\code{character})\cr analysis data used in teal module.} -\item{patient_col}{(\code{character})\cr patient ID column to be used.} +\item{patient_col}{(\code{character})\cr name of patient ID variable.} -\item{vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{ADSL} columns to be shown in Basic Info tab.} +\item{vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variables from \code{dataname} to show in the table.} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. For example a title.} @@ -29,8 +29,11 @@ For example a title.} \item{post_output}{optional, (\code{shiny.tag})\cr with text placed after the output to put the output into context. For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are useful.} } +\value{ +a \code{teal_module} object. +} \description{ -This teal module produces a patient profile basic info report using \code{ADaM} datasets. +This module produces a patient profile basic info report using ADaM datasets. } \examples{ ADSL <- tmc_ex_adsl From 17209e320594bb31b1d10e9cda631f7afb04c478 Mon Sep 17 00:00:00 2001 From: edelarua Date: Fri, 2 Feb 2024 16:21:52 +0000 Subject: [PATCH 009/126] [skip actions] Bump version to 0.8.16.9049 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 5aea6e589c..d32f7acf64 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9048 +Version: 0.8.16.9049 Date: 2024-02-02 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 090071a265..59c88812d0 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9048 +# teal.modules.clinical 0.8.16.9049 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 8ea026a6c981d9bb08808cdcf3edfef725e17005 Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Fri, 2 Feb 2024 12:06:41 -0500 Subject: [PATCH 010/126] Clean up documentation for `tm_g_pp_adverse_events` (#1026) Fixes #961 --- R/argument_convention.R | 3 ++ R/tm_g_pp_adverse_events.R | 53 +++++++++++++++++----------------- man/module_arguments.Rd | 2 ++ man/template_adverse_events.Rd | 12 ++++++-- man/template_arguments.Rd | 2 ++ man/template_g_km.Rd | 2 +- man/tm_g_pp_adverse_events.Rd | 39 +++++++++++++------------ 7 files changed, 65 insertions(+), 48 deletions(-) diff --git a/R/argument_convention.R b/R/argument_convention.R index 940a9f26d3..42d38a6c25 100644 --- a/R/argument_convention.R +++ b/R/argument_convention.R @@ -38,6 +38,7 @@ #' set to those used in the `dataname` dataset. If `FALSE`, `arm_var` levels are set to those used in the #' `parentname` dataset. If `dataname` and `parentname` are the same, then `drop_arm_levels` is set to `TRUE` and #' user input for this parameter is ignored. +#' @param font_size (`numeric`)\cr font size value. #' @param ggplot2_args optional, (`ggplot2_args`)\cr object created by [teal.widgets::ggplot2_args()] with settings #' for the module plot. The argument is merged with option `teal.ggplot2_args` and with default module arguments #' (hard coded in the module body). @@ -51,6 +52,7 @@ #' @param interact_y (`character`)\cr a selected item from the interact_var column which will be used to select the #' specific `ANCOVA` results. If the interaction is not needed, the default option is `FALSE`. #' @param llt (`character`)\cr name of the variable with low level term for events. +#' @param patient_id (`character`)\cr patient ID. #' @param na_level (`string`)\cr used to replace all `NA` or empty values #' in character or factor variables in the data. Defaults to `""`. To set a #' default `na_level` to apply in all modules, run `set_default_na_str("new_default")`. @@ -136,6 +138,7 @@ NULL #' values and `levels` of default level choices. #' @param fixed_symbol_size (`logical`)\cr When (`TRUE`), the same symbol size is used for plotting each estimate. #' Otherwise, the symbol size will be proportional to the sample size in each each subgroup. +#' @param font_size (`numeric`)\cr numeric vector of length 3 of current, minimum and maximum font size values. #' @param hlt (`choices_selected` or `data_extract_spec`)\cr name of the variable with high level term for events. #' @param id_var (`choices_selected` or `data_extract_spec`)\cr object specifying the variable name for subject id. #' @param interact_var (`character`)\cr name of the variable that should have interactions diff --git a/R/tm_g_pp_adverse_events.R b/R/tm_g_pp_adverse_events.R index ae0709e4f0..728435b402 100644 --- a/R/tm_g_pp_adverse_events.R +++ b/R/tm_g_pp_adverse_events.R @@ -1,6 +1,6 @@ -#' Template: Adverse Events Tab +#' Template: Patient Profile Adverse Events Table and Plot #' -#' Creates an adverse events template call. +#' Creates a valid expression to generate an adverse events table and [ggplot2::ggplot()] plot using ADaM datasets. #' #' @inheritParams template_arguments #' @param aeterm (`character`)\cr name of the reported term for the adverse event variable. @@ -10,10 +10,12 @@ #' @param action (`character`)\cr name of action taken with study treatment variable. #' @param time (`character`)\cr name of study day of start of adverse event variable. #' @param decod (`character`)\cr name of dictionary derived term variable. -#' @param patient_id (`character`)\cr patient ID. -#' @param font_size (`numeric`)\cr numeric vector of length 3 for current, min and max font size values. -#' @keywords internal #' +#' @inherit template_arguments return +#' +#' @seealso [tm_g_pp_adverse_events()] +#' +#' @keywords internal template_adverse_events <- function(dataname = "ANL", aeterm = "AETERM", tox_grade = "AETOXGR", @@ -163,31 +165,28 @@ template_adverse_events <- function(dataname = "ANL", y } -#' Teal Module: Patient Profile Adverse Events Teal Module +#' teal Module: Patient Profile Adverse Events Table and Plot #' -#' This teal module produces a patient profile adverse events table and plot using `ADaM` datasets. +#' This module produces an adverse events table and [ggplot2::ggplot()] type plot using ADaM datasets. #' #' @inheritParams module_arguments #' @inheritParams template_adverse_events -#' @param patient_col (`character`)\cr patient ID column to be used. -#' @param aeterm -#' ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `AETERM` column of the `ADAE` dataset. -#' @param tox_grade ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `AETOXGR` column of the `ADAE` dataset. -#' @param causality ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `AEREL` column of the `ADAE` dataset. -#' @param outcome ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `AEOUT` column of the `ADAE` dataset. -#' @param action ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `AEACN` column of the `ADAE` dataset. -#' @param time ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `ASTDY` column of the `ADAE` dataset. -#' @param decod ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `AEDECOD` column of the `ADAE` dataset. -#' @param font_size (`numeric`)\cr numeric vector of length 3 for current, min and max font size values. +#' @param aeterm ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `AETERM` variable from `dataname`. +#' @param tox_grade ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `AETOXGR` variable from `dataname`. +#' @param causality ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `AEREL` variable from `dataname`. +#' @param outcome ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `AEOUT` variable from `dataname`. +#' @param action ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `AEACN` variable from `dataname`. +#' @param time ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `ASTDY` variable from `dataname`. +#' @param decod ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `AEDECOD` variable from `dataname`. #' -#' @export +#' @inherit module_arguments return #' #' @examples #' library(nestcolor) @@ -243,6 +242,7 @@ template_adverse_events <- function(dataname = "ANL", #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_g_pp_adverse_events <- function(label, dataname = "ADAE", parentname = "ADSL", @@ -310,6 +310,7 @@ tm_g_pp_adverse_events <- function(label, ) } +#' @keywords internal ui_g_adverse_events <- function(id, ...) { ui_args <- list(...) is_single_dataset_value <- teal.transform::is_single_dataset( @@ -411,7 +412,7 @@ ui_g_adverse_events <- function(id, ...) { ) } - +#' @keywords internal srv_g_adverse_events <- function(id, data, filter_panel_api, diff --git a/man/module_arguments.Rd b/man/module_arguments.Rd index 35fce73d83..5f412087cf 100644 --- a/man/module_arguments.Rd +++ b/man/module_arguments.Rd @@ -48,6 +48,8 @@ values and \code{levels} of default level choices.} \item{fixed_symbol_size}{(\code{logical})\cr When (\code{TRUE}), the same symbol size is used for plotting each estimate. Otherwise, the symbol size will be proportional to the sample size in each each subgroup.} +\item{font_size}{(\code{numeric})\cr numeric vector of length 3 of current, minimum and maximum font size values.} + \item{hlt}{(\code{choices_selected} or \code{data_extract_spec})\cr name of the variable with high level term for events.} \item{id_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object specifying the variable name for subject id.} diff --git a/man/template_adverse_events.Rd b/man/template_adverse_events.Rd index 8046b22475..8938245285 100644 --- a/man/template_adverse_events.Rd +++ b/man/template_adverse_events.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_g_pp_adverse_events.R \name{template_adverse_events} \alias{template_adverse_events} -\title{Template: Adverse Events Tab} +\title{Template: Patient Profile Adverse Events Table and Plot} \usage{ template_adverse_events( dataname = "ANL", @@ -37,7 +37,7 @@ template_adverse_events( \item{patient_id}{(\code{character})\cr patient ID.} -\item{font_size}{(\code{numeric})\cr numeric vector of length 3 for current, min and max font size values.} +\item{font_size}{(\code{numeric})\cr font size value.} \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments @@ -45,7 +45,13 @@ for the module plot. The argument is merged with option \code{teal.ggplot2_args} For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Creates an adverse events template call. +Creates a valid expression to generate an adverse events table and \code{\link[ggplot2:ggplot]{ggplot2::ggplot()}} plot using ADaM datasets. +} +\seealso{ +\code{\link[=tm_g_pp_adverse_events]{tm_g_pp_adverse_events()}} } \keyword{internal} diff --git a/man/template_arguments.Rd b/man/template_arguments.Rd index 5741dc6b0e..eb122f858e 100644 --- a/man/template_arguments.Rd +++ b/man/template_arguments.Rd @@ -52,6 +52,8 @@ set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var \code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and user input for this parameter is ignored.} +\item{font_size}{(\code{numeric})\cr font size value.} + \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). diff --git a/man/template_g_km.Rd b/man/template_g_km.Rd index 35d72b182c..ca8a921f22 100644 --- a/man/template_g_km.Rd +++ b/man/template_g_km.Rd @@ -61,7 +61,7 @@ an optimal tick position on the x axis.} object with all available choices and preselected option for variable names that can be used for facet plotting.} -\item{font_size}{(\code{number})\cr font size to be used.} +\item{font_size}{(\code{numeric})\cr font size value.} \item{conf_level}{(\code{numeric})\cr value for the confidence level within the range of (0, 1).} diff --git a/man/tm_g_pp_adverse_events.Rd b/man/tm_g_pp_adverse_events.Rd index 011f1a4096..e7711c6a0f 100644 --- a/man/tm_g_pp_adverse_events.Rd +++ b/man/tm_g_pp_adverse_events.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_g_pp_adverse_events.R \name{tm_g_pp_adverse_events} \alias{tm_g_pp_adverse_events} -\title{Teal Module: Patient Profile Adverse Events Teal Module} +\title{teal Module: Patient Profile Adverse Events Table and Plot} \usage{ tm_g_pp_adverse_events( label, @@ -31,30 +31,30 @@ tm_g_pp_adverse_events( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{patient_col}{(\code{character})\cr patient ID column to be used.} +\item{patient_col}{(\code{character})\cr name of patient ID variable.} -\item{aeterm}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{AETERM} column of the \code{ADAE} dataset.} +\item{aeterm}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{AETERM} variable from \code{dataname}.} -\item{tox_grade}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{AETOXGR} column of the \code{ADAE} dataset.} +\item{tox_grade}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{AETOXGR} variable from \code{dataname}.} -\item{causality}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{AEREL} column of the \code{ADAE} dataset.} +\item{causality}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{AEREL} variable from \code{dataname}.} -\item{outcome}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{AEOUT} column of the \code{ADAE} dataset.} +\item{outcome}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{AEOUT} variable from \code{dataname}.} -\item{action}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{AEACN} column of the \code{ADAE} dataset.} +\item{action}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{AEACN} variable from \code{dataname}.} -\item{time}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{ASTDY} column of the \code{ADAE} dataset.} +\item{time}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{ASTDY} variable from \code{dataname}.} -\item{decod}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{AEDECOD} column of the \code{ADAE} dataset.} +\item{decod}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{AEDECOD} variable from \code{dataname}.} -\item{font_size}{(\code{numeric})\cr numeric vector of length 3 for current, min and max font size values.} +\item{font_size}{(\code{numeric})\cr numeric vector of length 3 of current, minimum and maximum font size values.} \item{plot_height}{optional, (\code{numeric})\cr a vector of length three with \code{c(value, min, max)}. Specifies the height of the main plot and renders a slider on the plot to interactively adjust the plot height.} @@ -74,8 +74,11 @@ for the module plot. The argument is merged with option \code{teal.ggplot2_args} For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -This teal module produces a patient profile adverse events table and plot using \code{ADaM} datasets. +This module produces an adverse events table and \code{\link[ggplot2:ggplot]{ggplot2::ggplot()}} type plot using ADaM datasets. } \examples{ library(nestcolor) From 4a22e22a6d3aea1d163e8c8fd074f98c69cbe489 Mon Sep 17 00:00:00 2001 From: edelarua Date: Fri, 2 Feb 2024 17:07:32 +0000 Subject: [PATCH 011/126] [skip actions] Bump version to 0.8.16.9050 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index d32f7acf64..24bd64c279 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9049 +Version: 0.8.16.9050 Date: 2024-02-02 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 59c88812d0..7d6749b099 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9049 +# teal.modules.clinical 0.8.16.9050 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From b16ac9ae020208f8e1778aff2b238b8de7213d0d Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Fri, 2 Feb 2024 12:18:47 -0500 Subject: [PATCH 012/126] Clean up documentation for `tm_t_pp_prior_medication` (#1023) Fixes #960 --- R/argument_convention.R | 13 ++++++++++++- R/tm_t_pp_prior_medication.R | 33 +++++++++++++------------------- man/module_arguments.Rd | 12 ++++++++++++ man/template_arguments.Rd | 8 ++++++++ man/template_prior_medication.Rd | 12 +++++++++--- man/tm_t_pp_prior_medication.Rd | 25 +++++++++++++----------- 6 files changed, 68 insertions(+), 35 deletions(-) diff --git a/R/argument_convention.R b/R/argument_convention.R index 42d38a6c25..02ad702206 100644 --- a/R/argument_convention.R +++ b/R/argument_convention.R @@ -12,6 +12,7 @@ #' @param add_total (`logical`)\cr whether to include column with total number of patients. #' @param anl_name (`character`)\cr analysis data used in teal module. #' @param arm_var (`character`)\cr variable names that can be used as `arm_var`. +#' @param atirel (`character`)\cr name of time relation of medication variable. #' @param aval `r lifecycle::badge("deprecated")` Please use the `aval_var` argument instead. #' @param avalu `r lifecycle::badge("deprecated")` Please use the `avalu_var` argument instead. #' @param avalu_var (`character`)\cr name of the analysis value unit variable. @@ -23,6 +24,9 @@ #' #' For more details, see the vignette: `vignette("custom-basic-table-arguments", package = "teal.widgets")`. #' @param by_vars (`character`)\cr variable names used to split the summary by rows. +#' @param cmdecod (`character`)\cr name of standardized medication name variable. +#' @param cmindc (`character`)\cr name of indication variable. +#' @param cmstdy (`character`)\cr name of study relative day of start of medication variable. #' @param cnsr_var (`character`)\cr name of the censoring variable. #' @param combine_comp_arms (`logical`)\cr triggers the combination of comparison arms. #' @param compare_arm (`logical`)\cr triggers the comparison between study arms. @@ -52,7 +56,6 @@ #' @param interact_y (`character`)\cr a selected item from the interact_var column which will be used to select the #' specific `ANCOVA` results. If the interaction is not needed, the default option is `FALSE`. #' @param llt (`character`)\cr name of the variable with low level term for events. -#' @param patient_id (`character`)\cr patient ID. #' @param na_level (`string`)\cr used to replace all `NA` or empty values #' in character or factor variables in the data. Defaults to `""`. To set a #' default `na_level` to apply in all modules, run `set_default_na_str("new_default")`. @@ -116,6 +119,8 @@ NULL #' It defines the grouping variable(s) in the results table. #' If there are two elements selected for `arm_var`, #' second variable will be nested under the first variable. +#' @param atirel ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `ATIREL` variable from `dataname`. #' @param aval_var (`choices_selected` or `data_extract_spec`)\cr object with all available choices and preselected #' option for the analysis variable. #' @param avisit (`choices_selected` or `data_extract_spec`)\cr value of analysis visit `AVISIT` of interest. @@ -123,6 +128,12 @@ NULL #' all available choices and preselected option for variable values that can be used as `baseline_var`. #' @param by_vars (`choices_selected` or `data_extract_spec`)\cr object with all available choices and preselected #' option for variable names used to split the summary by rows. +#' @param cmdecod ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `CMDECOD` variable from `dataname`. +#' @param cmindc ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `CMINDC` variable from `dataname`. +#' @param cmstdy ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `CMSTDY` variable from `dataname`. #' @param cnsr_var (`choices_selected` or `data_extract_spec`)\cr object with all available choices and preselected #' option for the censoring variable. #' @param conf_level (`choices_selected`)\cr object with all available choices and preselected option for the diff --git a/R/tm_t_pp_prior_medication.R b/R/tm_t_pp_prior_medication.R index 2d73787df3..afcd36ced9 100644 --- a/R/tm_t_pp_prior_medication.R +++ b/R/tm_t_pp_prior_medication.R @@ -1,14 +1,14 @@ -#' Template: Prior Medication +#' Template: Patient Profile Prior Medication #' -#' Creates a prior medication template. +#' Creates a valid expression to generate a patient profile prior medication report using ADaM datasets. #' #' @inheritParams template_arguments -#' @param atirel (`character`)\cr name of time relation of medication variable. -#' @param cmdecod (`character`)\cr name of standardized medication name variable. -#' @param cmindc (`character`)\cr name of indication variable. -#' @param cmstdy (`character`)\cr name of study day of start of medication variable. -#' @keywords internal #' +#' @inherit template_arguments return +#' +#' @seealso [tm_t_pp_prior_medication()] +#' +#' @keywords internal template_prior_medication <- function(dataname = "ANL", atirel = "ATIREL", cmdecod = "CMDECOD", @@ -54,23 +54,14 @@ template_prior_medication <- function(dataname = "ANL", y } -#' Teal Module: Patient Prior Medication Teal Module +#' teal Module: Patient Profile Prior Medication #' -#' This teal module produces a patient prior medication report using `ADaM` datasets. +#' This module produces a patient profile prior medication report using ADaM datasets. #' #' @inheritParams module_arguments #' @inheritParams template_prior_medication -#' @param patient_col (`character`)\cr patient ID column to be used. -#' @param atirel ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `ATIREL` column of the `ADCM` dataset. -#' @param cmdecod ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `CMDECOD` column of the `ADCM` dataset. -#' @param cmindc ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `CMINDC` column of the `ADCM` dataset. -#' @param cmstdy ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `CMSTDY` column of the `ADCM` dataset. #' -#' @export +#' @inherit module_arguments return #' #' @examples #' ADCM <- tmc_ex_adcm @@ -123,6 +114,7 @@ template_prior_medication <- function(dataname = "ANL", #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_t_pp_prior_medication <- function(label, dataname = "ADCM", parentname = "ADSL", @@ -167,6 +159,7 @@ tm_t_pp_prior_medication <- function(label, ) } +#' @keywords internal ui_t_prior_medication <- function(id, ...) { ui_args <- list(...) is_single_dataset_value <- teal.transform::is_single_dataset( @@ -227,7 +220,7 @@ ui_t_prior_medication <- function(id, ...) { ) } - +#' @keywords internal srv_t_prior_medication <- function(id, data, reporter, diff --git a/man/module_arguments.Rd b/man/module_arguments.Rd index 5f412087cf..e67de1bdfd 100644 --- a/man/module_arguments.Rd +++ b/man/module_arguments.Rd @@ -16,6 +16,9 @@ It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} +\item{atirel}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{ATIREL} variable from \code{dataname}.} + \item{aval_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected option for the analysis variable.} @@ -27,6 +30,15 @@ all available choices and preselected option for variable values that can be use \item{by_vars}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected option for variable names used to split the summary by rows.} +\item{cmdecod}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{CMDECOD} variable from \code{dataname}.} + +\item{cmindc}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{CMINDC} variable from \code{dataname}.} + +\item{cmstdy}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{CMSTDY} variable from \code{dataname}.} + \item{cnsr_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected option for the censoring variable.} diff --git a/man/template_arguments.Rd b/man/template_arguments.Rd index eb122f858e..261cde7fa0 100644 --- a/man/template_arguments.Rd +++ b/man/template_arguments.Rd @@ -10,6 +10,8 @@ \item{arm_var}{(\code{character})\cr variable names that can be used as \code{arm_var}.} +\item{atirel}{(\code{character})\cr name of time relation of medication variable.} + \item{aval}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Please use the \code{aval_var} argument instead.} \item{avalu}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Please use the \code{avalu_var} argument instead.} @@ -28,6 +30,12 @@ For more details, see the vignette: \code{vignette("custom-basic-table-arguments \item{by_vars}{(\code{character})\cr variable names used to split the summary by rows.} +\item{cmdecod}{(\code{character})\cr name of standardized medication name variable.} + +\item{cmindc}{(\code{character})\cr name of indication variable.} + +\item{cmstdy}{(\code{character})\cr name of study relative day of start of medication variable.} + \item{cnsr_var}{(\code{character})\cr name of the censoring variable.} \item{combine_comp_arms}{(\code{logical})\cr triggers the combination of comparison arms.} diff --git a/man/template_prior_medication.Rd b/man/template_prior_medication.Rd index 243ffea822..f3c393d041 100644 --- a/man/template_prior_medication.Rd +++ b/man/template_prior_medication.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_pp_prior_medication.R \name{template_prior_medication} \alias{template_prior_medication} -\title{Template: Prior Medication} +\title{Template: Patient Profile Prior Medication} \usage{ template_prior_medication( dataname = "ANL", @@ -21,9 +21,15 @@ template_prior_medication( \item{cmindc}{(\code{character})\cr name of indication variable.} -\item{cmstdy}{(\code{character})\cr name of study day of start of medication variable.} +\item{cmstdy}{(\code{character})\cr name of study relative day of start of medication variable.} +} +\value{ +a \code{list} of expressions to generate a table or plot object. } \description{ -Creates a prior medication template. +Creates a valid expression to generate a patient profile prior medication report using ADaM datasets. +} +\seealso{ +\code{\link[=tm_t_pp_prior_medication]{tm_t_pp_prior_medication()}} } \keyword{internal} diff --git a/man/tm_t_pp_prior_medication.Rd b/man/tm_t_pp_prior_medication.Rd index e6ee438be4..83adabd3f8 100644 --- a/man/tm_t_pp_prior_medication.Rd +++ b/man/tm_t_pp_prior_medication.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_pp_prior_medication.R \name{tm_t_pp_prior_medication} \alias{tm_t_pp_prior_medication} -\title{Teal Module: Patient Prior Medication Teal Module} +\title{teal Module: Patient Profile Prior Medication} \usage{ tm_t_pp_prior_medication( label, @@ -24,19 +24,19 @@ tm_t_pp_prior_medication( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{patient_col}{(\code{character})\cr patient ID column to be used.} +\item{patient_col}{(\code{character})\cr name of patient ID variable.} -\item{atirel}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{ATIREL} column of the \code{ADCM} dataset.} +\item{atirel}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{ATIREL} variable from \code{dataname}.} -\item{cmdecod}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{CMDECOD} column of the \code{ADCM} dataset.} +\item{cmdecod}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{CMDECOD} variable from \code{dataname}.} -\item{cmindc}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{CMINDC} column of the \code{ADCM} dataset.} +\item{cmindc}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{CMINDC} variable from \code{dataname}.} -\item{cmstdy}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{CMSTDY} column of the \code{ADCM} dataset.} +\item{cmstdy}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{CMSTDY} variable from \code{dataname}.} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. For example a title.} @@ -44,8 +44,11 @@ For example a title.} \item{post_output}{optional, (\code{shiny.tag})\cr with text placed after the output to put the output into context. For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are useful.} } +\value{ +a \code{teal_module} object. +} \description{ -This teal module produces a patient prior medication report using \code{ADaM} datasets. +This module produces a patient profile prior medication report using ADaM datasets. } \examples{ ADCM <- tmc_ex_adcm From 95ad37e718ea0f8e5be9df0c3214edc635c930ae Mon Sep 17 00:00:00 2001 From: edelarua Date: Fri, 2 Feb 2024 17:19:46 +0000 Subject: [PATCH 013/126] [skip actions] Bump version to 0.8.16.9051 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 24bd64c279..826455cd4c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9050 +Version: 0.8.16.9051 Date: 2024-02-02 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 7d6749b099..7168319787 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9050 +# teal.modules.clinical 0.8.16.9051 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 5d6d81ebbe210199358bc7d074d6828f9e7f2f1f Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Fri, 2 Feb 2024 12:29:20 -0500 Subject: [PATCH 014/126] Clean up documentation for `tm_t_pp_medical_history` (#1022) Fixes #972 --- R/tm_t_pp_medical_history.R | 36 ++++++++++++++++++--------------- man/template_medical_history.Rd | 12 ++++++++--- man/tm_t_pp_medical_history.Rd | 21 ++++++++++--------- 3 files changed, 41 insertions(+), 28 deletions(-) diff --git a/R/tm_t_pp_medical_history.R b/R/tm_t_pp_medical_history.R index c7054252ab..9ec5309fbb 100644 --- a/R/tm_t_pp_medical_history.R +++ b/R/tm_t_pp_medical_history.R @@ -1,14 +1,17 @@ -#' Template: Medical History +#' Template: Patient Profile Medical History #' -#' Creates medical history template. +#' Creates a valid expression to generate a patient profile medical history report using ADaM datasets. #' #' @inheritParams template_arguments -#' @param mhterm (`character`)\cr name of the reported name for medical history variable. +#' @param mhterm (`character`)\cr name of the reported term for the medical history variable. #' @param mhbodsys (`character`)\cr name of the body system or organ class variable. #' @param mhdistat (`character`)\cr name of the status of the disease variable. -#' @param patient_id (`character`)\cr patient ID. -#' @keywords internal #' +#' @inherit template_arguments return +#' +#' @seealso [tm_t_pp_medical_history()] +#' +#' @keywords internal template_medical_history <- function(dataname = "ANL", mhterm = "MHTERM", mhbodsys = "MHBODSYS", @@ -73,21 +76,20 @@ template_medical_history <- function(dataname = "ANL", y } -#' Teal Module: Patient Medical History Teal Module +#' teal Module: Patient Profile Medical History #' -#' This teal module produces a patient medical history report using `ADaM` datasets. +#' This module produces a patient profile medical history report using ADaM datasets. #' #' @inheritParams module_arguments #' @inheritParams template_medical_history -#' @param patient_col (`character`)\cr patient ID column to be used. -#' @param mhterm ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `MHTERM` column of the `ADMH` dataset. -#' @param mhbodsys ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `MHBODSYS` column of the `ADMH` dataset. -#' @param mhdistat ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `MHDISTAT` column of the `ADMH` dataset. +#' @param mhterm ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `MHTERM` variable from `dataname`. +#' @param mhbodsys ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `MHBODSYS` variable from `dataname`. +#' @param mhdistat ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `MHDISTAT` variable from `dataname`. #' -#' @export +#' @inherit module_arguments return #' #' @examples #' ADSL <- tmc_ex_adsl @@ -127,6 +129,7 @@ template_medical_history <- function(dataname = "ANL", #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_t_pp_medical_history <- function(label, dataname = "ADMH", parentname = "ADSL", @@ -169,6 +172,7 @@ tm_t_pp_medical_history <- function(label, ) } +#' @keywords internal ui_t_medical_history <- function(id, ...) { ui_args <- list(...) is_single_dataset_value <- teal.transform::is_single_dataset( @@ -222,7 +226,7 @@ ui_t_medical_history <- function(id, ...) { ) } - +#' @keywords internal srv_t_medical_history <- function(id, data, reporter, diff --git a/man/template_medical_history.Rd b/man/template_medical_history.Rd index 4b619df509..52d161aeb0 100644 --- a/man/template_medical_history.Rd +++ b/man/template_medical_history.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_pp_medical_history.R \name{template_medical_history} \alias{template_medical_history} -\title{Template: Medical History} +\title{Template: Patient Profile Medical History} \usage{ template_medical_history( dataname = "ANL", @@ -15,7 +15,7 @@ template_medical_history( \arguments{ \item{dataname}{(\code{character})\cr analysis data used in teal module.} -\item{mhterm}{(\code{character})\cr name of the reported name for medical history variable.} +\item{mhterm}{(\code{character})\cr name of the reported term for the medical history variable.} \item{mhbodsys}{(\code{character})\cr name of the body system or organ class variable.} @@ -23,7 +23,13 @@ template_medical_history( \item{patient_id}{(\code{character})\cr patient ID.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Creates medical history template. +Creates a valid expression to generate a patient profile medical history report using ADaM datasets. +} +\seealso{ +\code{\link[=tm_t_pp_medical_history]{tm_t_pp_medical_history()}} } \keyword{internal} diff --git a/man/tm_t_pp_medical_history.Rd b/man/tm_t_pp_medical_history.Rd index a23e6b00af..80f2645138 100644 --- a/man/tm_t_pp_medical_history.Rd +++ b/man/tm_t_pp_medical_history.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_pp_medical_history.R \name{tm_t_pp_medical_history} \alias{tm_t_pp_medical_history} -\title{Teal Module: Patient Medical History Teal Module} +\title{teal Module: Patient Profile Medical History} \usage{ tm_t_pp_medical_history( label, @@ -23,16 +23,16 @@ tm_t_pp_medical_history( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{patient_col}{(\code{character})\cr patient ID column to be used.} +\item{patient_col}{(\code{character})\cr name of patient ID variable.} -\item{mhterm}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{MHTERM} column of the \code{ADMH} dataset.} +\item{mhterm}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{MHTERM} variable from \code{dataname}.} -\item{mhbodsys}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{MHBODSYS} column of the \code{ADMH} dataset.} +\item{mhbodsys}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{MHBODSYS} variable from \code{dataname}.} -\item{mhdistat}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{MHDISTAT} column of the \code{ADMH} dataset.} +\item{mhdistat}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{MHDISTAT} variable from \code{dataname}.} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. For example a title.} @@ -40,8 +40,11 @@ For example a title.} \item{post_output}{optional, (\code{shiny.tag})\cr with text placed after the output to put the output into context. For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are useful.} } +\value{ +a \code{teal_module} object. +} \description{ -This teal module produces a patient medical history report using \code{ADaM} datasets. +This module produces a patient profile medical history report using ADaM datasets. } \examples{ ADSL <- tmc_ex_adsl From 3c00dccae7eea5a86ec93daf2ed2974876334e5a Mon Sep 17 00:00:00 2001 From: edelarua Date: Fri, 2 Feb 2024 17:30:17 +0000 Subject: [PATCH 015/126] [skip actions] Bump version to 0.8.16.9052 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 826455cd4c..5ed65d13b1 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9051 +Version: 0.8.16.9052 Date: 2024-02-02 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 7168319787..27df8e3e14 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9051 +# teal.modules.clinical 0.8.16.9052 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 0f10b6683e55cdfda29ebc21a1658a4b02caf6aa Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Fri, 2 Feb 2024 12:38:48 -0500 Subject: [PATCH 016/126] Clean up documentation for `tm_g_forest_rsp` (#1020) Fixes #962 --- R/tm_g_forest_rsp.R | 47 ++++++++++-------------- R/tm_g_forest_tte.R | 8 ---- man/template_forest_rsp.Rd | 22 +++++------ man/template_forest_tte.Rd | 13 +++---- man/tm_g_forest_rsp.Rd | 22 ++++++----- tests/testthat/_snaps/tm_g_forest_rsp.md | 2 +- 6 files changed, 49 insertions(+), 65 deletions(-) diff --git a/R/tm_g_forest_rsp.R b/R/tm_g_forest_rsp.R index 9f13278c1f..b52dd6e78d 100644 --- a/R/tm_g_forest_rsp.R +++ b/R/tm_g_forest_rsp.R @@ -1,27 +1,25 @@ #' Template: Response Forest Plot #' -#' Creates a valid expression for response forest plot. +#' Creates a valid expression to generate a response forest plot. #' #' @inheritParams template_arguments -#' @param obj_var_name (`character`)\cr additional text string append to output title. +#' @param obj_var_name (`character`)\cr additional text to append to the table title. #' @param responders (`character`)\cr values of `aval_var` that are considered to be responders. -#' @param col_symbol_size (`integer`)\cr column index to be used to determine relative size for +#' @param col_symbol_size (`integer` or `NULL`)\cr column index to be used to determine relative size for #' estimator plot symbol. Typically, the symbol size is proportional to the sample size used #' to calculate the estimator. If `NULL`, the same symbol size is used for all subgroups. -#' @param strata_var (`character`)\cr -#' names of the variables for stratified analysis. -#' @param ggplot2_args optional, (`ggplot2_args`)\cr -#' object created by [teal.widgets::ggplot2_args()] with settings for the module plot. -#' For this module, this argument will only accept `ggplot2_args` object with `labs` list of following child elements: -#' `title`, `caption`. -#' No other elements would be taken into account. The argument is merged with option `teal.ggplot2_args` and -#' with default module arguments (hard coded in the module body). +#' @param ggplot2_args optional, (`ggplot2_args`)\cr object created by [teal.widgets::ggplot2_args()] with settings +#' for the module plot. For this module, this argument will only accept `ggplot2_args` object with `labs` list of +#' following child elements: `title`, `caption`. No other elements would be taken into account. The argument is +#' merged with option `teal.ggplot2_args` and with default module arguments (hard coded in the module body). #' -#' For more details, see the vignette: `vignette("custom-ggplot2-arguments", package = "teal.widgets")`. +#' For more details, see the vignette: `vignette("custom-ggplot2-arguments", package = "teal.widgets")`. +#' +#' @inherit template_arguments return #' #' @seealso [tm_g_forest_rsp()] -#' @keywords internal #' +#' @keywords internal template_forest_rsp <- function(dataname = "ANL", parentname = "ADSL", arm_var, @@ -160,7 +158,7 @@ template_forest_rsp <- function(dataname = "ANL", all_ggplot2_args <- teal.widgets::resolve_ggplot2_args( user_plot = ggplot2_args, module_plot = teal.widgets::ggplot2_args( - labs = list(title = paste0("Forest plot of best overall response for ", obj_var_name), caption = "") + labs = list(title = paste0("Forest Plot of Best Overall Response for ", obj_var_name), caption = "") ) ) @@ -192,24 +190,17 @@ template_forest_rsp <- function(dataname = "ANL", y } -#' Teal Module: Forest Response Plot teal module +#' teal Module: Forest Response Plot #' -#' This teal module produces a grid style Forest plot for response data with `ADaM` structure. +#' This module produces a grid-style forest plot for response data with ADaM structure. #' #' @inheritParams module_arguments #' @inheritParams template_forest_rsp -#' @param ggplot2_args optional, (`ggplot2_args`)\cr -#' object created by [teal.widgets::ggplot2_args()] with settings for the module plot. -#' For this module, this argument will only accept `ggplot2_args` object with `labs` list of following child elements: -#' `title`, `caption`. -#' No other elements would be taken into account. The argument is merged with option `teal.ggplot2_args` and -#' with default module arguments (hard coded in the module body). -#' -#' For more details, see the vignette: `vignette("custom-ggplot2-arguments", package = "teal.widgets")`. #' -#' @export +#' @inherit module_arguments return #' -#' @template author_song24 +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. #' #' @examples #' library(nestcolor) @@ -292,6 +283,7 @@ template_forest_rsp <- function(dataname = "ANL", #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_g_forest_rsp <- function(label, dataname, parentname = ifelse( @@ -369,7 +361,7 @@ tm_g_forest_rsp <- function(label, ) } -#' @noRd +#' @keywords internal ui_g_forest_rsp <- function(id, ...) { a <- list(...) # module args is_single_dataset_value <- teal.transform::is_single_dataset(a$arm_var, a$paramcd, a$subgroup_var, a$strata_var) @@ -452,6 +444,7 @@ ui_g_forest_rsp <- function(id, ...) { ) } +#' @keywords internal srv_g_forest_rsp <- function(id, data, reporter, diff --git a/R/tm_g_forest_tte.R b/R/tm_g_forest_tte.R index 177d4fdf03..ecd5184897 100644 --- a/R/tm_g_forest_tte.R +++ b/R/tm_g_forest_tte.R @@ -4,14 +4,6 @@ #' #' @inheritParams template_arguments #' @inheritParams template_forest_rsp -#' @param ggplot2_args optional, (`ggplot2_args`)\cr -#' object created by [teal.widgets::ggplot2_args()] with settings for the module plot. -#' For this module, this argument will only accept `ggplot2_args` object with `labs` list of following child elements: -#' `title`, `caption`. -#' No other elements would be taken into account. The argument is merged with option `teal.ggplot2_args` and -#' with default module arguments (hard coded in the module body). -#' -#' For more details, see the vignette: `vignette("custom-ggplot2-arguments", package = "teal.widgets")`. #' #' @seealso [tm_g_forest_tte()] #' @keywords internal diff --git a/man/template_forest_rsp.Rd b/man/template_forest_rsp.Rd index 57d610a637..5ecd16fc1c 100644 --- a/man/template_forest_rsp.Rd +++ b/man/template_forest_rsp.Rd @@ -31,7 +31,7 @@ template_forest_rsp( \item{comp_arm}{(\code{character})\cr the level of comparison arm in case of arm comparison.} -\item{obj_var_name}{(\code{character})\cr additional text string append to output title.} +\item{obj_var_name}{(\code{character})\cr additional text to append to the table title.} \item{aval_var}{(\code{character})\cr name of the analysis value variable.} @@ -39,26 +39,26 @@ template_forest_rsp( \item{subgroup_var}{(\code{character})\cr with variable names that can be used as subgroups.} -\item{strata_var}{(\code{character})\cr -names of the variables for stratified analysis.} +\item{strata_var}{(\code{character})\cr names of the variables for stratified analysis.} \item{conf_level}{(\code{numeric})\cr value for the confidence level within the range of (0, 1).} -\item{col_symbol_size}{(\code{integer})\cr column index to be used to determine relative size for +\item{col_symbol_size}{(\code{integer} or \code{NULL})\cr column index to be used to determine relative size for estimator plot symbol. Typically, the symbol size is proportional to the sample size used to calculate the estimator. If \code{NULL}, the same symbol size is used for all subgroups.} -\item{ggplot2_args}{optional, (\code{ggplot2_args})\cr -object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. -For this module, this argument will only accept \code{ggplot2_args} object with \code{labs} list of following child elements: -\code{title}, \code{caption}. -No other elements would be taken into account. The argument is merged with option \code{teal.ggplot2_args} and -with default module arguments (hard coded in the module body). +\item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings +for the module plot. For this module, this argument will only accept \code{ggplot2_args} object with \code{labs} list of +following child elements: \code{title}, \code{caption}. No other elements would be taken into account. The argument is +merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Creates a valid expression for response forest plot. +Creates a valid expression to generate a response forest plot. } \seealso{ \code{\link[=tm_g_forest_rsp]{tm_g_forest_rsp()}} diff --git a/man/template_forest_tte.Rd b/man/template_forest_tte.Rd index f149dc5124..f739fe9ba2 100644 --- a/man/template_forest_tte.Rd +++ b/man/template_forest_tte.Rd @@ -32,7 +32,7 @@ template_forest_tte( \item{comp_arm}{(\code{character})\cr the level of comparison arm in case of arm comparison.} -\item{obj_var_name}{(\code{character})\cr additional text string append to output title.} +\item{obj_var_name}{(\code{character})\cr additional text to append to the table title.} \item{aval_var}{(\code{character})\cr name of the analysis value variable.} @@ -44,18 +44,15 @@ template_forest_tte( \item{conf_level}{(\code{numeric})\cr value for the confidence level within the range of (0, 1).} -\item{col_symbol_size}{(\code{integer})\cr column index to be used to determine relative size for +\item{col_symbol_size}{(\code{integer} or \code{NULL})\cr column index to be used to determine relative size for estimator plot symbol. Typically, the symbol size is proportional to the sample size used to calculate the estimator. If \code{NULL}, the same symbol size is used for all subgroups.} \item{time_unit_var}{(\code{character})\cr name of the variable representing time units.} -\item{ggplot2_args}{optional, (\code{ggplot2_args})\cr -object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. -For this module, this argument will only accept \code{ggplot2_args} object with \code{labs} list of following child elements: -\code{title}, \code{caption}. -No other elements would be taken into account. The argument is merged with option \code{teal.ggplot2_args} and -with default module arguments (hard coded in the module body). +\item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings +for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments +(hard coded in the module body). For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } diff --git a/man/tm_g_forest_rsp.Rd b/man/tm_g_forest_rsp.Rd index 8e3d9505ce..041e56b242 100644 --- a/man/tm_g_forest_rsp.Rd +++ b/man/tm_g_forest_rsp.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_g_forest_rsp.R \name{tm_g_forest_rsp} \alias{tm_g_forest_rsp} -\title{Teal Module: Forest Response Plot teal module} +\title{teal Module: Forest Response Plot} \usage{ tm_g_forest_rsp( label, @@ -82,17 +82,18 @@ For example a title.} \item{post_output}{optional, (\code{shiny.tag})\cr with text placed after the output to put the output into context. For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are useful.} -\item{ggplot2_args}{optional, (\code{ggplot2_args})\cr -object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. -For this module, this argument will only accept \code{ggplot2_args} object with \code{labs} list of following child elements: -\code{title}, \code{caption}. -No other elements would be taken into account. The argument is merged with option \code{teal.ggplot2_args} and -with default module arguments (hard coded in the module body). +\item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings +for the module plot. For this module, this argument will only accept \code{ggplot2_args} object with \code{labs} list of +following child elements: \code{title}, \code{caption}. No other elements would be taken into account. The argument is +merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -This teal module produces a grid style Forest plot for response data with \code{ADaM} structure. +This module produces a grid-style forest plot for response data with ADaM structure. } \examples{ library(nestcolor) @@ -176,6 +177,7 @@ if (interactive()) { } } -\author{ -Yuyao Song (songy24) \email{yuyao.song@roche.com} +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. } diff --git a/tests/testthat/_snaps/tm_g_forest_rsp.md b/tests/testthat/_snaps/tm_g_forest_rsp.md index ed77908703..0d3adc8f89 100644 --- a/tests/testthat/_snaps/tm_g_forest_rsp.md +++ b/tests/testthat/_snaps/tm_g_forest_rsp.md @@ -32,7 +32,7 @@ $plot { p <- decorate_grob(g_forest(tbl = result, col_symbol_size = NULL), - titles = "Forest plot of best overall response for ", + titles = "Forest Plot of Best Overall Response for ", footnotes = "", gp_footnotes = grid::gpar(fontsize = 12)) grid::grid.newpage() grid::grid.draw(p) From 536285bebb73343526fd1a24457270d14391fc2b Mon Sep 17 00:00:00 2001 From: edelarua Date: Fri, 2 Feb 2024 17:39:42 +0000 Subject: [PATCH 017/126] [skip actions] Bump version to 0.8.16.9053 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 5ed65d13b1..1e6c26eeb3 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9052 +Version: 0.8.16.9053 Date: 2024-02-02 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 27df8e3e14..344d3ac44e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9052 +# teal.modules.clinical 0.8.16.9053 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 7a7b0d0f113c97a44a2b1d01dbd7695d53e1bfa8 Mon Sep 17 00:00:00 2001 From: edelarua Date: Fri, 2 Feb 2024 17:40:37 +0000 Subject: [PATCH 018/126] [skip actions] Update WORDLIST --- inst/WORDLIST | 2 -- 1 file changed, 2 deletions(-) diff --git a/inst/WORDLIST b/inst/WORDLIST index 160ba33ad9..390ab45c31 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -14,7 +14,6 @@ SMQ TLG UI Univariable -Yuyao customizable de funder @@ -24,7 +23,6 @@ programmatically repo responder responders -songy timepoint unadjusted univariable From 194f47031664d0be3e7f47012797f6e261ba77ac Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Fri, 2 Feb 2024 13:03:30 -0500 Subject: [PATCH 019/126] Clean up documentation for `tm_g_pp_therapy` (#1025) Fixes #975 --- R/argument_convention.R | 1 + R/tm_g_pp_therapy.R | 61 ++++++++++++++++++----------------------- man/template_therapy.Rd | 15 +++++++--- man/tm_g_pp_therapy.Rd | 51 ++++++++++++++++++---------------- 4 files changed, 65 insertions(+), 63 deletions(-) diff --git a/R/argument_convention.R b/R/argument_convention.R index 02ad702206..028898a120 100644 --- a/R/argument_convention.R +++ b/R/argument_convention.R @@ -56,6 +56,7 @@ #' @param interact_y (`character`)\cr a selected item from the interact_var column which will be used to select the #' specific `ANCOVA` results. If the interaction is not needed, the default option is `FALSE`. #' @param llt (`character`)\cr name of the variable with low level term for events. +#' @param patient_id (`character`)\cr patient ID. #' @param na_level (`string`)\cr used to replace all `NA` or empty values #' in character or factor variables in the data. Defaults to `""`. To set a #' default `na_level` to apply in all modules, run `set_default_na_str("new_default")`. diff --git a/R/tm_g_pp_therapy.R b/R/tm_g_pp_therapy.R index 8504b26c12..0fcf150a7b 100644 --- a/R/tm_g_pp_therapy.R +++ b/R/tm_g_pp_therapy.R @@ -1,22 +1,21 @@ -#' Template: Therapy +#' Template: Patient Profile Therapy Table and Plot #' -#' Creates a therapy template call. +#' Creates a valid expression to generate a patient profile therapy table and [ggplot2::ggplot()] plot using ADaM +#' datasets. #' #' @inheritParams template_arguments -#' @param atirel (`character`)\cr name of time relation of medication variable. -#' @param cmdecod (`character`)\cr name of standardized medication name variable. -#' @param cmindc (`character`)\cr name of indication variable. #' @param cmdose (`character`)\cr name of dose per administration variable. #' @param cmtrt (`character`)\cr name of reported name of drug, med, or therapy variable. #' @param cmdosu (`character`)\cr name of dose units variable. #' @param cmroute (`character`)\cr name of route of administration variable. #' @param cmdosfrq (`character`)\cr name of dosing frequency per interval variable. -#' @param cmstdy (`character`)\cr name of study day of start of medication variable. #' @param cmendy (`character`)\cr name of study day of end of medication variable. -#' @param patient_id (`character`)\cr patient ID. -#' @param font_size (`numeric`)\cr numeric vector of length 3 for current, min and max font size values. -#' @keywords internal #' +#' @inherit template_arguments return +#' +#' @seealso [tm_g_pp_therapy()] +#' +#' @keywords internal template_therapy <- function(dataname = "ANL", atirel = "ATIREL", cmdecod = "CMDECOD", @@ -230,36 +229,26 @@ template_therapy <- function(dataname = "ANL", y } -#' Teal Module: Patient Profile Therapy Teal Module +#' teal Module: Patient Profile Therapy Table and Plot #' -#' This teal module produces a patient profile therapy plot using `ADaM` datasets. +#' This module produces a patient profile therapy table and [ggplot2::ggplot()] type plot using ADaM datasets. #' #' @inheritParams module_arguments #' @inheritParams template_therapy -#' @param patient_col (`character`)\cr patient ID column to be used. -#' @param atirel ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `ATIREL` column of the `ADCM` dataset. -#' @param cmdecod ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `CMDECOD` column of the `ADCM` dataset. -#' @param cmdose ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `CMDOSE` column of the `ADCM` dataset. -#' @param cmtrt ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `CMTRT` column of the `ADCM` dataset. -#' @param cmdosu ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `CMDOSU` column of the `ADCM` dataset. -#' @param cmroute ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `CMROUTE` column of the `ADCM` dataset. -#' @param cmdosfrq ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `CMDOSFRQ` column of the `ADCM` dataset. -#' @param cmstdy ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `CMSTDY` column of the `ADCM` dataset. -#' @param cmendy ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `CMENDY` column of the `ADCM` dataset. -#' @param cmindc ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `CMINDC` column of the `ADCM` dataset. -#' @param font_size (`numeric`)\cr numeric vector of length 3 for current, min and max font size values. +#' @param cmdose ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `CMDOSE` variable from `dataname`. +#' @param cmtrt ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `CMTRT` variable from `dataname`. +#' @param cmdosu ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `CMDOSU` variable from `dataname`. +#' @param cmroute ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `CMROUTE` variable from `dataname`. +#' @param cmdosfrq ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `CMDOSFRQ` variable from `dataname`. +#' @param cmendy ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `CMENDY` variable from `dataname`. #' -#' @export +#' @inherit module_arguments return #' #' @examples #' library(nestcolor) @@ -339,6 +328,7 @@ template_therapy <- function(dataname = "ANL", #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_g_pp_therapy <- function(label, dataname = "ADCM", parentname = "ADSL", @@ -412,6 +402,7 @@ tm_g_pp_therapy <- function(label, ) } +#' @keywords internal ui_g_therapy <- function(id, ...) { ui_args <- list(...) is_single_dataset_value <- teal.transform::is_single_dataset( @@ -531,7 +522,7 @@ ui_g_therapy <- function(id, ...) { ) } - +#' @keywords internal srv_g_therapy <- function(id, data, reporter, diff --git a/man/template_therapy.Rd b/man/template_therapy.Rd index 53248b12d0..f56ccbca6d 100644 --- a/man/template_therapy.Rd +++ b/man/template_therapy.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_g_pp_therapy.R \name{template_therapy} \alias{template_therapy} -\title{Template: Therapy} +\title{Template: Patient Profile Therapy Table and Plot} \usage{ template_therapy( dataname = "ANL", @@ -40,13 +40,13 @@ template_therapy( \item{cmdosfrq}{(\code{character})\cr name of dosing frequency per interval variable.} -\item{cmstdy}{(\code{character})\cr name of study day of start of medication variable.} +\item{cmstdy}{(\code{character})\cr name of study relative day of start of medication variable.} \item{cmendy}{(\code{character})\cr name of study day of end of medication variable.} \item{patient_id}{(\code{character})\cr patient ID.} -\item{font_size}{(\code{numeric})\cr numeric vector of length 3 for current, min and max font size values.} +\item{font_size}{(\code{numeric})\cr font size value.} \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments @@ -54,7 +54,14 @@ for the module plot. The argument is merged with option \code{teal.ggplot2_args} For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Creates a therapy template call. +Creates a valid expression to generate a patient profile therapy table and \code{\link[ggplot2:ggplot]{ggplot2::ggplot()}} plot using ADaM +datasets. +} +\seealso{ +\code{\link[=tm_g_pp_therapy]{tm_g_pp_therapy()}} } \keyword{internal} diff --git a/man/tm_g_pp_therapy.Rd b/man/tm_g_pp_therapy.Rd index 04054d4e65..807555e2be 100644 --- a/man/tm_g_pp_therapy.Rd +++ b/man/tm_g_pp_therapy.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_g_pp_therapy.R \name{tm_g_pp_therapy} \alias{tm_g_pp_therapy} -\title{Teal Module: Patient Profile Therapy Teal Module} +\title{teal Module: Patient Profile Therapy Table and Plot} \usage{ tm_g_pp_therapy( label, @@ -34,39 +34,39 @@ tm_g_pp_therapy( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{patient_col}{(\code{character})\cr patient ID column to be used.} +\item{patient_col}{(\code{character})\cr name of patient ID variable.} -\item{atirel}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{ATIREL} column of the \code{ADCM} dataset.} +\item{atirel}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{ATIREL} variable from \code{dataname}.} -\item{cmdecod}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{CMDECOD} column of the \code{ADCM} dataset.} +\item{cmdecod}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{CMDECOD} variable from \code{dataname}.} -\item{cmindc}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{CMINDC} column of the \code{ADCM} dataset.} +\item{cmindc}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{CMINDC} variable from \code{dataname}.} -\item{cmdose}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{CMDOSE} column of the \code{ADCM} dataset.} +\item{cmdose}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{CMDOSE} variable from \code{dataname}.} -\item{cmtrt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{CMTRT} column of the \code{ADCM} dataset.} +\item{cmtrt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{CMTRT} variable from \code{dataname}.} -\item{cmdosu}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{CMDOSU} column of the \code{ADCM} dataset.} +\item{cmdosu}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{CMDOSU} variable from \code{dataname}.} -\item{cmroute}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{CMROUTE} column of the \code{ADCM} dataset.} +\item{cmroute}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{CMROUTE} variable from \code{dataname}.} -\item{cmdosfrq}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{CMDOSFRQ} column of the \code{ADCM} dataset.} +\item{cmdosfrq}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{CMDOSFRQ} variable from \code{dataname}.} -\item{cmstdy}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{CMSTDY} column of the \code{ADCM} dataset.} +\item{cmstdy}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{CMSTDY} variable from \code{dataname}.} -\item{cmendy}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{CMENDY} column of the \code{ADCM} dataset.} +\item{cmendy}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{CMENDY} variable from \code{dataname}.} -\item{font_size}{(\code{numeric})\cr numeric vector of length 3 for current, min and max font size values.} +\item{font_size}{(\code{numeric})\cr numeric vector of length 3 of current, minimum and maximum font size values.} \item{plot_height}{optional, (\code{numeric})\cr a vector of length three with \code{c(value, min, max)}. Specifies the height of the main plot and renders a slider on the plot to interactively adjust the plot height.} @@ -86,8 +86,11 @@ for the module plot. The argument is merged with option \code{teal.ggplot2_args} For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -This teal module produces a patient profile therapy plot using \code{ADaM} datasets. +This module produces a patient profile therapy table and \code{\link[ggplot2:ggplot]{ggplot2::ggplot()}} type plot using ADaM datasets. } \examples{ library(nestcolor) From eb02639dff023c5c61b817d5f917ee842f89fdc4 Mon Sep 17 00:00:00 2001 From: edelarua Date: Fri, 2 Feb 2024 18:04:22 +0000 Subject: [PATCH 020/126] [skip actions] Bump version to 0.8.16.9054 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 1e6c26eeb3..2f61ed6ebc 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9053 +Version: 0.8.16.9054 Date: 2024-02-02 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 344d3ac44e..eff7425fab 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9053 +# teal.modules.clinical 0.8.16.9054 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 28f5372d780dc4184e1fb17663ca5760791019e9 Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Fri, 2 Feb 2024 13:15:08 -0500 Subject: [PATCH 021/126] Clean up documentation for `tm_t_events_summary` (#1015) Fixes #977 --- R/tm_t_events_summary.R | 97 +++++++++++++++++----------------- inst/WORDLIST | 1 + man/template_events_summary.Rd | 48 ++++++++--------- man/tm_t_events_summary.Rd | 57 ++++++++++---------- 4 files changed, 102 insertions(+), 101 deletions(-) diff --git a/R/tm_t_events_summary.R b/R/tm_t_events_summary.R index d3a92c8bf0..227e879a1d 100644 --- a/R/tm_t_events_summary.R +++ b/R/tm_t_events_summary.R @@ -1,35 +1,32 @@ #' Template: Adverse Events Summary #' +#' Creates a valid expression to generate an adverse events summary table. +#' #' @inheritParams template_arguments -#' @param dthfl_var (`character`)\cr -#' variable for subject death flag from `parentname`. Records with `"Y"`` are summarized in -#' the table row for "Total number of deaths". -#' @param dcsreas_var (`character`)\cr -#' variable for study discontinuation reason from `parentname`. Records with `"ADVERSE EVENTS"` -#' are summarized in the table row for `"Total number of patients withdrawn from study due to an AE"`. -#' @param flag_var_anl (`character`)\cr -#' flag variable from `dataset` used to count adverse event sub-groups (e.g. Serious -#' events, Related events, etc.). Variable labels are used as table row names if they exist. -#' @param flag_var_aesi (`character`)\cr -#' flag variable from `dataset` used to count adverse event special interest groups. -#' All flag variables must be of type `logical`. Variable labels are used as table -#' row names if they exist. -#' @param aeseq_var (`character`)\cr -#' variable for adverse events sequence number from `dataset`. Used for counting total -#' number of events. -#' @param count_subj (`logical`)\cr w -#' whether to show count of unique subjects based on `USUBJID`. Only applies if event flag -#' variables are provided. -#' @param count_pt (`logical`)\cr -#' whether to show count of unique preferred terms based on `llt`. Only applies if event +#' @param dthfl_var (`character`)\cr name of variable for subject death flag from `parentname`. +#' Records with `"Y"` are summarized in the table row for "Total number of deaths". +#' @param dcsreas_var (`character`)\cr name of variable for study discontinuation reason from `parentname`. +#' Records with `"ADVERSE EVENTS"` are summarized in the table row for +#' "Total number of patients withdrawn from study due to an AE". +#' @param flag_var_anl (`character`)\cr name of flag variable from `dataset` used to count adverse event sub-groups +#' (e.g. Serious events, Related events, etc.). Variable labels are used as table row names if they exist. +#' @param flag_var_aesi (`character`)\cr name of flag variable from `dataset` used to count adverse event special +#' interest groups. All flag variables must be of type `logical`. Variable labels are used as table row names if +#' they exist. +#' @param aeseq_var (`character`)\cr name of variable for adverse events sequence number from `dataset`. Used for +#' counting total number of events. +#' @param count_subj (`logical`)\cr whether to show count of unique subjects (based on `USUBJID`). Only applies if +#' event flag variables are provided. +#' @param count_pt (`logical`)\cr whether to show count of unique preferred terms (based on `llt`). Only applies if +#' event flag variables are provided. +#' @param count_events (`logical`)\cr whether to show count of events (based on `aeseq_var`). Only applies if event #' flag variables are provided. -#' @param count_events (`logical`)\cr -#' whether to show count of events based on `aeseq_var`. Only applies if event flag variables -#' are provided. +#' +#' @inherit template_arguments return #' #' @seealso [tm_t_events_summary()] -#' @keywords internal #' +#' @keywords internal template_events_summary <- function(anl_name, parentname, arm_var, @@ -103,7 +100,6 @@ template_events_summary <- function(anl_name, quote(study_id <- unique(anl[["STUDYID"]])) ) - # Create dummy variable for counting patients with an AE data_list <- add_expr( data_list, @@ -204,6 +200,7 @@ template_events_summary <- function(anl_name, ) ) } + layout_parent_list <- add_expr( layout_parent_list, substitute( @@ -481,29 +478,34 @@ template_events_summary <- function(anl_name, y } -#' Teal Module: Adverse Events Summary +#' teal Module: Adverse Events Summary +#' +#' This module produces an adverse events summary table. #' #' @inheritParams module_arguments #' @inheritParams template_arguments #' @inheritParams template_events_summary -#' @param dthfl_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' variable for subject death flag from `parentname`. Records with `"Y"`` are summarized in -#' the table row for "Total number of deaths". -#' @param dcsreas_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr variable -#' for study discontinuation reason from `parentname`. Records with `"ADVERSE EVENTS"` are -#' summarized in the table row for `"Total number of patients withdrawn from study due to an AE"`. -#' @param flag_var_anl ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' vector with names of flag variables from `dataset` used to count adverse event -#' sub-groups (e.g. Serious events, Related events, etc.). Variable labels are used -#' as table row names if they exist. -#' @param flag_var_aesi ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' vector with names of flag variables from `dataset` used to count adverse event -#' special interest groups. All flag variables must be of type `logical`. Variable -#' labels are used as table row names if they exist. -#' @param aeseq_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr variable -#' for adverse events sequence number from `dataset`. Used for counting total number of events. +#' @param dthfl_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object +#' with all available choices and preselected option for variable names that can be used as death flag variable. +#' Records with `"Y"`` are summarized in the table row for "Total number of deaths". +#' @param dcsreas_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object +#' with all available choices and preselected option for variable names that can be used as study discontinuation +#' reason variable. Records with `"ADVERSE EVENTS"` are summarized in the table row for +#' "Total number of patients withdrawn from study due to an AE". +#' @param flag_var_anl ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()] or `NULL`)\cr +#' vector with names of flag variables from `dataset` used to count adverse event sub-groups (e.g. Serious events, +#' Related events, etc.). Variable labels are used as table row names if they exist. +#' @param flag_var_aesi ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()] or `NULL`)\cr +#' vector with names of flag variables from `dataset` used to count adverse event special interest groups. All flag +#' variables must be of type `logical`. Variable labels are used as table row names if they exist. +#' @param aeseq_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr variable for +#' adverse events sequence number from `dataset`. Used for counting total number of events. +#' +#' @inherit module_arguments return +#' +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. #' -#' @export #' @examples #' data <- teal_data() #' data <- within(data, { @@ -579,6 +581,7 @@ template_events_summary <- function(anl_name, #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_t_events_summary <- function(label, dataname, parentname = ifelse( @@ -668,9 +671,7 @@ tm_t_events_summary <- function(label, ) } - - -#' @noRd +#' @keywords internal ui_t_events_summary <- function(id, ...) { ns <- shiny::NS(id) a <- list(...) @@ -781,7 +782,7 @@ ui_t_events_summary <- function(id, ...) { ) } -#' @noRd +#' @keywords internal srv_t_events_summary <- function(id, data, reporter, diff --git a/inst/WORDLIST b/inst/WORDLIST index 390ab45c31..03bb355af8 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -1,6 +1,7 @@ ADAE ADSL ADaM +AE ANCOVA Facetting Forkers diff --git a/man/template_events_summary.Rd b/man/template_events_summary.Rd index 425c2e3604..dc89da7fc2 100644 --- a/man/template_events_summary.Rd +++ b/man/template_events_summary.Rd @@ -29,26 +29,22 @@ template_events_summary( \item{arm_var}{(\code{character})\cr variable names that can be used as \code{arm_var}.} -\item{dthfl_var}{(\code{character})\cr -variable for subject death flag from \code{parentname}. Records with `"Y"`` are summarized in -the table row for "Total number of deaths".} +\item{dthfl_var}{(\code{character})\cr name of variable for subject death flag from \code{parentname}. +Records with \code{"Y"} are summarized in the table row for "Total number of deaths".} -\item{dcsreas_var}{(\code{character})\cr -variable for study discontinuation reason from \code{parentname}. Records with \code{"ADVERSE EVENTS"} -are summarized in the table row for \code{"Total number of patients withdrawn from study due to an AE"}.} +\item{dcsreas_var}{(\code{character})\cr name of variable for study discontinuation reason from \code{parentname}. +Records with \code{"ADVERSE EVENTS"} are summarized in the table row for +"Total number of patients withdrawn from study due to an AE".} -\item{flag_var_anl}{(\code{character})\cr -flag variable from \code{dataset} used to count adverse event sub-groups (e.g. Serious -events, Related events, etc.). Variable labels are used as table row names if they exist.} +\item{flag_var_anl}{(\code{character})\cr name of flag variable from \code{dataset} used to count adverse event sub-groups +(e.g. Serious events, Related events, etc.). Variable labels are used as table row names if they exist.} -\item{flag_var_aesi}{(\code{character})\cr -flag variable from \code{dataset} used to count adverse event special interest groups. -All flag variables must be of type \code{logical}. Variable labels are used as table -row names if they exist.} +\item{flag_var_aesi}{(\code{character})\cr name of flag variable from \code{dataset} used to count adverse event special +interest groups. All flag variables must be of type \code{logical}. Variable labels are used as table row names if +they exist.} -\item{aeseq_var}{(\code{character})\cr -variable for adverse events sequence number from \code{dataset}. Used for counting total -number of events.} +\item{aeseq_var}{(\code{character})\cr name of variable for adverse events sequence number from \code{dataset}. Used for +counting total number of events.} \item{llt}{(\code{character})\cr name of the variable with low level term for events.} @@ -62,20 +58,20 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{count_subj}{(\code{logical})\cr w -whether to show count of unique subjects based on \code{USUBJID}. Only applies if event flag -variables are provided.} +\item{count_subj}{(\code{logical})\cr whether to show count of unique subjects (based on \code{USUBJID}). Only applies if +event flag variables are provided.} -\item{count_pt}{(\code{logical})\cr -whether to show count of unique preferred terms based on \code{llt}. Only applies if event -flag variables are provided.} +\item{count_pt}{(\code{logical})\cr whether to show count of unique preferred terms (based on \code{llt}). Only applies if +event flag variables are provided.} -\item{count_events}{(\code{logical})\cr -whether to show count of events based on \code{aeseq_var}. Only applies if event flag variables -are provided.} +\item{count_events}{(\code{logical})\cr whether to show count of events (based on \code{aeseq_var}). Only applies if event +flag variables are provided.} +} +\value{ +a \code{list} of expressions to generate a table or plot object. } \description{ -Template: Adverse Events Summary +Creates a valid expression to generate an adverse events summary table. } \seealso{ \code{\link[=tm_t_events_summary]{tm_t_events_summary()}} diff --git a/man/tm_t_events_summary.Rd b/man/tm_t_events_summary.Rd index 7f033a5bba..bfe70cf3ea 100644 --- a/man/tm_t_events_summary.Rd +++ b/man/tm_t_events_summary.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_events_summary.R \name{tm_t_events_summary} \alias{tm_t_events_summary} -\title{Teal Module: Adverse Events Summary} +\title{teal Module: Adverse Events Summary} \usage{ tm_t_events_summary( label, @@ -46,28 +46,27 @@ It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{flag_var_anl}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -vector with names of flag variables from \code{dataset} used to count adverse event -sub-groups (e.g. Serious events, Related events, etc.). Variable labels are used -as table row names if they exist.} +\item{flag_var_anl}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}} or \code{NULL})\cr +vector with names of flag variables from \code{dataset} used to count adverse event sub-groups (e.g. Serious events, +Related events, etc.). Variable labels are used as table row names if they exist.} -\item{flag_var_aesi}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -vector with names of flag variables from \code{dataset} used to count adverse event -special interest groups. All flag variables must be of type \code{logical}. Variable -labels are used as table row names if they exist.} +\item{flag_var_aesi}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}} or \code{NULL})\cr +vector with names of flag variables from \code{dataset} used to count adverse event special interest groups. All flag +variables must be of type \code{logical}. Variable labels are used as table row names if they exist.} -\item{dthfl_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -variable for subject death flag from \code{parentname}. Records with `"Y"`` are summarized in -the table row for "Total number of deaths".} +\item{dthfl_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +with all available choices and preselected option for variable names that can be used as death flag variable. +Records with `"Y"`` are summarized in the table row for "Total number of deaths".} -\item{dcsreas_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable -for study discontinuation reason from \code{parentname}. Records with \code{"ADVERSE EVENTS"} are -summarized in the table row for \code{"Total number of patients withdrawn from study due to an AE"}.} +\item{dcsreas_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +with all available choices and preselected option for variable names that can be used as study discontinuation +reason variable. Records with \code{"ADVERSE EVENTS"} are summarized in the table row for +"Total number of patients withdrawn from study due to an AE".} \item{llt}{(\code{choices_selected} or \code{data_extract_spec})\cr name of the variable with low level term for events.} -\item{aeseq_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable -for adverse events sequence number from \code{dataset}. Used for counting total number of events.} +\item{aeseq_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable for +adverse events sequence number from \code{dataset}. Used for counting total number of events.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} @@ -79,17 +78,14 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{count_subj}{(\code{logical})\cr w -whether to show count of unique subjects based on \code{USUBJID}. Only applies if event flag -variables are provided.} +\item{count_subj}{(\code{logical})\cr whether to show count of unique subjects (based on \code{USUBJID}). Only applies if +event flag variables are provided.} -\item{count_pt}{(\code{logical})\cr -whether to show count of unique preferred terms based on \code{llt}. Only applies if event -flag variables are provided.} +\item{count_pt}{(\code{logical})\cr whether to show count of unique preferred terms (based on \code{llt}). Only applies if +event flag variables are provided.} -\item{count_events}{(\code{logical})\cr -whether to show count of events based on \code{aeseq_var}. Only applies if event flag variables -are provided.} +\item{count_events}{(\code{logical})\cr whether to show count of events (based on \code{aeseq_var}). Only applies if event +flag variables are provided.} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. For example a title.} @@ -103,8 +99,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -Teal Module: Adverse Events Summary +This module produces an adverse events summary table. } \examples{ data <- teal_data() @@ -182,3 +181,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} From 2db201652b519ec8d95bd6ffcf0637daf4502ff0 Mon Sep 17 00:00:00 2001 From: edelarua Date: Fri, 2 Feb 2024 18:16:05 +0000 Subject: [PATCH 022/126] [skip actions] Bump version to 0.8.16.9055 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 2f61ed6ebc..db9f2cc326 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9054 +Version: 0.8.16.9055 Date: 2024-02-02 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index eff7425fab..ee07e5c747 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9054 +# teal.modules.clinical 0.8.16.9055 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 2e013ee20652237f33a2cb08851fb97b6e23d7af Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Fri, 2 Feb 2024 13:26:36 -0500 Subject: [PATCH 023/126] Clean up documentation for `tm_t_mult_events` (#1019) Fixes #974 --- R/argument_convention.R | 2 ++ R/tm_t_mult_events.R | 34 ++++++++++++++++++++++------------ man/template_arguments.Rd | 3 +++ man/template_mult_events.Rd | 14 +++++++++----- man/tm_t_mult_events.Rd | 21 +++++++++++++++------ 5 files changed, 51 insertions(+), 23 deletions(-) diff --git a/R/argument_convention.R b/R/argument_convention.R index 028898a120..34f1fa9989 100644 --- a/R/argument_convention.R +++ b/R/argument_convention.R @@ -42,6 +42,8 @@ #' set to those used in the `dataname` dataset. If `FALSE`, `arm_var` levels are set to those used in the #' `parentname` dataset. If `dataname` and `parentname` are the same, then `drop_arm_levels` is set to `TRUE` and #' user input for this parameter is ignored. +#' @param event_type (`character`)\cr type of event that is summarized (e.g. adverse event, treatment). Default +#' is `"event"`. #' @param font_size (`numeric`)\cr font size value. #' @param ggplot2_args optional, (`ggplot2_args`)\cr object created by [teal.widgets::ggplot2_args()] with settings #' for the module plot. The argument is merged with option `teal.ggplot2_args` and with default module arguments diff --git a/R/tm_t_mult_events.R b/R/tm_t_mult_events.R index 4d68f2670c..37f265d7d4 100644 --- a/R/tm_t_mult_events.R +++ b/R/tm_t_mult_events.R @@ -1,13 +1,16 @@ -#' Template: Events by Term +#' Template: Multiple Events by Term +#' +#' Creates a valid expression to generate a table of multiple events by term. #' #' @inheritParams template_arguments -#' @param event_type (`character`)\cr type of event that is summarized (e.g. adverse event, treatment). -#' Default is "event". -#' @param seq_var (`numeric`)\cr Analysis Sequence Number. Used for counting the unique number of events. +#' @param seq_var (`character`)\cr name of analysis sequence number variable. Used for counting the unique number +#' of events. +#' +#' @inherit template_arguments return #' #' @seealso [tm_t_mult_events()] -#' @keywords internal #' +#' @keywords internal template_mult_events <- function(dataname, parentname, arm_var, @@ -271,15 +274,20 @@ template_mult_events <- function(dataname, y } -#' Teal Module: Multiple Events by Term +#' teal Module: Multiple Events by Term +#' +#' This module produces a table of multiple events by term. #' #' @inheritParams module_arguments #' @inheritParams template_mult_events +#' @param seq_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' all available choices and preselected option for variable names that can be used as analysis sequence number +#' variable. Used for counting the unique number of events. #' -#' @param seq_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' Analysis Sequence Number. Used for counting the unique number of events. +#' @inherit module_arguments return #' -#' @export +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. #' #' @examples #' ADSL <- tmc_ex_adsl @@ -321,7 +329,9 @@ template_mult_events <- function(dataname, #' if (interactive()) { #' shinyApp(app$ui, app$server) #' } -tm_t_mult_events <- function(label, # nolint +#' +#' @export +tm_t_mult_events <- function(label, dataname, parentname = ifelse( inherits(arm_var, "data_extract_spec"), @@ -383,7 +393,7 @@ tm_t_mult_events <- function(label, # nolint ) } -#' @noRd +#' @keywords internal ui_t_mult_events_byterm <- function(id, ...) { ns <- shiny::NS(id) a <- list(...) @@ -449,7 +459,7 @@ ui_t_mult_events_byterm <- function(id, ...) { ) } -#' @noRd +#' @keywords internal srv_t_mult_events_byterm <- function(id, data, reporter, diff --git a/man/template_arguments.Rd b/man/template_arguments.Rd index 261cde7fa0..f4f3947753 100644 --- a/man/template_arguments.Rd +++ b/man/template_arguments.Rd @@ -60,6 +60,9 @@ set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var \code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and user input for this parameter is ignored.} +\item{event_type}{(\code{character})\cr type of event that is summarized (e.g. adverse event, treatment). Default +is \code{"event"}.} + \item{font_size}{(\code{numeric})\cr font size value.} \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings diff --git a/man/template_mult_events.Rd b/man/template_mult_events.Rd index 29ecf4aee1..7d7b509361 100644 --- a/man/template_mult_events.Rd +++ b/man/template_mult_events.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_mult_events.R \name{template_mult_events} \alias{template_mult_events} -\title{Template: Events by Term} +\title{Template: Multiple Events by Term} \usage{ template_mult_events( dataname, @@ -26,7 +26,8 @@ template_mult_events( \item{arm_var}{(\code{character})\cr variable names that can be used as \code{arm_var}.} -\item{seq_var}{(\code{numeric})\cr Analysis Sequence Number. Used for counting the unique number of events.} +\item{seq_var}{(\code{character})\cr name of analysis sequence number variable. Used for counting the unique number +of events.} \item{hlt}{(\code{character})\cr name of the variable with high level term for events.} @@ -42,8 +43,8 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{event_type}{(\code{character})\cr type of event that is summarized (e.g. adverse event, treatment). -Default is "event".} +\item{event_type}{(\code{character})\cr type of event that is summarized (e.g. adverse event, treatment). Default +is \code{"event"}.} \item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the @@ -56,8 +57,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Template: Events by Term +Creates a valid expression to generate a table of multiple events by term. } \seealso{ \code{\link[=tm_t_mult_events]{tm_t_mult_events()}} diff --git a/man/tm_t_mult_events.Rd b/man/tm_t_mult_events.Rd index 72755a009e..35cb20ced2 100644 --- a/man/tm_t_mult_events.Rd +++ b/man/tm_t_mult_events.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_mult_events.R \name{tm_t_mult_events} \alias{tm_t_mult_events} -\title{Teal Module: Multiple Events by Term} +\title{teal Module: Multiple Events by Term} \usage{ tm_t_mult_events( label, @@ -36,8 +36,9 @@ It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{seq_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -Analysis Sequence Number. Used for counting the unique number of events.} +\item{seq_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and preselected option for variable names that can be used as analysis sequence number +variable. Used for counting the unique number of events.} \item{hlt}{(\code{choices_selected} or \code{data_extract_spec})\cr name of the variable with high level term for events.} @@ -53,8 +54,8 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{event_type}{(\code{character})\cr type of event that is summarized (e.g. adverse event, treatment). -Default is "event".} +\item{event_type}{(\code{character})\cr type of event that is summarized (e.g. adverse event, treatment). Default +is \code{"event"}.} \item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the @@ -73,8 +74,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -Teal Module: Multiple Events by Term +This module produces a table of multiple events by term. } \examples{ ADSL <- tmc_ex_adsl @@ -116,4 +120,9 @@ app <- teal::init( if (interactive()) { shinyApp(app$ui, app$server) } + +} +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. } From d1e1ee018eeed7135446282efb3bf9d625cad596 Mon Sep 17 00:00:00 2001 From: edelarua Date: Fri, 2 Feb 2024 18:27:27 +0000 Subject: [PATCH 024/126] [skip actions] Bump version to 0.8.16.9056 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index db9f2cc326..d989a24f0d 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9055 +Version: 0.8.16.9056 Date: 2024-02-02 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index ee07e5c747..df92941ec1 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9055 +# teal.modules.clinical 0.8.16.9056 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 82bdfa16f295ac29b7bb9334b733314990858274 Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Fri, 2 Feb 2024 13:36:32 -0500 Subject: [PATCH 025/126] Clean up documentation for `tm_t_tte` (#1011) Fixes #959 --- R/tm_t_tte.R | 67 ++++++++++++++++++++++++--------------------- man/control_tte.Rd | 17 ++++++------ man/template_tte.Rd | 12 ++++---- man/tm_t_tte.Rd | 34 ++++++++++++++--------- 4 files changed, 73 insertions(+), 57 deletions(-) diff --git a/R/tm_t_tte.R b/R/tm_t_tte.R index d1f601e66e..77fbb12a54 100644 --- a/R/tm_t_tte.R +++ b/R/tm_t_tte.R @@ -1,15 +1,15 @@ -#' Control Function for Time-to-Event Teal Module +#' Control Function for Time-To-Event teal Module #' -#' Controls the arguments for Cox regressions and Survival analysis results. +#' Controls the arguments for Cox regression and survival analysis results. #' -#' @param coxph (`list`)\cr -#' parameters for comparison, specified using [tern::control_coxph()]. -#' @param surv_time (`list`)\cr -#' parameters for comparison, specified using [tern::control_surv_time()]. -#' @param surv_timepoint (`list`)\cr -#' parameters for comparison, specified using [tern::control_surv_timepoint()]. -#' @keywords internal +#' @param coxph (`list`)\cr control parameters for Cox-PH model. See [tern::control_coxph()] for details. +#' @param surv_time (`list`)\cr control parameters for `survfit` model. See [tern::control_surv_time()] for details. +#' @param surv_timepoint (`list`)\cr control parameters for `survfit` model at time point. See +#' [tern::control_surv_timepoint()] for details. +#' +#' @seealso [template_tte()], [tm_t_tte()] #' +#' @keywords internal control_tte <- function( surv_time = list( conf_level = 0.95, @@ -32,20 +32,20 @@ control_tte <- function( ) } - -#' Template: Time-to-Event +#' Template: Time-To-Event #' -#' Creates a valid expression for time-to-event analysis. +#' Creates a valid expression to generate a time-to-event analysis. #' #' @inheritParams template_arguments -#' @param control (`list`)\cr list of settings for the analysis, -#' see [control_tte()]. +#' @param control (`list`)\cr list of settings for the analysis. See [control_tte()] for details. #' @param event_desc_var (`character`)\cr name of the variable with events description. #' @param paramcd (`character`)\cr endpoint parameter value to use in the table title. #' -#' @seealso [tm_t_tte()] -#' @keywords internal +#' @inherit template_arguments return +#' +#' @seealso [control_tte()], [tm_t_tte()] #' +#' @keywords internal template_tte <- function(dataname = "ANL", parentname = "ADSL", arm_var = "ARM", @@ -375,8 +375,11 @@ template_tte <- function(dataname = "ANL", y } - -#' Teal Module: Time To Event Table Teal Module +#' teal Module: Time-To-Event Table +#' +#' This module produces a time-to-event analysis summary table, consistent with the TLG Catalog +#' template for `TTET01` available [here]( +#' https://insightsengineering.github.io/tlg-catalog/stable/tables/efficacy/ttet01.html). #' #' @inheritParams module_arguments #' @inheritParams template_tte @@ -387,20 +390,21 @@ template_tte <- function(dataname = "ANL", #' @param event_desc_var (`character` or [data_extract_spec()])\cr variable name with the event description #' information, optional. #' -#' @details This module produces a response summary table that is similar to `TTET01`. The core functionality is based -#' on [coxph_pairwise()], [surv_timepoint()] and [surv_time()] from package `tern`.\cr -#' The following variables are used in the module: +#' @details +#' * The core functionality of this module is based on [coxph_pairwise()], [surv_timepoint()], and [surv_time()] from +#' the `tern` package. +#' * The arm and stratification variables are taken from the `parentname` data. +#' * The following variables are used in the module: #' -#' \tabular{ll}{ -#' `AVAL` \tab time to event\cr -#' `CNSR` \tab boolean or 0,1 is element in `AVAL` censored\cr -#' `PARAMCD` \tab variable used to filter for endpoint (e.g. OS), after -#' filtering for `paramcd` one observation per patient is expected -#' } +#' * `AVAL`: time to event +#' * `CNSR`: 1 if record in `AVAL` is censored, 0 otherwise +#' * `PARAMCD`: variable used to filter for endpoint (e.g. OS). After +#' filtering for `PARAMCD` one observation per patient is expected #' -#' The arm and stratification variables and taken from the `parentname` data. +#' @inherit module_arguments return #' -#' @export +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. #' #' @examples #' ADSL <- tmc_ex_adsl @@ -456,6 +460,7 @@ template_tte <- function(dataname = "ANL", #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_t_tte <- function(label, dataname, parentname = ifelse( @@ -536,7 +541,7 @@ tm_t_tte <- function(label, ) } -#' @noRd +#' @keywords internal ui_t_tte <- function(id, ...) { a <- list(...) # module args is_single_dataset_value <- teal.transform::is_single_dataset( @@ -724,7 +729,7 @@ ui_t_tte <- function(id, ...) { ) } -#' @noRd +#' @keywords internal srv_t_tte <- function(id, data, filter_panel_api, diff --git a/man/control_tte.Rd b/man/control_tte.Rd index 47ad6b2c98..03afef217f 100644 --- a/man/control_tte.Rd +++ b/man/control_tte.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_tte.R \name{control_tte} \alias{control_tte} -\title{Control Function for Time-to-Event Teal Module} +\title{Control Function for Time-To-Event teal Module} \usage{ control_tte( surv_time = list(conf_level = 0.95, conf_type = "plain", quantiles = c(0.25, 0.75)), @@ -12,16 +12,17 @@ control_tte( ) } \arguments{ -\item{surv_time}{(\code{list})\cr -parameters for comparison, specified using \code{\link[tern:control_surv_time]{tern::control_surv_time()}}.} +\item{surv_time}{(\code{list})\cr control parameters for \code{survfit} model. See \code{\link[tern:control_surv_time]{tern::control_surv_time()}} for details.} -\item{coxph}{(\code{list})\cr -parameters for comparison, specified using \code{\link[tern:control_coxph]{tern::control_coxph()}}.} +\item{coxph}{(\code{list})\cr control parameters for Cox-PH model. See \code{\link[tern:control_coxph]{tern::control_coxph()}} for details.} -\item{surv_timepoint}{(\code{list})\cr -parameters for comparison, specified using \code{\link[tern:control_surv_timepoint]{tern::control_surv_timepoint()}}.} +\item{surv_timepoint}{(\code{list})\cr control parameters for \code{survfit} model at time point. See +\code{\link[tern:control_surv_timepoint]{tern::control_surv_timepoint()}} for details.} } \description{ -Controls the arguments for Cox regressions and Survival analysis results. +Controls the arguments for Cox regression and survival analysis results. +} +\seealso{ +\code{\link[=template_tte]{template_tte()}}, \code{\link[=tm_t_tte]{tm_t_tte()}} } \keyword{internal} diff --git a/man/template_tte.Rd b/man/template_tte.Rd index 955874b6be..cf4a1593a7 100644 --- a/man/template_tte.Rd +++ b/man/template_tte.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_tte.R \name{template_tte} \alias{template_tte} -\title{Template: Time-to-Event} +\title{Template: Time-To-Event} \usage{ template_tte( dataname = "ANL", @@ -55,8 +55,7 @@ template_tte( \item{event_desc_var}{(\code{character})\cr name of the variable with events description.} -\item{control}{(\code{list})\cr list of settings for the analysis, -see \code{\link[=control_tte]{control_tte()}}.} +\item{control}{(\code{list})\cr list of settings for the analysis. See \code{\link[=control_tte]{control_tte()}} for details.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} @@ -74,10 +73,13 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Creates a valid expression for time-to-event analysis. +Creates a valid expression to generate a time-to-event analysis. } \seealso{ -\code{\link[=tm_t_tte]{tm_t_tte()}} +\code{\link[=control_tte]{control_tte()}}, \code{\link[=tm_t_tte]{tm_t_tte()}} } \keyword{internal} diff --git a/man/tm_t_tte.Rd b/man/tm_t_tte.Rd index 3e0cb4f3f9..d7bea44682 100644 --- a/man/tm_t_tte.Rd +++ b/man/tm_t_tte.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_tte.R \name{tm_t_tte} \alias{tm_t_tte} -\title{Teal Module: Time To Event Table Teal Module} +\title{teal Module: Time-To-Event Table} \usage{ tm_t_tte( label, @@ -100,22 +100,26 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -Teal Module: Time To Event Table Teal Module +This module produces a time-to-event analysis summary table, consistent with the TLG Catalog +template for \code{TTET01} available \href{https://insightsengineering.github.io/tlg-catalog/stable/tables/efficacy/ttet01.html}{here}. } \details{ -This module produces a response summary table that is similar to \code{TTET01}. The core functionality is based -on \code{\link[=coxph_pairwise]{coxph_pairwise()}}, \code{\link[=surv_timepoint]{surv_timepoint()}} and \code{\link[=surv_time]{surv_time()}} from package \code{tern}.\cr -The following variables are used in the module: - -\tabular{ll}{ -\code{AVAL} \tab time to event\cr -\code{CNSR} \tab boolean or 0,1 is element in \code{AVAL} censored\cr -\code{PARAMCD} \tab variable used to filter for endpoint (e.g. OS), after -filtering for \code{paramcd} one observation per patient is expected +\itemize{ +\item The core functionality of this module is based on \code{\link[=coxph_pairwise]{coxph_pairwise()}}, \code{\link[=surv_timepoint]{surv_timepoint()}}, and \code{\link[=surv_time]{surv_time()}} from +the \code{tern} package. +\item The arm and stratification variables are taken from the \code{parentname} data. +\item The following variables are used in the module: +\itemize{ +\item \code{AVAL}: time to event +\item \code{CNSR}: 1 if record in \code{AVAL} is censored, 0 otherwise +\item \code{PARAMCD}: variable used to filter for endpoint (e.g. OS). After +filtering for \code{PARAMCD} one observation per patient is expected +} } - -The arm and stratification variables and taken from the \code{parentname} data. } \examples{ ADSL <- tmc_ex_adsl @@ -172,3 +176,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} From b90de5c4aebe0ce649ebaad3067bfeb247fddab7 Mon Sep 17 00:00:00 2001 From: edelarua Date: Fri, 2 Feb 2024 18:37:28 +0000 Subject: [PATCH 026/126] [skip actions] Bump version to 0.8.16.9057 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index d989a24f0d..04f2ac5492 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9056 +Version: 0.8.16.9057 Date: 2024-02-02 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index df92941ec1..af48120dda 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9056 +# teal.modules.clinical 0.8.16.9057 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From e65ce85d306fd647a1b16c8ea9910627f47ffa33 Mon Sep 17 00:00:00 2001 From: Abinaya Yogasekaram <73252787+ayogasekaram@users.noreply.github.com> Date: Fri, 2 Feb 2024 14:53:41 -0500 Subject: [PATCH 027/126] clean up documentation for `tm_t_ancova` (#1016) closes #973 --------- Signed-off-by: Abinaya Yogasekaram <73252787+ayogasekaram@users.noreply.github.com> Co-authored-by: Aleksander Chlebowski <114988527+chlebowa@users.noreply.github.com> Co-authored-by: 27856297+dependabot-preview[bot]@users.noreply.github.com <27856297+dependabot-preview[bot]@users.noreply.github.com> Co-authored-by: Emily de la Rua <59304861+edelarua@users.noreply.github.com> --- R/argument_convention.R | 4 --- R/tm_t_ancova.R | 26 +++++++++++++++----- man/template_ancova.Rd | 11 ++++++--- man/template_arguments.Rd | 6 ----- man/tm_t_ancova.Rd | 11 +++++++-- tests/testthat/_snaps/tm_t_events.md | 4 +-- tests/testthat/_snaps/tm_t_events_summary.md | 10 +++++--- 7 files changed, 44 insertions(+), 28 deletions(-) diff --git a/R/argument_convention.R b/R/argument_convention.R index 34f1fa9989..8791c03966 100644 --- a/R/argument_convention.R +++ b/R/argument_convention.R @@ -53,10 +53,6 @@ #' @param hlt (`character`)\cr name of the variable with high level term for events. #' @param id_var (`character`)\cr the variable name for subject id. #' @param include_interact (`logical`)\cr whether an interaction term should be included in the model. -#' @param interact_var (`character`)\cr name of the variable that should have interactions with arm. If the -#' interaction is not needed, the default option is `NULL`. -#' @param interact_y (`character`)\cr a selected item from the interact_var column which will be used to select the -#' specific `ANCOVA` results. If the interaction is not needed, the default option is `FALSE`. #' @param llt (`character`)\cr name of the variable with low level term for events. #' @param patient_id (`character`)\cr patient ID. #' @param na_level (`string`)\cr used to replace all `NA` or empty values diff --git a/R/tm_t_ancova.R b/R/tm_t_ancova.R index 7eabea5a22..e67415dccd 100644 --- a/R/tm_t_ancova.R +++ b/R/tm_t_ancova.R @@ -1,6 +1,7 @@ -#' Template: `ANCOVA` summary +#' Template: ANCOVA Summary #' -#' Creates a valid expression for analysis of variance summary table. +#' Creates a valid expression to generate an analysis of variance summary table. + #' @inheritParams template_arguments #' @param paramcd_levels (`character`)\cr #' variable levels for the studied parameter. @@ -12,10 +13,16 @@ #' label of value variable used for title rendering. #' @param label_paramcd (`character`)\cr #' variable label used for title rendering. +#' @param interact_var (`character`)\cr name of the variable that should have interactions with arm. If the +#' interaction is not needed, the default option is `NULL`. +#' @param interact_y (`character`)\cr a selected item from the `interact_var` column which will be used to select the +#' specific ANCOVA results. If the interaction is not needed, the default option is `FALSE`. +#' +#' @inherit template_arguments return #' #' @seealso [tm_t_ancova()] -#' @keywords internal #' +#' @keywords internal template_ancova <- function(dataname = "ANL", parentname = "ADSL", arm_var, @@ -409,11 +416,15 @@ template_ancova <- function(dataname = "ANL", y } -#' Teal Module: `ANCOVA` Teal Module +#' teal Module: ANCOVA Summary +#' +#' This module produces a table to summarize analysis of variance. #' #' @inheritParams module_arguments #' @inheritParams template_ancova #' +#' @inherit module_arguments return +#' #' @details This module produces an analysis of variance summary table that is #' similar to `AOVT01` when multiple endpoints are selected. #' When a single endpoint is selected, both unadjusted and adjusted comparison @@ -429,6 +440,9 @@ template_ancova <- function(dataname = "ANL", #' #' @export #' +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. +#' #' @examples #' ADSL <- tmc_ex_adsl #' ADQS <- tmc_ex_adqs @@ -556,7 +570,7 @@ tm_t_ancova <- function(label, ) } -#' @noRd +#' @keywords internal ui_ancova <- function(id, ...) { a <- list(...) is_single_dataset_value <- teal.transform::is_single_dataset( @@ -661,7 +675,7 @@ ui_ancova <- function(id, ...) { ) } -#' @noRd +#' @keywords internal srv_ancova <- function(id, data, reporter, diff --git a/man/template_ancova.Rd b/man/template_ancova.Rd index 6d459a553f..bd60001f9e 100644 --- a/man/template_ancova.Rd +++ b/man/template_ancova.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_ancova.R \name{template_ancova} \alias{template_ancova} -\title{Template: \code{ANCOVA} summary} +\title{Template: ANCOVA Summary} \usage{ template_ancova( dataname = "ANL", @@ -51,8 +51,8 @@ label of value variable used for title rendering.} \item{interact_var}{(\code{character})\cr name of the variable that should have interactions with arm. If the interaction is not needed, the default option is \code{NULL}.} -\item{interact_y}{(\code{character})\cr a selected item from the interact_var column which will be used to select the -specific \code{ANCOVA} results. If the interaction is not needed, the default option is \code{FALSE}.} +\item{interact_y}{(\code{character})\cr a selected item from the \code{interact_var} column which will be used to select the +specific ANCOVA results. If the interaction is not needed, the default option is \code{FALSE}.} \item{paramcd_levels}{(\code{character})\cr variable levels for the studied parameter.} @@ -77,8 +77,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Creates a valid expression for analysis of variance summary table. +Creates a valid expression to generate an analysis of variance summary table. } \seealso{ \code{\link[=tm_t_ancova]{tm_t_ancova()}} diff --git a/man/template_arguments.Rd b/man/template_arguments.Rd index f4f3947753..856e168211 100644 --- a/man/template_arguments.Rd +++ b/man/template_arguments.Rd @@ -77,12 +77,6 @@ For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", p \item{include_interact}{(\code{logical})\cr whether an interaction term should be included in the model.} -\item{interact_var}{(\code{character})\cr name of the variable that should have interactions with arm. If the -interaction is not needed, the default option is \code{NULL}.} - -\item{interact_y}{(\code{character})\cr a selected item from the interact_var column which will be used to select the -specific \code{ANCOVA} results. If the interaction is not needed, the default option is \code{FALSE}.} - \item{llt}{(\code{character})\cr name of the variable with low level term for events.} \item{na_level}{(\code{string})\cr used to replace all \code{NA} or empty values diff --git a/man/tm_t_ancova.Rd b/man/tm_t_ancova.Rd index 9dce1ead63..4074fea19f 100644 --- a/man/tm_t_ancova.Rd +++ b/man/tm_t_ancova.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_ancova.R \name{tm_t_ancova} \alias{tm_t_ancova} -\title{Teal Module: \code{ANCOVA} Teal Module} +\title{teal Module: ANCOVA Summary} \usage{ tm_t_ancova( label, @@ -78,8 +78,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -Teal Module: \code{ANCOVA} Teal Module +This module produces a table to summarize analysis of variance. } \details{ This module produces an analysis of variance summary table that is @@ -156,3 +159,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} diff --git a/tests/testthat/_snaps/tm_t_events.md b/tests/testthat/_snaps/tm_t_events.md index 730e19938d..a603a1b48a 100644 --- a/tests/testthat/_snaps/tm_t_events.md +++ b/tests/testthat/_snaps/tm_t_events.md @@ -169,8 +169,8 @@ adsl <- adsl %>% dplyr::filter(ACTARM %in% arm_levels) adsl <- adsl %>% dplyr::mutate(ACTARM = droplevels(ACTARM)) adsl <- df_explicit_na(adsl, na_level = "") - anl <- anl %>% dplyr::mutate(`:=`(AEBODSYS, as.character(AEBODSYS))) - anl <- anl %>% dplyr::mutate(`:=`(AEDECOD, as.character(AEDECOD))) + anl[["AEBODSYS"]] <- as.character(anl[["AEBODSYS"]]) + anl[["AEDECOD"]] <- as.character(anl[["AEDECOD"]]) anl <- anl %>% df_explicit_na(omit_columns = setdiff(names(anl), c("AEBODSYS", "AEDECOD"))) } diff --git a/tests/testthat/_snaps/tm_t_events_summary.md b/tests/testthat/_snaps/tm_t_events_summary.md index 814a1ce30a..2afa6acc19 100644 --- a/tests/testthat/_snaps/tm_t_events_summary.md +++ b/tests/testthat/_snaps/tm_t_events_summary.md @@ -11,8 +11,9 @@ anl <- anl %>% dplyr::mutate(ARM = factor(ARM, levels = arm_levels)) study_id <- unique(anl[["STUDYID"]]) anl$tmp_aefl <- "Y" - anl <- anl %>% dplyr::mutate(`:=`(AEDECOD, as.character(AEDECOD)), - USUBJID_AESEQ = paste(USUBJID, AESEQ, sep = "@@")) + anl[["AEDECOD"]] <- as.character(anl[["AEDECOD"]]) + anl <- anl %>% dplyr::mutate(USUBJID_AESEQ = paste(USUBJID, + AESEQ, sep = "@@")) anl <- df_explicit_na(anl, na_level = "") adsl <- df_explicit_na(adsl, na_level = "") } @@ -62,8 +63,9 @@ anl <- anl %>% dplyr::mutate(ARM = factor(ARM, levels = arm_levels)) study_id <- unique(anl[["STUDYID"]]) anl$tmp_aefl <- "Y" - anl <- anl %>% dplyr::mutate(`:=`(AEDECOD, as.character(AEDECOD)), - USUBJID_AESEQ = paste(USUBJID, AESEQ, sep = "@@")) + anl[["AEDECOD"]] <- as.character(anl[["AEDECOD"]]) + anl <- anl %>% dplyr::mutate(USUBJID_AESEQ = paste(USUBJID, + AESEQ, sep = "@@")) flag_var_anl_label <- formatters::var_labels(anl[, c("A", "B", "C")], fill = FALSE) flag_var_aesi_label <- formatters::var_labels(anl[, c("X", From d908ba512c9580b9cd38fbf534ac3b0b564a75a8 Mon Sep 17 00:00:00 2001 From: ayogasekaram Date: Fri, 2 Feb 2024 19:54:34 +0000 Subject: [PATCH 028/126] [skip actions] Bump version to 0.8.16.9058 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 04f2ac5492..a68ce4cd80 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9057 +Version: 0.8.16.9058 Date: 2024-02-02 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index af48120dda..8225df866e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9057 +# teal.modules.clinical 0.8.16.9058 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 6b1f80b1b02930e7d1c8986a52cfdf33b16b8b89 Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Fri, 2 Feb 2024 16:42:30 -0500 Subject: [PATCH 029/126] Clean up documentation for `tm_t_smq` (#1018) Fixes #969 --- R/argument_convention.R | 2 ++ R/tm_t_smq.R | 39 ++++++++++++++++++++++----------------- inst/WORDLIST | 1 + man/template_arguments.Rd | 3 +++ man/template_smq.Rd | 18 +++++++++--------- man/tm_t_smq.Rd | 27 ++++++++++++++++----------- 6 files changed, 53 insertions(+), 37 deletions(-) diff --git a/R/argument_convention.R b/R/argument_convention.R index 8791c03966..665f8fd862 100644 --- a/R/argument_convention.R +++ b/R/argument_convention.R @@ -68,6 +68,8 @@ #' rates between any two columns. #' @param prune_freq (`number`)\cr threshold to use for trimming table using event incidence rate in any column. #' @param ref_arm (`character`)\cr the level of reference arm in case of arm comparison. +#' @param sort_criteria (`character`)\cr criteria to use to sort the table. Default option `freq_desc` sorts by +#' decreasing total number of patients with event. Alternative option `alpha` sorts events alphabetically. #' @param strata_var (`character`)\cr names of the variables for stratified analysis. #' @param subgroup_var (`character`)\cr with variable names that can be used as subgroups. #' @param sum_vars (`character`)\cr names of the variables that should be summarized. diff --git a/R/tm_t_smq.R b/R/tm_t_smq.R index f6e28ca0bf..91c68a6fbe 100644 --- a/R/tm_t_smq.R +++ b/R/tm_t_smq.R @@ -1,17 +1,16 @@ -#' Adverse Events Table by Standardized `MedDRA` Query +#' Template: Adverse Events Table by Standardized MedDRA Query +#' +#' Creates a valid expression to generate an adverse events table by Standardized MedDRA Query. #' #' @inheritParams template_arguments -#' @param sort_criteria (`character`)\cr how to sort the final table. Default option `freq_desc` sorts -#' by decreasing total number of patients with event. Alternative option `alpha` sorts events -#' alphabetically. -#' @param smq_varlabel (`character`)\cr label of the new column `SMQ` -#' created by [tern::h_stack_by_baskets()]. -#' @param baskets (`character`)\cr -#' variable names of the selected Standardized/Customized queries +#' @param smq_varlabel (`character`)\cr label to use for new column `SMQ` created by [tern::h_stack_by_baskets()]. +#' @param baskets (`character`)\cr names of the selected standardized/customized queries variables. +#' +#' @inherit template_arguments return #' #' @seealso [tm_t_smq()] -#' @keywords internal #' +#' @keywords internal template_smq <- function(dataname, parentname, arm_var, @@ -305,17 +304,21 @@ template_smq <- function(dataname, y } -#' Teal Module: `SMQ` Table +#' teal Module: Adverse Events Table by Standardized MedDRA Query +#' +#' This module produces an adverse events table by Standardized MedDRA Query. #' -#' @description Adverse Events Table by Standardized `MedDRA` Query. #' @inheritParams module_arguments #' @inheritParams template_smq -#' @param baskets ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' object with all available choices and preselected options for Standardized/Customized queries -#' @param scopes ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' object with all available choices for the scopes of Standardized queries. +#' @param baskets ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected options for standardized/customized queries. +#' @param scopes ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices for the scopes of standardized queries. #' -#' @export +#' @inherit module_arguments return +#' +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. #' #' @examples #' data <- teal_data() @@ -366,6 +369,7 @@ template_smq <- function(dataname, #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_t_smq <- function(label, dataname, parentname = ifelse( @@ -435,7 +439,7 @@ tm_t_smq <- function(label, ) } -#' @noRd +#' @keywords internal ui_t_smq <- function(id, ...) { ns <- shiny::NS(id) a <- list(...) # module args @@ -522,6 +526,7 @@ ui_t_smq <- function(id, ...) { ) } +#' @keywords internal srv_t_smq <- function(id, data, reporter, diff --git a/inst/WORDLIST b/inst/WORDLIST index 03bb355af8..a2ff8d9190 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -9,6 +9,7 @@ Getter Hoffmann Kaplan MMRM +MedDRA NSE Rua SMQ diff --git a/man/template_arguments.Rd b/man/template_arguments.Rd index 856e168211..0d810fbeaf 100644 --- a/man/template_arguments.Rd +++ b/man/template_arguments.Rd @@ -101,6 +101,9 @@ rates between any two columns.} \item{ref_arm}{(\code{character})\cr the level of reference arm in case of arm comparison.} +\item{sort_criteria}{(\code{character})\cr criteria to use to sort the table. Default option \code{freq_desc} sorts by +decreasing total number of patients with event. Alternative option \code{alpha} sorts events alphabetically.} + \item{strata_var}{(\code{character})\cr names of the variables for stratified analysis.} \item{subgroup_var}{(\code{character})\cr with variable names that can be used as subgroups.} diff --git a/man/template_smq.Rd b/man/template_smq.Rd index d1946624cf..6dad50fb30 100644 --- a/man/template_smq.Rd +++ b/man/template_smq.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_smq.R \name{template_smq} \alias{template_smq} -\title{Adverse Events Table by Standardized \code{MedDRA} Query} +\title{Template: Adverse Events Table by Standardized MedDRA Query} \usage{ template_smq( dataname, @@ -35,9 +35,8 @@ template_smq( enabled (see \code{add_total}). Defaults to \code{"All Patients"}. To set a new default \code{total_label} to apply in all modules, run \code{set_default_total_label("new_default")}.} -\item{sort_criteria}{(\code{character})\cr how to sort the final table. Default option \code{freq_desc} sorts -by decreasing total number of patients with event. Alternative option \code{alpha} sorts events -alphabetically.} +\item{sort_criteria}{(\code{character})\cr criteria to use to sort the table. Default option \code{freq_desc} sorts by +decreasing total number of patients with event. Alternative option \code{alpha} sorts events alphabetically.} \item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the @@ -48,11 +47,9 @@ user input for this parameter is ignored.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{smq_varlabel}{(\code{character})\cr label of the new column \code{SMQ} -created by \code{\link[tern:h_stack_by_baskets]{tern::h_stack_by_baskets()}}.} +\item{smq_varlabel}{(\code{character})\cr label to use for new column \code{SMQ} created by \code{\link[tern:h_stack_by_baskets]{tern::h_stack_by_baskets()}}.} -\item{baskets}{(\code{character})\cr -variable names of the selected Standardized/Customized queries} +\item{baskets}{(\code{character})\cr names of the selected standardized/customized queries variables.} \item{id_var}{(\code{character})\cr the variable name for subject id.} @@ -62,8 +59,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Adverse Events Table by Standardized \code{MedDRA} Query +Creates a valid expression to generate an adverse events table by Standardized MedDRA Query. } \seealso{ \code{\link[=tm_t_smq]{tm_t_smq()}} diff --git a/man/tm_t_smq.Rd b/man/tm_t_smq.Rd index 171096a797..7c4dc2fd0e 100644 --- a/man/tm_t_smq.Rd +++ b/man/tm_t_smq.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_smq.R \name{tm_t_smq} \alias{tm_t_smq} -\title{Teal Module: \code{SMQ} Table} +\title{teal Module: Adverse Events Table by Standardized MedDRA Query} \usage{ tm_t_smq( label, @@ -49,9 +49,8 @@ second variable will be nested under the first variable.} enabled (see \code{add_total}). Defaults to \code{"All Patients"}. To set a new default \code{total_label} to apply in all modules, run \code{set_default_total_label("new_default")}.} -\item{sort_criteria}{(\code{character})\cr how to sort the final table. Default option \code{freq_desc} sorts -by decreasing total number of patients with event. Alternative option \code{alpha} sorts events -alphabetically.} +\item{sort_criteria}{(\code{character})\cr criteria to use to sort the table. Default option \code{freq_desc} sorts by +decreasing total number of patients with event. Alternative option \code{alpha} sorts events alphabetically.} \item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the @@ -62,14 +61,13 @@ user input for this parameter is ignored.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{smq_varlabel}{(\code{character})\cr label of the new column \code{SMQ} -created by \code{\link[tern:h_stack_by_baskets]{tern::h_stack_by_baskets()}}.} +\item{smq_varlabel}{(\code{character})\cr label to use for new column \code{SMQ} created by \code{\link[tern:h_stack_by_baskets]{tern::h_stack_by_baskets()}}.} -\item{baskets}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -object with all available choices and preselected options for Standardized/Customized queries} +\item{baskets}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected options for standardized/customized queries.} -\item{scopes}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -object with all available choices for the scopes of Standardized queries.} +\item{scopes}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices for the scopes of standardized queries.} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. For example a title.} @@ -83,8 +81,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -Adverse Events Table by Standardized \code{MedDRA} Query. +This module produces an adverse events table by Standardized MedDRA Query. } \examples{ data <- teal_data() @@ -136,3 +137,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} From 0648518bdb97208f90fadc5c2c283b8d9e71e696 Mon Sep 17 00:00:00 2001 From: edelarua Date: Fri, 2 Feb 2024 21:43:24 +0000 Subject: [PATCH 030/126] [skip actions] Bump version to 0.8.16.9059 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index a68ce4cd80..66753d7899 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9058 +Version: 0.8.16.9059 Date: 2024-02-02 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 8225df866e..fc3c32764a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9058 +# teal.modules.clinical 0.8.16.9059 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 65d667bd060bee79986b027327eeef9edd083e20 Mon Sep 17 00:00:00 2001 From: Abinaya Yogasekaram <73252787+ayogasekaram@users.noreply.github.com> Date: Fri, 2 Feb 2024 16:55:07 -0500 Subject: [PATCH 031/126] clean up documentation for tm_t_abnormality_by_worst_grade (#1029) closes #948 --- R/tm_t_abnormality_by_worst_grade.R | 27 ++++++++++++++++------ man/template_abnormality_by_worst_grade.Rd | 13 +++++++---- man/tm_t_abnormality_by_worst_grade.Rd | 10 ++++++-- 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/R/tm_t_abnormality_by_worst_grade.R b/R/tm_t_abnormality_by_worst_grade.R index 74cbc2d3d8..41d3e2b260 100644 --- a/R/tm_t_abnormality_by_worst_grade.R +++ b/R/tm_t_abnormality_by_worst_grade.R @@ -1,12 +1,17 @@ #' Template: Laboratory test results with highest grade post-baseline +#' +#' Creates a valid expression to generate a table to summarize abnormality by grade. +#' #' @inheritParams template_arguments -#' @param atoxgr_var (`character`)\cr the variable name indicating +#' @param atoxgr_var (`character`)\cr name of the variable indicating #' Analysis Toxicity Grade. -#' @param worst_high_flag_var (`character`)\cr the variable name indicating +#' @param worst_high_flag_var (`character`)\cr name of the variable indicating #' Worst High Grade flag -#' @param worst_low_flag_var (`character`)\cr the variable name indicating +#' @param worst_low_flag_var (`character`)\cr name of the variable indicating #' Worst Low Grade flag -#' @param worst_flag_indicator (`character`)\cr value indicating worst grade. +#' @param worst_flag_indicator (`character`)\cr flag value indicating the worst grade. +#' +#' @inherit template_arguments return #' #' @seealso [tm_t_abnormality_by_worst_grade()] #' @keywords internal @@ -226,8 +231,10 @@ template_abnormality_by_worst_grade <- function(parentname, # nolint y } -#' Teal Module: Laboratory test results with highest grade post-baseline +#' teal Module: Laboratory test results with highest grade post-baseline #' +#' This module produces a table to summarize laboratory test results with highest grade post-baseline + #' @inheritParams module_arguments #' @inheritParams template_abnormality_by_worst_grade #' @param atoxgr_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr @@ -240,10 +247,16 @@ template_abnormality_by_worst_grade <- function(parentname, # nolint #' object with all available choices and preselected option for variable names that can be used as Worst Low Grade flag. #' @param worst_flag_indicator ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr #' value indicating worst grade. +#' +#' @inherit module_arguments return +#' #' @seealso [template_abnormality_by_worst_grade()] +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. #' #' @export #' +#' #' @examples #' ADSL <- tmc_ex_adsl #' ADLB <- tmc_ex_adlb %>% @@ -374,7 +387,7 @@ tm_t_abnormality_by_worst_grade <- function(label, # nolint ) } -#' @noRd +#' @keywords internal ui_t_abnormality_by_worst_grade <- function(id, ...) { # nolint ns <- shiny::NS(id) @@ -471,7 +484,7 @@ ui_t_abnormality_by_worst_grade <- function(id, ...) { # nolint ) } -#' @noRd +#' @keywords internal srv_t_abnormality_by_worst_grade <- function(id, # nolint data, reporter, diff --git a/man/template_abnormality_by_worst_grade.Rd b/man/template_abnormality_by_worst_grade.Rd index c20e64665a..6e7786b302 100644 --- a/man/template_abnormality_by_worst_grade.Rd +++ b/man/template_abnormality_by_worst_grade.Rd @@ -31,16 +31,16 @@ template_abnormality_by_worst_grade( \item{paramcd}{(\code{character})\cr variable value designating the studied parameter.} -\item{atoxgr_var}{(\code{character})\cr the variable name indicating +\item{atoxgr_var}{(\code{character})\cr name of the variable indicating Analysis Toxicity Grade.} -\item{worst_high_flag_var}{(\code{character})\cr the variable name indicating +\item{worst_high_flag_var}{(\code{character})\cr name of the variable indicating Worst High Grade flag} -\item{worst_low_flag_var}{(\code{character})\cr the variable name indicating +\item{worst_low_flag_var}{(\code{character})\cr name of the variable indicating Worst Low Grade flag} -\item{worst_flag_indicator}{(\code{character})\cr value indicating worst grade.} +\item{worst_flag_indicator}{(\code{character})\cr flag value indicating the worst grade.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} @@ -59,8 +59,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Template: Laboratory test results with highest grade post-baseline +Creates a valid expression to generate a table to summarize abnormality by grade. } \seealso{ \code{\link[=tm_t_abnormality_by_worst_grade]{tm_t_abnormality_by_worst_grade()}} diff --git a/man/tm_t_abnormality_by_worst_grade.Rd b/man/tm_t_abnormality_by_worst_grade.Rd index c37f3d3158..627d781fd0 100644 --- a/man/tm_t_abnormality_by_worst_grade.Rd +++ b/man/tm_t_abnormality_by_worst_grade.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_abnormality_by_worst_grade.R \name{tm_t_abnormality_by_worst_grade} \alias{tm_t_abnormality_by_worst_grade} -\title{Teal Module: Laboratory test results with highest grade post-baseline} +\title{teal Module: Laboratory test results with highest grade post-baseline} \usage{ tm_t_abnormality_by_worst_grade( label, @@ -85,8 +85,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -Teal Module: Laboratory test results with highest grade post-baseline +This module produces a table to summarize laboratory test results with highest grade post-baseline } \examples{ ADSL <- tmc_ex_adsl @@ -130,4 +133,7 @@ if (interactive()) { } \seealso{ \code{\link[=template_abnormality_by_worst_grade]{template_abnormality_by_worst_grade()}} + +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. } From b0a8840bea5f1eff239aafbe3ee3ecf1785a93d6 Mon Sep 17 00:00:00 2001 From: ayogasekaram Date: Fri, 2 Feb 2024 21:56:11 +0000 Subject: [PATCH 032/126] [skip actions] Bump version to 0.8.16.9060 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 66753d7899..074f8261fa 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9059 +Version: 0.8.16.9060 Date: 2024-02-02 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index fc3c32764a..0abeb5c2d1 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9059 +# teal.modules.clinical 0.8.16.9060 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 8e6c73410f7b57203fb89a2ede4ceeafcdb0fc82 Mon Sep 17 00:00:00 2001 From: Abinaya Yogasekaram <73252787+ayogasekaram@users.noreply.github.com> Date: Fri, 2 Feb 2024 17:15:31 -0500 Subject: [PATCH 033/126] clean up tm_t_abnormality documentation (#1027) closes #947 --- R/tm_t_abnormality.R | 22 ++++++++++++++++------ man/template_abnormality.Rd | 11 +++++++---- man/tm_t_abnormality.Rd | 8 ++++++-- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/R/tm_t_abnormality.R b/R/tm_t_abnormality.R index 844e7e28c6..ad90bd5ab2 100644 --- a/R/tm_t_abnormality.R +++ b/R/tm_t_abnormality.R @@ -1,15 +1,19 @@ #' Template: Abnormality Summary Table #' +#' Creates a valid expression to generate a table to summarize abnormality. +#' #' @inheritParams template_arguments #' @param exclude_base_abn (`logical`)\cr whether to exclude patients who had abnormal values at baseline. -#' @param grade (`character`)\cr name of the variable that can be used to +#' @param grade (`character`)\cr name of the variable used to #' specify the abnormality grade. Variable must be factor. #' @param abnormal (`named list`)\cr indicating abnormality direction and grades. #' @param baseline_var (`character`)\cr -#' name of the variable for baseline abnormality grade. -#' @param na_level (`character`)\cr the NA level in the input dataset, default to `""`. +#' name of the variable specifying baseline abnormality grade. +#' @param na_level (`character`)\cr the NA level in the input dataset, defaults to `""`. #' @param tbl_title (`character`)\cr Title with label of variables from by bars #' +#' @inherit template_arguments return +#' #' @seealso [tm_t_abnormality()] #' @keywords internal #' @@ -221,7 +225,9 @@ template_abnormality <- function(parentname, } -#' Teal Module: Abnormality Summary Table +#' teal Module: Abnormality Summary Table +#' +#' This module produces a table to summarize abnormality. #' #' @inheritParams module_arguments #' @inheritParams template_abnormality @@ -237,6 +243,10 @@ template_abnormality <- function(parentname, #' excluded in accordance with `GDSR` specifications by using `exclude_base_abn`. #' #' @export +#' +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. +#' #' @examples #' data <- teal_data() #' data <- within(data, { @@ -373,7 +383,7 @@ tm_t_abnormality <- function(label, ) } -#' @noRd +#' @keywords internal ui_t_abnormality <- function(id, ...) { ns <- shiny::NS(id) a <- list(...) # module args @@ -471,7 +481,7 @@ ui_t_abnormality <- function(id, ...) { ) } -#' @noRd +#' @keywords internal srv_t_abnormality <- function(id, data, reporter, diff --git a/man/template_abnormality.Rd b/man/template_abnormality.Rd index ef337df693..c5e467b1fe 100644 --- a/man/template_abnormality.Rd +++ b/man/template_abnormality.Rd @@ -37,11 +37,11 @@ template_abnormality( \item{abnormal}{(\verb{named list})\cr indicating abnormality direction and grades.} -\item{grade}{(\code{character})\cr name of the variable that can be used to +\item{grade}{(\code{character})\cr name of the variable used to specify the abnormality grade. Variable must be factor.} \item{baseline_var}{(\code{character})\cr -name of the variable for baseline abnormality grade.} +name of the variable specifying baseline abnormality grade.} \item{treatment_flag_var}{(\code{character})\cr name of the on treatment flag variable.} @@ -61,7 +61,7 @@ set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var \code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and user input for this parameter is ignored.} -\item{na_level}{(\code{character})\cr the NA level in the input dataset, default to \code{""}.} +\item{na_level}{(\code{character})\cr the NA level in the input dataset, defaults to \code{""}.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default @@ -71,8 +71,11 @@ For more details, see the vignette: \code{vignette("custom-basic-table-arguments \item{tbl_title}{(\code{character})\cr Title with label of variables from by bars} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Template: Abnormality Summary Table +Creates a valid expression to generate a table to summarize abnormality. } \seealso{ \code{\link[=tm_t_abnormality]{tm_t_abnormality()}} diff --git a/man/tm_t_abnormality.Rd b/man/tm_t_abnormality.Rd index efa947e19b..c053287bfc 100644 --- a/man/tm_t_abnormality.Rd +++ b/man/tm_t_abnormality.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_abnormality.R \name{tm_t_abnormality} \alias{tm_t_abnormality} -\title{Teal Module: Abnormality Summary Table} +\title{teal Module: Abnormality Summary Table} \usage{ tm_t_abnormality( label, @@ -92,7 +92,7 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \description{ -Teal Module: Abnormality Summary Table +This module produces a table to summarize abnormality. } \note{ Patients with the same abnormality at baseline as on the treatment visit can be @@ -149,3 +149,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} From c8378f4878ae229bcaeb28708cbfd8894fdbf91b Mon Sep 17 00:00:00 2001 From: ayogasekaram Date: Fri, 2 Feb 2024 22:16:27 +0000 Subject: [PATCH 034/126] [skip actions] Bump version to 0.8.16.9061 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 074f8261fa..270a083fc9 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9060 +Version: 0.8.16.9061 Date: 2024-02-02 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 0abeb5c2d1..248dcb8d29 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9060 +# teal.modules.clinical 0.8.16.9061 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 50a35e00578ae171e2ecb8ed7369a89f5bf1fe6e Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Fri, 2 Feb 2024 17:27:55 -0500 Subject: [PATCH 035/126] Clean up documentation for `tm_t_shift_by_arm` (#1031) Fixes #943 --- R/tm_t_shift_by_arm.R | 30 +++++++++++++++++---------- R/tm_t_shift_by_arm_by_worst.R | 9 +++----- man/template_shift_by_arm.Rd | 12 ++++++----- man/template_shift_by_arm_by_worst.Rd | 4 ++-- man/tm_t_shift_by_arm.Rd | 14 +++++++++---- 5 files changed, 41 insertions(+), 28 deletions(-) diff --git a/R/tm_t_shift_by_arm.R b/R/tm_t_shift_by_arm.R index 41042415b0..6135a6d619 100644 --- a/R/tm_t_shift_by_arm.R +++ b/R/tm_t_shift_by_arm.R @@ -1,14 +1,17 @@ #' Template: Shift by Arm #' +#' Creates a valid expression to generate a summary table of analysis indicator levels by arm. +#' #' @inheritParams template_arguments -#' @param aval_var (`character`)\cr the variable name for the analysis reference range indicator. -#' @param baseline_var (`character`)\cr the variable name for the baseline reference range indicator. -#' @param add_total (`logical`)\cr -#' whether to include row with total number of patients. +#' @param aval_var (`character`)\cr name of the analysis reference range indicator variable. +#' @param baseline_var (`character`)\cr name of the baseline reference range indicator variable. +#' @param add_total (`logical`)\cr whether to include row with total number of patients. +#' +#' @inherit template_arguments return #' #' @seealso [tm_t_shift_by_arm()] -#' @keywords internal #' +#' @keywords internal template_shift_by_arm <- function(dataname, parentname, arm_var = "ARM", @@ -175,14 +178,18 @@ template_shift_by_arm <- function(dataname, y } -#' Teal Module: Shift by Arm +#' teal Module: Shift by Arm +#' +#' This module produces a summary table of analysis indicator levels by arm. #' #' @inheritParams module_arguments #' @inheritParams template_shift_by_arm -#' @param add_total (`logical`)\cr -#' whether to include row with total number of patients. #' -#' @export +#' @inherit module_arguments return +#' +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. +#' #' @examples #' ADSL <- tmc_ex_adsl #' ADEG <- tmc_ex_adeg @@ -228,6 +235,7 @@ template_shift_by_arm <- function(dataname, #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_t_shift_by_arm <- function(label, dataname, parentname = ifelse( @@ -309,7 +317,7 @@ tm_t_shift_by_arm <- function(label, ) } -#' @noRd +#' @keywords internal ui_shift_by_arm <- function(id, ...) { ns <- shiny::NS(id) a <- list(...) @@ -399,7 +407,7 @@ ui_shift_by_arm <- function(id, ...) { ) } -#' @noRd +#' @keywords internal srv_shift_by_arm <- function(id, data, reporter, diff --git a/R/tm_t_shift_by_arm_by_worst.R b/R/tm_t_shift_by_arm_by_worst.R index a0d69edea2..d9175cf072 100644 --- a/R/tm_t_shift_by_arm_by_worst.R +++ b/R/tm_t_shift_by_arm_by_worst.R @@ -1,11 +1,9 @@ -#' Template: Shift by Arm +#' Template: Shift by Arm by Worst Analysis Indicator Level #' -#' Creates a valid expression to generate a summary table of analysis indicator levels by arm. +#' Creates a valid expression to generate a summary table of worst analysis indicator variable level per subject by arm. #' +#' @inheritParams template_shift_by_arm #' @inheritParams template_arguments -#' @param add_total (`logical`)\cr whether to include row with total number of patients. -#' @param aval_var (`character`)\cr name of the analysis reference range indicator variable. -#' @param baseline_var (`character`)\cr name of the baseline reference range indicator variable. #' @param worst_flag (`character`)\cr value indicating worst analysis indicator level. #' #' @inherit template_arguments return @@ -192,7 +190,6 @@ template_shift_by_arm_by_worst <- function(dataname, #' #' @inheritParams module_arguments #' @inheritParams template_shift_by_arm_by_worst -#' @param add_total (`logical`)\cr whether to include row with total number of patients. #' #' @inherit module_arguments return #' diff --git a/man/template_shift_by_arm.Rd b/man/template_shift_by_arm.Rd index 9626497afd..2ed330c795 100644 --- a/man/template_shift_by_arm.Rd +++ b/man/template_shift_by_arm.Rd @@ -39,11 +39,11 @@ template_shift_by_arm( \item{treatment_flag}{(\code{character})\cr name of the value indicating on treatment records in \code{treatment_flag_var}.} -\item{aval_var}{(\code{character})\cr the variable name for the analysis reference range indicator.} +\item{aval_var}{(\code{character})\cr name of the analysis reference range indicator variable.} \item{base_var}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Please use the \code{baseline_var} argument instead.} -\item{baseline_var}{(\code{character})\cr the variable name for the baseline reference range indicator.} +\item{baseline_var}{(\code{character})\cr name of the baseline reference range indicator variable.} \item{na.rm}{(\code{logical})\cr whether \code{NA} values should be removed prior to analysis.} @@ -51,8 +51,7 @@ records in \code{treatment_flag_var}.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{add_total}{(\code{logical})\cr -whether to include row with total number of patients.} +\item{add_total}{(\code{logical})\cr whether to include row with total number of patients.} \item{total_label}{(\code{string})\cr string to display as total column/row label if column/row is enabled (see \code{add_total}). Defaults to \code{"All Patients"}. To set a new default \code{total_label} to @@ -64,8 +63,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Template: Shift by Arm +Creates a valid expression to generate a summary table of analysis indicator levels by arm. } \seealso{ \code{\link[=tm_t_shift_by_arm]{tm_t_shift_by_arm()}} diff --git a/man/template_shift_by_arm_by_worst.Rd b/man/template_shift_by_arm_by_worst.Rd index f3d0d4cc5b..8a543c510f 100644 --- a/man/template_shift_by_arm_by_worst.Rd +++ b/man/template_shift_by_arm_by_worst.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_shift_by_arm_by_worst.R \name{template_shift_by_arm_by_worst} \alias{template_shift_by_arm_by_worst} -\title{Template: Shift by Arm} +\title{Template: Shift by Arm by Worst Analysis Indicator Level} \usage{ template_shift_by_arm_by_worst( dataname, @@ -69,7 +69,7 @@ For more details, see the vignette: \code{vignette("custom-basic-table-arguments a \code{list} of expressions to generate a table or plot object. } \description{ -Creates a valid expression to generate a summary table of analysis indicator levels by arm. +Creates a valid expression to generate a summary table of worst analysis indicator variable level per subject by arm. } \seealso{ \code{\link[=tm_t_shift_by_arm]{tm_t_shift_by_arm()}} diff --git a/man/tm_t_shift_by_arm.Rd b/man/tm_t_shift_by_arm.Rd index 9a80ee3ce2..93cd856993 100644 --- a/man/tm_t_shift_by_arm.Rd +++ b/man/tm_t_shift_by_arm.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_shift_by_arm.R \name{tm_t_shift_by_arm} \alias{tm_t_shift_by_arm} -\title{Teal Module: Shift by Arm} +\title{teal Module: Shift by Arm} \usage{ tm_t_shift_by_arm( label, @@ -65,8 +65,7 @@ records in \code{treatment_flag_var}.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{add_total}{(\code{logical})\cr -whether to include row with total number of patients.} +\item{add_total}{(\code{logical})\cr whether to include row with total number of patients.} \item{total_label}{(\code{string})\cr string to display as total column/row label if column/row is enabled (see \code{add_total}). Defaults to \code{"All Patients"}. To set a new default \code{total_label} to @@ -84,8 +83,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -Teal Module: Shift by Arm +This module produces a summary table of analysis indicator levels by arm. } \examples{ ADSL <- tmc_ex_adsl @@ -133,3 +135,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} From 123f4c50cbbfa0c1c94c82cc1ae42aa67e814796 Mon Sep 17 00:00:00 2001 From: edelarua Date: Fri, 2 Feb 2024 22:28:49 +0000 Subject: [PATCH 036/126] [skip actions] Bump version to 0.8.16.9062 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 270a083fc9..dfc452fb59 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9061 +Version: 0.8.16.9062 Date: 2024-02-02 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 248dcb8d29..914bf4ceb1 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9061 +# teal.modules.clinical 0.8.16.9062 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From fbacded69ba0c278dc1af97a6ceb7216f83cd6e7 Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Fri, 2 Feb 2024 17:37:27 -0500 Subject: [PATCH 037/126] Clean up `tm_g_km` documentation (#1030) Fixes #963 --- R/tm_g_km.R | 38 ++++++++++++++++++-------------------- man/template_g_km.Rd | 11 ++++++----- man/tm_g_km.Rd | 17 +++++++++++------ 3 files changed, 35 insertions(+), 31 deletions(-) diff --git a/R/tm_g_km.R b/R/tm_g_km.R index 3fe8e1d2e1..401c5c1c1d 100644 --- a/R/tm_g_km.R +++ b/R/tm_g_km.R @@ -1,15 +1,17 @@ -#' Template: `Kaplan-Meier` +#' Template: Kaplan-Meier Plot +#' +#' Creates a valid expression to generate a Kaplan-Meier plot. #' #' @inheritParams template_arguments #' @inheritParams tern::g_km #' @inheritParams tern::control_coxreg -#' @param facet_var (`character`)\cr -#' object with all available choices and preselected option -#' for variable names that can be used for facet plotting. +#' @param facet_var (`character`)\cr name of the variable to use to facet the plot. +#' +#' @inherit template_arguments return #' #' @seealso [tm_g_km()] -#' @keywords internal #' +#' @keywords internal template_g_km <- function(dataname = "ANL", arm_var = "ARM", ref_arm = NULL, @@ -231,19 +233,19 @@ template_g_km <- function(dataname = "ANL", y } - -#' Teal Module: `Kaplan-Meier` +#' teal Module: Kaplan-Meier Plot #' -#' This teal module produces a grid style `Kaplan-Meier` plot for data with -#' `ADaM` structure. +#' This module produces a grid-style Kaplan-Meier plot for data with ADaM structure. #' #' @inheritParams module_arguments #' @inheritParams template_g_km -#' @param facet_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' object with all available choices and preselected option -#' for variable names that can be used for facet plotting. +#' @param facet_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' all available choices and preselected option for names of variable that can be used for plot faceting. #' -#' @export +#' @inherit module_arguments return +#' +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. #' #' @examples #' library(nestcolor) @@ -299,6 +301,7 @@ template_g_km <- function(dataname = "ANL", #' shinyApp(ui = app$ui, server = app$server) #' } #' +#' @export tm_g_km <- function(label, dataname, parentname = ifelse( @@ -375,9 +378,7 @@ tm_g_km <- function(label, ) } - -#' User Interface for KM Module -#' @noRd +#' @keywords internal ui_g_km <- function(id, ...) { a <- list(...) is_single_dataset_value <- teal.transform::is_single_dataset( @@ -562,10 +563,7 @@ ui_g_km <- function(id, ...) { ) } - -#' Server for KM Module -#' @noRd -#' +#' @keywords internal srv_g_km <- function(id, data, reporter, diff --git a/man/template_g_km.Rd b/man/template_g_km.Rd index ca8a921f22..514acfc6f0 100644 --- a/man/template_g_km.Rd +++ b/man/template_g_km.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_g_km.R \name{template_g_km} \alias{template_g_km} -\title{Template: \code{Kaplan-Meier}} +\title{Template: Kaplan-Meier Plot} \usage{ template_g_km( dataname = "ANL", @@ -57,9 +57,7 @@ an optimal tick position on the x axis.} \item{time_points}{(\code{character})\cr time points that can be used in \code{\link[tern:survival_timepoint]{tern::surv_timepoint()}}.} -\item{facet_var}{(\code{character})\cr -object with all available choices and preselected option -for variable names that can be used for facet plotting.} +\item{facet_var}{(\code{character})\cr name of the variable to use to facet the plot.} \item{font_size}{(\code{numeric})\cr font size value.} @@ -91,8 +89,11 @@ median survival time per group.} \item{title}{(\code{character})\cr title of the output.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Template: \code{Kaplan-Meier} +Creates a valid expression to generate a Kaplan-Meier plot. } \seealso{ \code{\link[=tm_g_km]{tm_g_km()}} diff --git a/man/tm_g_km.Rd b/man/tm_g_km.Rd index 936d8b2c93..15062c5e6e 100644 --- a/man/tm_g_km.Rd +++ b/man/tm_g_km.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_g_km.R \name{tm_g_km} \alias{tm_g_km} -\title{Teal Module: \code{Kaplan-Meier}} +\title{teal Module: Kaplan-Meier Plot} \usage{ tm_g_km( label, @@ -52,9 +52,8 @@ reference and comparison arms when the arm variable is changed.} \item{strata_var}{(\code{choices_selected} or \code{data_extract_spec})\cr names of the variables for stratified analysis.} -\item{facet_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -object with all available choices and preselected option -for variable names that can be used for facet plotting.} +\item{facet_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and preselected option for names of variable that can be used for plot faceting.} \item{time_unit_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected option for the time unit variable.} @@ -80,9 +79,11 @@ For example a title.} \item{post_output}{optional, (\code{shiny.tag})\cr with text placed after the output to put the output into context. For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are useful.} } +\value{ +a \code{teal_module} object. +} \description{ -This teal module produces a grid style \code{Kaplan-Meier} plot for data with -\code{ADaM} structure. +This module produces a grid-style Kaplan-Meier plot for data with ADaM structure. } \examples{ library(nestcolor) @@ -139,3 +140,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} From f154b7cd046405eb8dc497938557677186d13492 Mon Sep 17 00:00:00 2001 From: edelarua Date: Fri, 2 Feb 2024 22:38:19 +0000 Subject: [PATCH 038/126] [skip actions] Bump version to 0.8.16.9063 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index dfc452fb59..6ae1a46380 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9062 +Version: 0.8.16.9063 Date: 2024-02-02 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 914bf4ceb1..c28f0f38c5 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9062 +# teal.modules.clinical 0.8.16.9063 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From ab3221700cb85406fd2d9defc50487f978a47d56 Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Fri, 2 Feb 2024 17:55:28 -0500 Subject: [PATCH 039/126] Clean up documentation for `tm_t_events_patyear` (#1032) Fixes #946 --- R/argument_convention.R | 3 +++ R/tm_g_ipp.R | 3 --- R/tm_t_binary_outcome.R | 1 - R/tm_t_events_patyear.R | 34 +++++++++++++++++++++------------- R/tm_t_exposure.R | 2 -- man/module_arguments.Rd | 3 +++ man/template_arguments.Rd | 2 ++ man/template_events_patyear.Rd | 11 +++++++---- man/tm_g_ipp.Rd | 5 ++--- man/tm_t_events_patyear.Rd | 19 +++++++++++++------ man/tm_t_exposure.Rd | 4 ++-- 11 files changed, 53 insertions(+), 34 deletions(-) diff --git a/R/argument_convention.R b/R/argument_convention.R index 665f8fd862..3b50bad4d7 100644 --- a/R/argument_convention.R +++ b/R/argument_convention.R @@ -32,6 +32,7 @@ #' @param compare_arm (`logical`)\cr triggers the comparison between study arms. #' @param comp_arm (`character`)\cr the level of comparison arm in case of arm comparison. #' @param conf_level (`numeric`)\cr value for the confidence level within the range of (0, 1). +#' @param control (`list`)\cr list of settings for the analysis. #' @param cov_var (`character`)\cr names of the covariates variables. #' @param dataname (`character`)\cr analysis data used in teal module. #' @param denominator (`character`)\cr chooses how percentages are calculated. With option `N`, the reference @@ -124,6 +125,8 @@ NULL #' available choices and preselected option for the `ATIREL` variable from `dataname`. #' @param aval_var (`choices_selected` or `data_extract_spec`)\cr object with all available choices and preselected #' option for the analysis variable. +#' @param avalu_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' all available choices and preselected option for the analysis unit variable. #' @param avisit (`choices_selected` or `data_extract_spec`)\cr value of analysis visit `AVISIT` of interest. #' @param baseline_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with #' all available choices and preselected option for variable values that can be used as `baseline_var`. diff --git a/R/tm_g_ipp.R b/R/tm_g_ipp.R index 7f1e026d02..da5f85c7b3 100644 --- a/R/tm_g_ipp.R +++ b/R/tm_g_ipp.R @@ -178,9 +178,6 @@ template_g_ipp <- function(dataname = "ANL", #' @param arm_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr #' object with all available choices #' and preselected option for variable values that can be used as `arm_var`. -#' @param avalu_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' object with all available choices -#' and preselected option for variable values that can be used as `avalu_var`. #' @param ggplot2_args optional, (`ggplot2_args`)\cr #' object created by [teal.widgets::ggplot2_args()] with settings for the module plot. #' For this module, this argument will only accept `ggplot2_args` object with `labs` list of following child elements: diff --git a/R/tm_t_binary_outcome.R b/R/tm_t_binary_outcome.R index 770f25767d..0aef5c9ae6 100644 --- a/R/tm_t_binary_outcome.R +++ b/R/tm_t_binary_outcome.R @@ -3,7 +3,6 @@ #' Creates a valid expression to generate a binary outcome analysis. #' #' @inheritParams template_arguments -#' @param control (`list`)\cr list of settings for the analysis. #' @param responder_val (`character`)\cr the short label for observations to #' translate `AVALC` into responder/non-responder. #' @param responder_val_levels (`character`)\cr the levels of responses that will be shown in the multinomial diff --git a/R/tm_t_events_patyear.R b/R/tm_t_events_patyear.R index a61e61edff..e3e04db2cf 100644 --- a/R/tm_t_events_patyear.R +++ b/R/tm_t_events_patyear.R @@ -1,13 +1,16 @@ -#' Template: Event rates adjusted for patient-years +#' Template: Event Rates Adjusted for Patient-Years +#' +#' Creates a valid expression to generate a table of event rates adjusted for patient-years. #' #' @inheritParams template_arguments -#' @param control (`list`)\cr list of settings for the analysis. -#' @param events_var (`integer`)\cr number of observed events. -#' @param label_paramcd (`string`)\cr title of table based on `paramcd` +#' @param events_var (`character`)\cr name of the variable for number of observed events. +#' @param label_paramcd (`character`)\cr `paramcd` variable text to use in the table title. +#' +#' @inherit template_arguments return #' #' @seealso [tm_t_events_patyear()] -#' @keywords internal #' +#' @keywords internal template_events_patyear <- function(dataname, parentname, arm_var, @@ -143,16 +146,20 @@ template_events_patyear <- function(dataname, y } -#' Teal module: Event rates adjusted for patient-years +#' teal Module: Event Rates Adjusted for Patient-Years +#' +#' This module produces a table of event rates adjusted for patient-years. #' #' @inheritParams module_arguments #' @inheritParams template_events_patyear -#' @param avalu_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' object with all available choices and preselected option for the analysis unit variable. -#' @param events_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' object with all event counts. +#' @param events_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' all available choices and preselected option for the variable with all event counts. +#' +#' @inherit module_arguments return +#' +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. #' -#' @export #' @examples #' ADSL <- tmc_ex_adsl #' ADAETTE <- tmc_ex_adaette %>% @@ -197,6 +204,7 @@ template_events_patyear <- function(dataname, #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_t_events_patyear <- function(label, dataname, parentname = ifelse( @@ -274,7 +282,7 @@ tm_t_events_patyear <- function(label, ) } -#' @noRd +#' @keywords internal ui_events_patyear <- function(id, ...) { ns <- shiny::NS(id) a <- list(...) @@ -372,7 +380,7 @@ ui_events_patyear <- function(id, ...) { ) } -#' @noRd +#' @keywords internal srv_events_patyear <- function(id, data, reporter, diff --git a/R/tm_t_exposure.R b/R/tm_t_exposure.R index aacd21cf38..41d2c8c499 100644 --- a/R/tm_t_exposure.R +++ b/R/tm_t_exposure.R @@ -219,8 +219,6 @@ template_exposure <- function(parentname, #' @param parcat ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr #' object with all available choices and preselected option for #' parameter category values. -#' @param avalu_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' object with the analysis unit variable. #' @param paramcd_label (`character`)\cr #' the column from the dataset where the value will be used to label the argument `paramcd`. #' diff --git a/man/module_arguments.Rd b/man/module_arguments.Rd index e67de1bdfd..ffbf46d8ec 100644 --- a/man/module_arguments.Rd +++ b/man/module_arguments.Rd @@ -22,6 +22,9 @@ available choices and preselected option for the \code{ATIREL} variable from \co \item{aval_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected option for the analysis variable.} +\item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and preselected option for the analysis unit variable.} + \item{avisit}{(\code{choices_selected} or \code{data_extract_spec})\cr value of analysis visit \code{AVISIT} of interest.} \item{baseline_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with diff --git a/man/template_arguments.Rd b/man/template_arguments.Rd index 0d810fbeaf..21dd1961b9 100644 --- a/man/template_arguments.Rd +++ b/man/template_arguments.Rd @@ -46,6 +46,8 @@ For more details, see the vignette: \code{vignette("custom-basic-table-arguments \item{conf_level}{(\code{numeric})\cr value for the confidence level within the range of (0, 1).} +\item{control}{(\code{list})\cr list of settings for the analysis.} + \item{cov_var}{(\code{character})\cr names of the covariates variables.} \item{dataname}{(\code{character})\cr analysis data used in teal module.} diff --git a/man/template_events_patyear.Rd b/man/template_events_patyear.Rd index 52da1d76a6..a825ecd513 100644 --- a/man/template_events_patyear.Rd +++ b/man/template_events_patyear.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_events_patyear.R \name{template_events_patyear} \alias{template_events_patyear} -\title{Template: Event rates adjusted for patient-years} +\title{Template: Event Rates Adjusted for Patient-Years} \usage{ template_events_patyear( dataname, @@ -26,9 +26,9 @@ template_events_patyear( \item{arm_var}{(\code{character})\cr variable names that can be used as \code{arm_var}.} -\item{events_var}{(\code{integer})\cr number of observed events.} +\item{events_var}{(\code{character})\cr name of the variable for number of observed events.} -\item{label_paramcd}{(\code{string})\cr title of table based on \code{paramcd}} +\item{label_paramcd}{(\code{character})\cr \code{paramcd} variable text to use in the table title.} \item{aval_var}{(\code{character})\cr name of the analysis value variable.} @@ -55,8 +55,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Template: Event rates adjusted for patient-years +Creates a valid expression to generate a table of event rates adjusted for patient-years. } \seealso{ \code{\link[=tm_t_events_patyear]{tm_t_events_patyear()}} diff --git a/man/tm_g_ipp.Rd b/man/tm_g_ipp.Rd index b823beb4e4..ebc7ace0ee 100644 --- a/man/tm_g_ipp.Rd +++ b/man/tm_g_ipp.Rd @@ -55,9 +55,8 @@ option for variable names that can be used as \code{visit} variable. Must be a f \item{aval_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected option for the analysis variable.} -\item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -object with all available choices -and preselected option for variable values that can be used as \code{avalu_var}.} +\item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and preselected option for the analysis unit variable.} \item{base_var}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Please use the \code{baseline_var} argument instead.} diff --git a/man/tm_t_events_patyear.Rd b/man/tm_t_events_patyear.Rd index 56157d4bfc..2f5f283005 100644 --- a/man/tm_t_events_patyear.Rd +++ b/man/tm_t_events_patyear.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_events_patyear.R \name{tm_t_events_patyear} \alias{tm_t_events_patyear} -\title{Teal module: Event rates adjusted for patient-years} +\title{teal Module: Event Rates Adjusted for Patient-Years} \usage{ tm_t_events_patyear( label, @@ -40,16 +40,16 @@ It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{events_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -object with all event counts.} +\item{events_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and preselected option for the variable with all event counts.} \item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} \item{aval_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected option for the analysis variable.} -\item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -object with all available choices and preselected option for the analysis unit variable.} +\item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and preselected option for the analysis unit variable.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} @@ -81,8 +81,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -Teal module: Event rates adjusted for patient-years +This module produces a table of event rates adjusted for patient-years. } \examples{ ADSL <- tmc_ex_adsl @@ -129,3 +132,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} diff --git a/man/tm_t_exposure.Rd b/man/tm_t_exposure.Rd index 2db6e5fd3d..8bbeee1122 100644 --- a/man/tm_t_exposure.Rd +++ b/man/tm_t_exposure.Rd @@ -60,8 +60,8 @@ parameter category values.} \item{aval_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected option for the analysis variable.} -\item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -object with the analysis unit variable.} +\item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and preselected option for the analysis unit variable.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} From 85a639eddfbfe2581392db6cd1940c0b69e3136d Mon Sep 17 00:00:00 2001 From: edelarua Date: Fri, 2 Feb 2024 22:56:19 +0000 Subject: [PATCH 040/126] [skip actions] Bump version to 0.8.16.9064 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 6ae1a46380..d3c32294a9 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9063 +Version: 0.8.16.9064 Date: 2024-02-02 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index c28f0f38c5..98b3544222 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9063 +# teal.modules.clinical 0.8.16.9064 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From b3dbaf0d16258b0463b29406653059ea58fe413c Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Fri, 2 Feb 2024 18:08:06 -0500 Subject: [PATCH 041/126] Clean up documentation for `tm_g_forest_tte` (#1021) Fixes #967 --- R/tm_g_forest_rsp.R | 1 + R/tm_g_forest_tte.R | 26 ++++++++++++-------------- man/template_forest_tte.Rd | 5 ++++- man/tm_g_forest_tte.Rd | 21 ++++++++++++--------- 4 files changed, 29 insertions(+), 24 deletions(-) diff --git a/R/tm_g_forest_rsp.R b/R/tm_g_forest_rsp.R index b52dd6e78d..9e99a8a775 100644 --- a/R/tm_g_forest_rsp.R +++ b/R/tm_g_forest_rsp.R @@ -8,6 +8,7 @@ #' @param col_symbol_size (`integer` or `NULL`)\cr column index to be used to determine relative size for #' estimator plot symbol. Typically, the symbol size is proportional to the sample size used #' to calculate the estimator. If `NULL`, the same symbol size is used for all subgroups. +#' @param strata_var (`character`)\cr names of the variables for stratified analysis. #' @param ggplot2_args optional, (`ggplot2_args`)\cr object created by [teal.widgets::ggplot2_args()] with settings #' for the module plot. For this module, this argument will only accept `ggplot2_args` object with `labs` list of #' following child elements: `title`, `caption`. No other elements would be taken into account. The argument is diff --git a/R/tm_g_forest_tte.R b/R/tm_g_forest_tte.R index ecd5184897..aeddfa9b7b 100644 --- a/R/tm_g_forest_tte.R +++ b/R/tm_g_forest_tte.R @@ -1,13 +1,15 @@ #' Template: Survival Forest Plot #' -#' Creates a valid expression for survival forest plot. +#' Creates a valid expression to generate a survival forest plot. #' #' @inheritParams template_arguments #' @inheritParams template_forest_rsp #' +#' @inherit template_arguments return +#' #' @seealso [tm_g_forest_tte()] -#' @keywords internal #' +#' @keywords internal template_forest_tte <- function(dataname = "ANL", parentname = "ANL_ADSL", arm_var, @@ -197,23 +199,17 @@ template_forest_tte <- function(dataname = "ANL", y } -#' Teal Module: Forest Survival Plot teal Module +#' teal Module: Forest Survival Plot #' -#' This teal module produces a grid style Forest plot for time-to-event data -#' with `ADaM` structure +#' This module produces a grid-style forest plot for time-to-event data with ADaM structure. #' #' @inheritParams module_arguments #' @inheritParams template_forest_tte -#' @param ggplot2_args optional, (`ggplot2_args`)\cr -#' object created by [teal.widgets::ggplot2_args()] with settings for the module plot. -#' For this module, this argument will only accept `ggplot2_args` object with `labs` list of following child elements: -#' `title`, `caption`. -#' No other elements would be taken into account. The argument is merged with option `teal.ggplot2_args` and -#' with default module arguments (hard coded in the module body). #' -#' For more details, see the vignette: `vignette("custom-ggplot2-arguments", package = "teal.widgets")`. +#' @inherit module_arguments return #' -#' @export +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. #' #' @examples #' library(nestcolor) @@ -272,6 +268,7 @@ template_forest_tte <- function(dataname = "ANL", #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_g_forest_tte <- function(label, dataname, parentname = ifelse( @@ -352,7 +349,7 @@ tm_g_forest_tte <- function(label, ) } - +#' @keywords internal ui_g_forest_tte <- function(id, ...) { a <- list(...) is_single_dataset_value <- teal.transform::is_single_dataset( @@ -448,6 +445,7 @@ ui_g_forest_tte <- function(id, ...) { ) } +#' @keywords internal srv_g_forest_tte <- function(id, data, reporter, diff --git a/man/template_forest_tte.Rd b/man/template_forest_tte.Rd index f739fe9ba2..76c1d5976e 100644 --- a/man/template_forest_tte.Rd +++ b/man/template_forest_tte.Rd @@ -56,8 +56,11 @@ for the module plot. The argument is merged with option \code{teal.ggplot2_args} For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Creates a valid expression for survival forest plot. +Creates a valid expression to generate a survival forest plot. } \seealso{ \code{\link[=tm_g_forest_tte]{tm_g_forest_tte()}} diff --git a/man/tm_g_forest_tte.Rd b/man/tm_g_forest_tte.Rd index f15b97a55e..012b082c5d 100644 --- a/man/tm_g_forest_tte.Rd +++ b/man/tm_g_forest_tte.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_g_forest_tte.R \name{tm_g_forest_tte} \alias{tm_g_forest_tte} -\title{Teal Module: Forest Survival Plot teal Module} +\title{teal Module: Forest Survival Plot} \usage{ tm_g_forest_tte( label, @@ -84,18 +84,17 @@ For example a title.} \item{post_output}{optional, (\code{shiny.tag})\cr with text placed after the output to put the output into context. For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are useful.} -\item{ggplot2_args}{optional, (\code{ggplot2_args})\cr -object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. -For this module, this argument will only accept \code{ggplot2_args} object with \code{labs} list of following child elements: -\code{title}, \code{caption}. -No other elements would be taken into account. The argument is merged with option \code{teal.ggplot2_args} and -with default module arguments (hard coded in the module body). +\item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings +for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments +(hard coded in the module body). For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -This teal module produces a grid style Forest plot for time-to-event data -with \code{ADaM} structure +This module produces a grid-style forest plot for time-to-event data with ADaM structure. } \examples{ library(nestcolor) @@ -155,3 +154,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} From d197291ddd0ad42f02c6e6b28b4e2947d1cf26e2 Mon Sep 17 00:00:00 2001 From: edelarua Date: Fri, 2 Feb 2024 23:08:59 +0000 Subject: [PATCH 042/126] [skip actions] Bump version to 0.8.16.9065 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index d3c32294a9..c46d5c3a86 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9064 +Version: 0.8.16.9065 Date: 2024-02-02 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 98b3544222..62cde02e5b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9064 +# teal.modules.clinical 0.8.16.9065 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 2969dad1299b8bed75597e7e3b636db12744e513 Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Fri, 2 Feb 2024 19:31:31 -0500 Subject: [PATCH 043/126] Clean up documentation for `tm_g_lineplot` (#996) # Pull Request Fixes #976 --- R/tm_g_lineplot.R | 50 +++++++++++++++----------------------- man/template_g_lineplot.Rd | 22 ++++++++--------- man/tm_g_lineplot.Rd | 26 +++++++++++--------- 3 files changed, 46 insertions(+), 52 deletions(-) diff --git a/R/tm_g_lineplot.R b/R/tm_g_lineplot.R index 602c9d3653..d24badad1b 100644 --- a/R/tm_g_lineplot.R +++ b/R/tm_g_lineplot.R @@ -1,24 +1,25 @@ #' Template: Line Plot #' +#' Creates a valid expression to generate a [ggplot2::ggplot()] line plot. +#' #' @inheritParams tern::g_lineplot #' @inheritParams tern::control_lineplot_vars #' @inheritParams template_arguments -#' @param param (`character`)\cr -#' parameter chosen to filter the data by. -#' @param incl_screen (`logical`)\cr -#' should the screening visit be included. -#' @param ggplot2_args optional, (`ggplot2_args`)\cr -#' object created by [teal.widgets::ggplot2_args()] with settings for the module plot. -#' For this module, this argument will only accept `ggplot2_args` object with `labs` list of following child elements: -#' `title`, `subtitle`, `caption`, `y`, `lty`. -#' No other elements would be taken into account. The argument is merged with option `teal.ggplot2_args` and -#' with default module arguments (hard coded in the module body). +#' @param param (`character`)\cr parameter to filter the data by. +#' @param incl_screen (`logical`)\cr whether the screening visit should be included. +#' @param ggplot2_args optional, (`ggplot2_args`)\cr object created by [teal.widgets::ggplot2_args()] with settings +#' for the module plot. For this module, this argument will only accept `ggplot2_args` object with `labs` list of +#' following child elements: `title`, `subtitle`, `caption`, `y`, `lty`. No other elements would be taken into +#' account. The argument is merged with option `teal.ggplot2_args` and with default module arguments (hard coded in +#' the module body). #' #' For more details, see the vignette: `vignette("custom-ggplot2-arguments", package = "teal.widgets")`. #' +#' @inherit template_arguments return +#' #' @seealso [tm_g_lineplot()] -#' @keywords internal #' +#' @keywords internal template_g_lineplot <- function(dataname = "ANL", strata = "ARM", x = "AVISIT", @@ -196,24 +197,17 @@ template_g_lineplot <- function(dataname = "ANL", z } - -#' Teal Module: Line Plot +#' teal Module: Line Plot #' -#' This teal module produces a grid style Line Plot for data with -#' `ADaM` structure. +#' This module produces a [ggplot2::ggplot()] type line plot, with optional summary table, for standard ADaM data. #' #' @inheritParams module_arguments #' @inheritParams template_g_lineplot -#' @param ggplot2_args optional, (`ggplot2_args`)\cr -#' object created by [teal.widgets::ggplot2_args()] with settings for the module plot. -#' For this module, this argument will only accept `ggplot2_args` object with `labs` list of following child elements: -#' `title`, `subtitle`, `caption`, `y`, `lty`. -#' No other elements would be taken into account. The argument is merged with option `teal.ggplot2_args` and -#' with default module arguments (hard coded in the module body) #' -#' For more details, see the vignette: `vignette("custom-ggplot2-arguments", package = "teal.widgets")`. +#' @inherit module_arguments return #' -#' @export +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. #' #' @examples #' library(nestcolor) @@ -253,6 +247,7 @@ template_g_lineplot <- function(dataname = "ANL", #' shinyApp(ui = app$ui, server = app$server) #' } #' +#' @export tm_g_lineplot <- function(label, dataname, parentname = ifelse( @@ -343,9 +338,7 @@ tm_g_lineplot <- function(label, ) } - -#' User Interface for Line Plot Module -#' @noRd +#' @keywords internal ui_g_lineplot <- function(id, ...) { a <- list(...) is_single_dataset_value <- teal.transform::is_single_dataset( @@ -502,10 +495,7 @@ ui_g_lineplot <- function(id, ...) { ) } - -#' Server for Line Plot Module -#' @noRd -#' +#' @keywords internal srv_g_lineplot <- function(id, data, reporter, diff --git a/man/template_g_lineplot.Rd b/man/template_g_lineplot.Rd index 1c7d4def37..c32738eb65 100644 --- a/man/template_g_lineplot.Rd +++ b/man/template_g_lineplot.Rd @@ -39,8 +39,7 @@ template_g_lineplot( \item{paramcd}{(\code{character} or \code{NA})\cr \code{paramcd} variable name.} -\item{param}{(\code{character})\cr -parameter chosen to filter the data by.} +\item{param}{(\code{character})\cr parameter to filter the data by.} \item{mid}{(\code{character} or \code{NULL})\cr names of the statistics that will be plotted as midpoints. All the statistics indicated in \code{mid} variable must be present in the object returned by \code{sfun}, @@ -64,8 +63,7 @@ or point and line (\code{pl}).} \item{conf_level}{(\code{numeric})\cr value for the confidence level within the range of (0, 1).} -\item{incl_screen}{(\code{logical})\cr -should the screening visit be included.} +\item{incl_screen}{(\code{logical})\cr whether the screening visit should be included.} \item{mid_point_size}{(\code{integer} or \code{double})\cr controls the font size of the point for \code{mid} plot.} @@ -75,17 +73,19 @@ should the screening visit be included.} \item{y_lab}{(\code{character})\cr y-axis label. If equal to \code{NULL}, then no label will be added.} -\item{ggplot2_args}{optional, (\code{ggplot2_args})\cr -object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. -For this module, this argument will only accept \code{ggplot2_args} object with \code{labs} list of following child elements: -\code{title}, \code{subtitle}, \code{caption}, \code{y}, \code{lty}. -No other elements would be taken into account. The argument is merged with option \code{teal.ggplot2_args} and -with default module arguments (hard coded in the module body). +\item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings +for the module plot. For this module, this argument will only accept \code{ggplot2_args} object with \code{labs} list of +following child elements: \code{title}, \code{subtitle}, \code{caption}, \code{y}, \code{lty}. No other elements would be taken into +account. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in +the module body). For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Template: Line Plot +Creates a valid expression to generate a \code{\link[ggplot2:ggplot]{ggplot2::ggplot()}} line plot. } \seealso{ \code{\link[=tm_g_lineplot]{tm_g_lineplot()}} diff --git a/man/tm_g_lineplot.Rd b/man/tm_g_lineplot.Rd index 6ff5cb8e32..5dca1f93a9 100644 --- a/man/tm_g_lineplot.Rd +++ b/man/tm_g_lineplot.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_g_lineplot.R \name{tm_g_lineplot} \alias{tm_g_lineplot} -\title{Teal Module: Line Plot} +\title{teal Module: Line Plot} \usage{ tm_g_lineplot( label, @@ -54,8 +54,7 @@ tm_g_lineplot( \item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} -\item{param}{(\code{character})\cr -parameter chosen to filter the data by.} +\item{param}{(\code{character})\cr parameter to filter the data by.} \item{conf_level}{(\code{choices_selected})\cr object with all available choices and preselected option for the confidence level, each within range of (0, 1).} @@ -96,18 +95,19 @@ For example a title.} \item{post_output}{optional, (\code{shiny.tag})\cr with text placed after the output to put the output into context. For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are useful.} -\item{ggplot2_args}{optional, (\code{ggplot2_args})\cr -object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. -For this module, this argument will only accept \code{ggplot2_args} object with \code{labs} list of following child elements: -\code{title}, \code{subtitle}, \code{caption}, \code{y}, \code{lty}. -No other elements would be taken into account. The argument is merged with option \code{teal.ggplot2_args} and -with default module arguments (hard coded in the module body) +\item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings +for the module plot. For this module, this argument will only accept \code{ggplot2_args} object with \code{labs} list of +following child elements: \code{title}, \code{subtitle}, \code{caption}, \code{y}, \code{lty}. No other elements would be taken into +account. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in +the module body). For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -This teal module produces a grid style Line Plot for data with -\code{ADaM} structure. +This module produces a \code{\link[ggplot2:ggplot]{ggplot2::ggplot()}} type line plot, with optional summary table, for standard ADaM data. } \examples{ library(nestcolor) @@ -148,3 +148,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} From e93812242327d305fa37a20f2e32abf5c97274c2 Mon Sep 17 00:00:00 2001 From: shajoezhu Date: Sat, 3 Feb 2024 00:32:28 +0000 Subject: [PATCH 044/126] [skip actions] Bump version to 0.8.16.9066 --- DESCRIPTION | 4 ++-- NEWS.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index c46d5c3a86..35ca882b96 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9065 -Date: 2024-02-02 +Version: 0.8.16.9066 +Date: 2024-02-03 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), person("Jana", "Stoilova", , "jana.stoilova@roche.com", role = "aut"), diff --git a/NEWS.md b/NEWS.md index 62cde02e5b..13a5eb7d58 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9065 +# teal.modules.clinical 0.8.16.9066 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 9521c4d7461cb65be276ca893d5c006a4df63885 Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Fri, 2 Feb 2024 19:44:06 -0500 Subject: [PATCH 045/126] Clean up documentation for `tm_t_coxreg` (#995) # Pull Request Fixes #957 --- R/tm_t_coxreg.R | 89 ++++++++++++++--------------- inst/WORDLIST | 2 - man/template_coxreg_m.Rd | 15 ++--- man/template_coxreg_u.Rd | 13 +++-- man/tm_t_coxreg.Rd | 59 ++++++++++--------- vignettes/teal-modules-clinical.Rmd | 2 +- 6 files changed, 89 insertions(+), 91 deletions(-) diff --git a/R/tm_t_coxreg.R b/R/tm_t_coxreg.R index ebcc60e60d..834af3c82b 100644 --- a/R/tm_t_coxreg.R +++ b/R/tm_t_coxreg.R @@ -1,16 +1,18 @@ #' Template: Univariable Cox Regression #' -#' Creates a valid expression for Cox regression analysis. +#' Creates a valid expression to generate a univariable Cox regression analysis. #' #' @inheritParams template_arguments -#' @param control (`list`)\cr list of settings for the analysis, see [control_coxreg()]. -#' @param at (`list` of `numeric`)\cr when the candidate covariate is a `numeric`, use `at` -#' to specify the value of the covariate at which the effect should be estimated. -#' @param append (`logical`)\cr if the result should be appended to the previous one. +#' @param control (`list`)\cr list of settings for the analysis (see [control_coxreg()]). +#' @param at (`list` of `numeric`)\cr when the candidate covariate is a `numeric` type variable, use `at` +#' to specify the value of the covariate at which the effect should be estimated. +#' @param append (`logical`)\cr whether the result should be appended to the previous one. #' -#' @seealso [tm_t_coxreg()] -#' @keywords internal +#' @inherit template_arguments return +#' +#' @seealso [template_coxreg_m()], [tm_t_coxreg()] #' +#' @keywords internal template_coxreg_u <- function(dataname, cov_var, arm_var, @@ -169,18 +171,16 @@ template_coxreg_u <- function(dataname, #' Template: Multi-Variable Cox Regression #' -#' Creates a valid expression for Cox regression analysis. +#' Creates a valid expression to generate a multi-variable Cox regression analysis. #' +#' @inheritParams template_coxreg_u #' @inheritParams template_arguments -#' @param control (`list`)\cr list of settings for the analysis, -#' see [control_coxreg()]. -#' @param at (`list` of `numeric`)\cr when the candidate covariate is a -#' `numeric`, use `at` to specify the value of the covariate at which the -#' effect should be estimated. #' -#' @seealso [tm_t_coxreg()] -#' @keywords internal +#' @inherit template_arguments return +#' +#' @seealso [template_coxreg_u()], [tm_t_coxreg()] #' +#' @keywords internal template_coxreg_m <- function(dataname, cov_var, arm_var, @@ -325,47 +325,44 @@ template_coxreg_m <- function(dataname, y } -#' Teal Module: Cox Regression Model +#' teal Module: Cox Regression Model #' -#' Teal module to fit Cox univariable or multi-variable models consistent with -#' `COXT01` and `COXT02` standard outputs, respectively. +#' This module fits Cox univariable or multi-variable models, consistent with the TLG Catalog +#' templates for Cox regression tables `COXT01` and `COXT02`, respectively. See the TLG Catalog entries +#' for `COXT01` [here](https://insightsengineering.github.io/tlg-catalog/stable/tables/efficacy/coxt01.html) +#' and `COXT02` [here](https://insightsengineering.github.io/tlg-catalog/stable/tables/efficacy/coxt02.html). #' #' @inheritParams module_arguments #' @inheritParams template_coxreg_u #' @inheritParams template_coxreg_m -#' @param multivariate (`logical`)\cr -#' If `FALSE`, the univariable approach is used -#' (equivalent to `COXT01` standard) instead of the multi-variable model -#' (equivalent to `COXT02` standard). +#' @param multivariate (`logical`)\cr if `FALSE`, the univariable approach is used instead of the +#' multi-variable model. #' #' @details #' The Cox Proportional Hazards (PH) model is the most commonly used method to -#' estimate the magnitude of -#' the effect in survival analysis. It assumes proportional hazards: the ratio -#' of the hazards between groups (e.g., two arms) is constant over time. +#' estimate the magnitude of the effect in survival analysis. It assumes proportional +#' hazards: the ratio of the hazards between groups (e.g., two arms) is constant over time. #' This ratio is referred to as the "hazard ratio" (HR) and is one of the most #' commonly reported metrics to describe the effect size in survival analysis. -#' For further information about the Cox Proportional Hazards Model, check -#' "Statistical Analysis of Clinical Trials Data with R", NEST team. #' #' This modules expects that the analysis data has the following variables: #' -#' \tabular{ll}{ -#' `AVAL` \tab time to event\cr -#' `CNSR` \tab boolean or 0,1 is element in `AVAL` censored\cr -#' `PARAMCD` \tab variable used to filter for endpoint (e.g. OS), after -#' filtering for `paramcd` one observation per patient is expected -#' } +#' * `AVAL`: time to event +#' * `CNSR`: 1 if record in `AVAL` is censored, 0 otherwise +#' * `PARAMCD`: variable used to filter for endpoint (e.g. OS). After +#' filtering for `PARAMCD` one observation per patient is expected #' -#' The arm variables, stratification and covariate variables are taken from the -#' `ADSL` data. +#' The arm variables and stratification/covariate variables are taken from the `ADSL` data. #' -#' @section Note: -#' - The likelihood ratio test is not supported for model including strata, -#' Wald test will be substituted. -#' - Multi-Variable is the default choice for backward compatibility. +#' @note +#' * The likelihood ratio test is not supported for models that include strata - the Wald +#' test will be substituted in these cases. +#' * Multi-variable is the default choice for backward compatibility. #' -#' @export +#' @inherit module_arguments return +#' +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. #' #' @examples #' ## First example @@ -418,10 +415,9 @@ template_coxreg_m <- function(dataname, #' shinyApp(app$ui, app$server) #' } #' -#' #' ## Second example #' ## ============== -#' ## This time, a synthetic pair of ADTTE/ADSL is fabricated for a Cox regression +#' ## This time, a synthetic pair of ADTTE/ADSL data is fabricated for Cox regression #' ## where ties and pval_method matter. #' #' ## Dataset fabrication @@ -462,9 +458,9 @@ template_coxreg_m <- function(dataname, #' join_keys(data) <- default_cdisc_join_keys[datanames] #' #' ## Teal application -#' ## ================ +#' ## ---------------- #' ## Note that the R code exported by `Show R Code` does not include the data -#' ## preprocessing. You will need to create the dataset as above before +#' ## pre-processing. You will need to create the dataset as above before #' ## running the exported R code. #' #' arm_ref_comp <- list(ARMCD = list(ref = "ARM A", comp = c("ARM B"))) @@ -489,6 +485,7 @@ template_coxreg_m <- function(dataname, #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_t_coxreg <- function(label, dataname, parentname = ifelse( @@ -556,7 +553,7 @@ tm_t_coxreg <- function(label, ) } -#' @noRd +#' @keywords internal ui_t_coxreg <- function(id, ...) { a <- list(...) # module args is_single_dataset_value <- teal.transform::is_single_dataset( @@ -693,7 +690,7 @@ ui_t_coxreg <- function(id, ...) { ) } -#' @noRd +#' @keywords internal srv_t_coxreg <- function(id, data, reporter, diff --git a/inst/WORDLIST b/inst/WORDLIST index a2ff8d9190..f06a2a3e2f 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -1,5 +1,3 @@ -ADAE -ADSL ADaM AE ANCOVA diff --git a/man/template_coxreg_m.Rd b/man/template_coxreg_m.Rd index 33548b7191..f36e7c139f 100644 --- a/man/template_coxreg_m.Rd +++ b/man/template_coxreg_m.Rd @@ -38,16 +38,14 @@ template_coxreg_m( \item{paramcd}{(\code{character})\cr variable value designating the studied parameter.} -\item{at}{(\code{list} of \code{numeric})\cr when the candidate covariate is a -\code{numeric}, use \code{at} to specify the value of the covariate at which the -effect should be estimated.} +\item{at}{(\code{list} of \code{numeric})\cr when the candidate covariate is a \code{numeric} type variable, use \code{at} +to specify the value of the covariate at which the effect should be estimated.} \item{strata_var}{(\code{character})\cr names of the variables for stratified analysis.} \item{combine_comp_arms}{(\code{logical})\cr triggers the combination of comparison arms.} -\item{control}{(\code{list})\cr list of settings for the analysis, -see \code{\link[=control_coxreg]{control_coxreg()}}.} +\item{control}{(\code{list})\cr list of settings for the analysis (see \code{\link[=control_coxreg]{control_coxreg()}}).} \item{na_level}{(\code{string})\cr used to replace all \code{NA} or empty values in character or factor variables in the data. Defaults to \code{""}. To set a @@ -59,10 +57,13 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Creates a valid expression for Cox regression analysis. +Creates a valid expression to generate a multi-variable Cox regression analysis. } \seealso{ -\code{\link[=tm_t_coxreg]{tm_t_coxreg()}} +\code{\link[=template_coxreg_u]{template_coxreg_u()}}, \code{\link[=tm_t_coxreg]{tm_t_coxreg()}} } \keyword{internal} diff --git a/man/template_coxreg_u.Rd b/man/template_coxreg_u.Rd index 1b2c1928e8..94b883dc3f 100644 --- a/man/template_coxreg_u.Rd +++ b/man/template_coxreg_u.Rd @@ -39,20 +39,20 @@ template_coxreg_u( \item{paramcd}{(\code{character})\cr variable value designating the studied parameter.} -\item{at}{(\code{list} of \code{numeric})\cr when the candidate covariate is a \code{numeric}, use \code{at} +\item{at}{(\code{list} of \code{numeric})\cr when the candidate covariate is a \code{numeric} type variable, use \code{at} to specify the value of the covariate at which the effect should be estimated.} \item{strata_var}{(\code{character})\cr names of the variables for stratified analysis.} \item{combine_comp_arms}{(\code{logical})\cr triggers the combination of comparison arms.} -\item{control}{(\code{list})\cr list of settings for the analysis, see \code{\link[=control_coxreg]{control_coxreg()}}.} +\item{control}{(\code{list})\cr list of settings for the analysis (see \code{\link[=control_coxreg]{control_coxreg()}}).} \item{na_level}{(\code{string})\cr used to replace all \code{NA} or empty values in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{append}{(\code{logical})\cr if the result should be appended to the previous one.} +\item{append}{(\code{logical})\cr whether the result should be appended to the previous one.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default @@ -60,10 +60,13 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Creates a valid expression for Cox regression analysis. +Creates a valid expression to generate a univariable Cox regression analysis. } \seealso{ -\code{\link[=tm_t_coxreg]{tm_t_coxreg()}} +\code{\link[=template_coxreg_m]{template_coxreg_m()}}, \code{\link[=tm_t_coxreg]{tm_t_coxreg()}} } \keyword{internal} diff --git a/man/tm_t_coxreg.Rd b/man/tm_t_coxreg.Rd index a071a871e8..003d21f091 100644 --- a/man/tm_t_coxreg.Rd +++ b/man/tm_t_coxreg.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_coxreg.R \name{tm_t_coxreg} \alias{tm_t_coxreg} -\title{Teal Module: Cox Regression Model} +\title{teal Module: Cox Regression Model} \usage{ tm_t_coxreg( label, @@ -59,10 +59,8 @@ option for the analysis variable.} \item{cnsr_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected option for the censoring variable.} -\item{multivariate}{(\code{logical})\cr -If \code{FALSE}, the univariable approach is used -(equivalent to \code{COXT01} standard) instead of the multi-variable model -(equivalent to \code{COXT02} standard).} +\item{multivariate}{(\code{logical})\cr if \code{FALSE}, the univariable approach is used instead of the +multi-variable model.} \item{na_level}{(\code{string})\cr used to replace all \code{NA} or empty values in character or factor variables in the data. Defaults to \code{""}. To set a @@ -83,41 +81,39 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -Teal module to fit Cox univariable or multi-variable models consistent with -\code{COXT01} and \code{COXT02} standard outputs, respectively. +This module fits Cox univariable or multi-variable models, consistent with the TLG Catalog +templates for Cox regression tables \code{COXT01} and \code{COXT02}, respectively. See the TLG Catalog entries +for \code{COXT01} \href{https://insightsengineering.github.io/tlg-catalog/stable/tables/efficacy/coxt01.html}{here} +and \code{COXT02} \href{https://insightsengineering.github.io/tlg-catalog/stable/tables/efficacy/coxt02.html}{here}. } \details{ The Cox Proportional Hazards (PH) model is the most commonly used method to -estimate the magnitude of -the effect in survival analysis. It assumes proportional hazards: the ratio -of the hazards between groups (e.g., two arms) is constant over time. +estimate the magnitude of the effect in survival analysis. It assumes proportional +hazards: the ratio of the hazards between groups (e.g., two arms) is constant over time. This ratio is referred to as the "hazard ratio" (HR) and is one of the most commonly reported metrics to describe the effect size in survival analysis. -For further information about the Cox Proportional Hazards Model, check -"Statistical Analysis of Clinical Trials Data with R", NEST team. This modules expects that the analysis data has the following variables: - -\tabular{ll}{ -\code{AVAL} \tab time to event\cr -\code{CNSR} \tab boolean or 0,1 is element in \code{AVAL} censored\cr -\code{PARAMCD} \tab variable used to filter for endpoint (e.g. OS), after -filtering for \code{paramcd} one observation per patient is expected +\itemize{ +\item \code{AVAL}: time to event +\item \code{CNSR}: 1 if record in \code{AVAL} is censored, 0 otherwise +\item \code{PARAMCD}: variable used to filter for endpoint (e.g. OS). After +filtering for \code{PARAMCD} one observation per patient is expected } -The arm variables, stratification and covariate variables are taken from the -\code{ADSL} data. +The arm variables and stratification/covariate variables are taken from the \code{ADSL} data. } -\section{Note}{ - +\note{ \itemize{ -\item The likelihood ratio test is not supported for model including strata, -Wald test will be substituted. -\item Multi-Variable is the default choice for backward compatibility. +\item The likelihood ratio test is not supported for models that include strata - the Wald +test will be substituted in these cases. +\item Multi-variable is the default choice for backward compatibility. } } - \examples{ ## First example ## ============= @@ -169,10 +165,9 @@ if (interactive()) { shinyApp(app$ui, app$server) } - ## Second example ## ============== -## This time, a synthetic pair of ADTTE/ADSL is fabricated for a Cox regression +## This time, a synthetic pair of ADTTE/ADSL data is fabricated for Cox regression ## where ties and pval_method matter. ## Dataset fabrication @@ -213,9 +208,9 @@ datanames(data) <- datanames join_keys(data) <- default_cdisc_join_keys[datanames] ## Teal application -## ================ +## ---------------- ## Note that the R code exported by `Show R Code` does not include the data -## preprocessing. You will need to create the dataset as above before +## pre-processing. You will need to create the dataset as above before ## running the exported R code. arm_ref_comp <- list(ARMCD = list(ref = "ARM A", comp = c("ARM B"))) @@ -241,3 +236,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} diff --git a/vignettes/teal-modules-clinical.Rmd b/vignettes/teal-modules-clinical.Rmd index 2f491a10a8..505775bac0 100644 --- a/vignettes/teal-modules-clinical.Rmd +++ b/vignettes/teal-modules-clinical.Rmd @@ -105,7 +105,7 @@ plots. There is no need to load `teal` as `teal.modules.clinical` already depends on it. In the next step, we use `teal` to create `shiny` UI and server functions that we can launch using `shiny`. The `data` -argument tells `teal` about the input data - the ADaM datasets ADSL and ADAE - and the `modules` +argument tells `teal` about the input data - the ADaM datasets `ADSL` and `ADAE` - and the `modules` argument indicates the modules included in the application. Here, we include only one module: `tm_g_barchart_simple()`. ```r From 41aed9645eca18ae1d683b8b4bb918a22c421e88 Mon Sep 17 00:00:00 2001 From: shajoezhu Date: Sat, 3 Feb 2024 00:44:59 +0000 Subject: [PATCH 046/126] [skip actions] Bump version to 0.8.16.9067 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 35ca882b96..e945aa4ea9 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9066 +Version: 0.8.16.9067 Date: 2024-02-03 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 13a5eb7d58..7dba3a24f3 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9066 +# teal.modules.clinical 0.8.16.9067 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 166986c8bc42766095a8d1cab3ff6c65d8ea7ac7 Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Fri, 2 Feb 2024 20:34:41 -0500 Subject: [PATCH 047/126] Clean up documentation for `tm_g_barchart_simple` (#1033) Fixes #954 --- R/tm_g_barchart_simple.R | 93 +++++++++++++++----------------- man/make_barchart_simple_call.Rd | 48 +++++++---------- man/tm_g_barchart_simple.Rd | 24 ++++++--- 3 files changed, 79 insertions(+), 86 deletions(-) diff --git a/R/tm_g_barchart_simple.R b/R/tm_g_barchart_simple.R index d1048f09b8..fb54aa21c7 100644 --- a/R/tm_g_barchart_simple.R +++ b/R/tm_g_barchart_simple.R @@ -1,18 +1,22 @@ -#' Simple bar chart plot that shows counts per category. +#' teal Module: Simple Bar Chart and Table of Counts per Category #' -#' Categories can be defined up to four levels deep and are defined through -#' `x`, `fill`, `x_facet` and `y_facet`. If any of them is `NULL`, -#' it is ignored. +#' This module produces a [ggplot2::ggplot()] type bar chart and summary table of counts per category. +#' +#' Categories can be defined up to four levels deep and are defined through the `x`, `fill`, +#' `x_facet`, and `y_facet` parameters. Any parameters set to `NULL` (default) are ignored. #' #' @inheritParams module_arguments #' @inheritParams template_arguments #' @param x (`data_extract_spec`)\cr variable on the x-axis. -#' @param fill (`data_extract_spec`)\cr grouping variable assigned to the bar colors. -#' @param x_facet (`data_extract_spec`)\cr faceting groups on the row dimension. -#' @param y_facet (`data_extract_spec`)\cr faceting groups on the col dimension. +#' @param fill (`data_extract_spec`)\cr grouping variable to determine bar colors. +#' @param x_facet (`data_extract_spec`)\cr row-wise faceting groups. +#' @param y_facet (`data_extract_spec`)\cr column-wise faceting groups. #' @param plot_options (`list`)\cr list of plot options. #' -#' @export +#' @inherit module_arguments return +#' +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. #' #' @examples #' library(nestcolor) @@ -128,6 +132,8 @@ #' if (interactive()) { #' shinyApp(app$ui, app$server) #' } +#' +#' @export tm_g_barchart_simple <- function(x = NULL, fill = NULL, x_facet = NULL, @@ -188,6 +194,7 @@ tm_g_barchart_simple <- function(x = NULL, ) } +#' @keywords internal ui_g_barchart_simple <- function(id, ...) { ns <- shiny::NS(id) args <- list(...) @@ -317,6 +324,7 @@ ui_g_barchart_simple <- function(id, ...) { ) } +#' @keywords internal srv_g_barchart_simple <- function(id, data, reporter, @@ -573,50 +581,38 @@ srv_g_barchart_simple <- function(id, }) } - - # Helper functions for qenv ---- #' `ggplot2` call to generate simple bar chart #' -#' `ggplot2` call to generate simple bar chart -#' @param yname (`NULL`, `character(1)`)\cr -#' name of the `yaxis` variable. -#' @param xname (`NULL`, `character(1)`)\cr -#' name of the `xaxis` variable. -#' @param fill_name (`NULL`, `character(1)`)\cr -#' name of the variable distinguishing the color of the fill. -#' @param x_facet_name (`NULL`, `character(1)`)\cr -#' name of the variable to facet the plot horizontally. -#' @param y_facet_name (`NULL`, `character(1)`)\cr -#' name of the variable to facet the plot vertically. -#' @param label_bars (`NULL`, `logical(1)`)\cr -#' whether to label bars. -#' @param barlayout (`NULL`, `character(1)`)\cr -#' `type of the layout - "side_by_side"` or `"stacked"` (default). -#' @param flip_axis (`NULL`, `character(1)`)\cr -#' whether to flip axis. -#' @param rotate_bar_labels (`NULL`, `logical(1)`)\cr -#' whether to rotate bar label by 45 degrees. -#' @param rotate_x_label (`NULL`, `logical(1)`)\cr -#' whether to rotate x-axis label by 45 degrees. -#' @param rotate_y_label (`NULL`, `logical(1)`)\cr -#' whether to rotate y-axis label by 45 degrees. -#' @param expand_y_range (`NULL`, `numeric(1)`)\cr -#' fraction of y-axis range to expand further up. -#' @param facet_scales (`fixed`, `free_x`, `free_y` or `free`)\cr value -#' passed to `scales` argument of `ggplot2::facet_grid` #' @inheritParams tm_g_barchart_simple -#' @examples -#' teal.modules.clinical:::make_barchart_simple_call(y_name = "y", x_name = "x") -#' @return `call` +#' @param yname (`character` or `NULL`)\cr name of the y-axis variable. +#' @param xname (`character` or `NULL`)\cr name of the x-axis variable. Defaults to `NULL` because it is dependent +#' on extract input which can be empty. +#' @param fill_name (`character` or `NULL`)\cr name of the variable to determine the bar fill color. +#' @param x_facet_name (`character` or `NULL`)\cr name of the variable to use for horizontal plot faceting. +#' @param y_facet_name (`character` or `NULL`)\cr name of the variable to use for vertical plot faceting. +#' @param label_bars (`logical` or `NULL`)\cr whether bars should be labeled. If `TRUE`, label bar numbers would +#' also be drawn as text. +#' @param barlayout (`character` or `NULL`)\cr type of the bar layout. Options are `"stacked"` (default) or +#' `"side_by_side"`. +#' @param flip_axis (`character` or `NULL`)\cr whether to flip the plot axis. +#' @param rotate_bar_labels (`logical` or `NULL`)\cr whether bar labels should be rotated by 45 degrees. +#' @param rotate_x_label (`logical` or `NULL`)\cr whether x-axis labels should be rotated by 45 degrees. +#' @param rotate_y_label (`logical` or `NULL`)\cr whether y-axis labels should be rotated by 45 degrees. +#' @param expand_y_range (`numeric` or `NULL`)\cr fraction of y-axis range to further expand by. +#' @param facet_scales (`character`)\cr value passed to `scales` argument of [ggplot2::facet_grid()]. Options are +#' `fixed`, `free_x`, `free_y`, and `free`. +#' +#' @return `call` to produce a `ggplot` object. +#' #' @keywords internal make_barchart_simple_call <- function(y_name, - x_name = NULL, # NULL because it depends on extract input which might be empty + x_name = NULL, fill_name = NULL, x_facet_name = NULL, y_facet_name = NULL, - label_bars = TRUE, # whether to also draw numbers as text, i.e. label bars + label_bars = TRUE, barlayout = c("side_by_side", "stacked"), flip_axis = FALSE, rotate_bar_labels = FALSE, @@ -645,9 +641,9 @@ make_barchart_simple_call <- function(y_name, plot_args <- c( plot_args, if (is.null(fill_name)) { - bquote(ggplot2::aes_string(x = .(x_val_var))) + bquote(ggplot2::aes(x = .data[[.(x_val_var)]])) } else { - bquote(ggplot2::aes_string(x = .(x_val_var), fill = .(fill_name))) + bquote(ggplot2::aes(x = .data[[.(x_val_var)]], fill = .data[[.(fill_name)]])) } ) @@ -673,8 +669,8 @@ make_barchart_simple_call <- function(y_name, # setting color via aesthetics does not work for some reason (but x = 0 above works) plot_args <- c(plot_args, bquote( ggplot2::geom_col( - ggplot2::aes_string( - y = .(y_name) + ggplot2::aes( + y = .data[[.(y_name)]] ), position = .(position), fill = .(ifelse( @@ -686,7 +682,7 @@ make_barchart_simple_call <- function(y_name, )) } else { plot_args <- c(plot_args, bquote( - ggplot2::geom_col(ggplot2::aes_string(y = .(y_name)), position = .(position)) + ggplot2::geom_col(ggplot2::aes(y = .data[[.(y_name)]]), position = .(position)) )) } @@ -703,7 +699,7 @@ make_barchart_simple_call <- function(y_name, } plot_args <- c(plot_args, bquote( - ggplot2::geom_text(ggplot2::aes_string(y = .(y_name), label = .(y_name)), + ggplot2::geom_text(ggplot2::aes(y = .data[[.(y_name)]], label = .data[[.(y_name)]]), stat = "identity", angle = .(if (rotate_bar_labels) 45 else 0), position = .(position), @@ -769,7 +765,6 @@ count_by_group_expr <- function(groupby_vars, data_name = "counts") { ) } - get_facet_scale <- function(x, y) { facet_scale_x <- if (isTRUE(x)) { "fixed" diff --git a/man/make_barchart_simple_call.Rd b/man/make_barchart_simple_call.Rd index 36de7204be..f80c1f010f 100644 --- a/man/make_barchart_simple_call.Rd +++ b/man/make_barchart_simple_call.Rd @@ -22,38 +22,30 @@ make_barchart_simple_call( ) } \arguments{ -\item{fill_name}{(\code{NULL}, \code{character(1)})\cr -name of the variable distinguishing the color of the fill.} +\item{fill_name}{(\code{character} or \code{NULL})\cr name of the variable to determine the bar fill color.} -\item{x_facet_name}{(\code{NULL}, \code{character(1)})\cr -name of the variable to facet the plot horizontally.} +\item{x_facet_name}{(\code{character} or \code{NULL})\cr name of the variable to use for horizontal plot faceting.} -\item{y_facet_name}{(\code{NULL}, \code{character(1)})\cr -name of the variable to facet the plot vertically.} +\item{y_facet_name}{(\code{character} or \code{NULL})\cr name of the variable to use for vertical plot faceting.} -\item{label_bars}{(\code{NULL}, \code{logical(1)})\cr -whether to label bars.} +\item{label_bars}{(\code{logical} or \code{NULL})\cr whether bars should be labeled. If \code{TRUE}, label bar numbers would +also be drawn as text.} -\item{barlayout}{(\code{NULL}, \code{character(1)})\cr -\verb{type of the layout - "side_by_side"} or \code{"stacked"} (default).} +\item{barlayout}{(\code{character} or \code{NULL})\cr type of the bar layout. Options are \code{"stacked"} (default) or +\code{"side_by_side"}.} -\item{flip_axis}{(\code{NULL}, \code{character(1)})\cr -whether to flip axis.} +\item{flip_axis}{(\code{character} or \code{NULL})\cr whether to flip the plot axis.} -\item{rotate_bar_labels}{(\code{NULL}, \code{logical(1)})\cr -whether to rotate bar label by 45 degrees.} +\item{rotate_bar_labels}{(\code{logical} or \code{NULL})\cr whether bar labels should be rotated by 45 degrees.} -\item{rotate_x_label}{(\code{NULL}, \code{logical(1)})\cr -whether to rotate x-axis label by 45 degrees.} +\item{rotate_x_label}{(\code{logical} or \code{NULL})\cr whether x-axis labels should be rotated by 45 degrees.} -\item{rotate_y_label}{(\code{NULL}, \code{logical(1)})\cr -whether to rotate y-axis label by 45 degrees.} +\item{rotate_y_label}{(\code{logical} or \code{NULL})\cr whether y-axis labels should be rotated by 45 degrees.} -\item{expand_y_range}{(\code{NULL}, \code{numeric(1)})\cr -fraction of y-axis range to expand further up.} +\item{expand_y_range}{(\code{numeric} or \code{NULL})\cr fraction of y-axis range to further expand by.} -\item{facet_scales}{(\code{fixed}, \code{free_x}, \code{free_y} or \code{free})\cr value -passed to \code{scales} argument of \code{ggplot2::facet_grid}} +\item{facet_scales}{(\code{character})\cr value passed to \code{scales} argument of \code{\link[ggplot2:facet_grid]{ggplot2::facet_grid()}}. Options are +\code{fixed}, \code{free_x}, \code{free_y}, and \code{free}.} \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments @@ -61,19 +53,15 @@ for the module plot. The argument is merged with option \code{teal.ggplot2_args} For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} -\item{yname}{(\code{NULL}, \code{character(1)})\cr -name of the \code{yaxis} variable.} +\item{yname}{(\code{character} or \code{NULL})\cr name of the y-axis variable.} -\item{xname}{(\code{NULL}, \code{character(1)})\cr -name of the \code{xaxis} variable.} +\item{xname}{(\code{character} or \code{NULL})\cr name of the x-axis variable. Defaults to \code{NULL} because it is dependent +on extract input which can be empty.} } \value{ -\code{call} +\code{call} to produce a \code{ggplot} object. } \description{ \code{ggplot2} call to generate simple bar chart } -\examples{ -teal.modules.clinical:::make_barchart_simple_call(y_name = "y", x_name = "x") -} \keyword{internal} diff --git a/man/tm_g_barchart_simple.Rd b/man/tm_g_barchart_simple.Rd index 54ba8aeb1c..367dbf98c4 100644 --- a/man/tm_g_barchart_simple.Rd +++ b/man/tm_g_barchart_simple.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_g_barchart_simple.R \name{tm_g_barchart_simple} \alias{tm_g_barchart_simple} -\title{Simple bar chart plot that shows counts per category.} +\title{teal Module: Simple Bar Chart and Table of Counts per Category} \usage{ tm_g_barchart_simple( x = NULL, @@ -21,11 +21,11 @@ tm_g_barchart_simple( \arguments{ \item{x}{(\code{data_extract_spec})\cr variable on the x-axis.} -\item{fill}{(\code{data_extract_spec})\cr grouping variable assigned to the bar colors.} +\item{fill}{(\code{data_extract_spec})\cr grouping variable to determine bar colors.} -\item{x_facet}{(\code{data_extract_spec})\cr faceting groups on the row dimension.} +\item{x_facet}{(\code{data_extract_spec})\cr row-wise faceting groups.} -\item{y_facet}{(\code{data_extract_spec})\cr faceting groups on the col dimension.} +\item{y_facet}{(\code{data_extract_spec})\cr column-wise faceting groups.} \item{label}{(\code{character})\cr menu item label of the module in the teal app.} @@ -49,10 +49,15 @@ for the module plot. The argument is merged with option \code{teal.ggplot2_args} For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -Categories can be defined up to four levels deep and are defined through -\code{x}, \code{fill}, \code{x_facet} and \code{y_facet}. If any of them is \code{NULL}, -it is ignored. +This module produces a \code{\link[ggplot2:ggplot]{ggplot2::ggplot()}} type bar chart and summary table of counts per category. +} +\details{ +Categories can be defined up to four levels deep and are defined through the \code{x}, \code{fill}, +\code{x_facet}, and \code{y_facet} parameters. Any parameters set to \code{NULL} (default) are ignored. } \examples{ library(nestcolor) @@ -168,4 +173,9 @@ app <- init( if (interactive()) { shinyApp(app$ui, app$server) } + +} +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. } From 0434a290d786b15c9e6f196ac89b366d83bfdd63 Mon Sep 17 00:00:00 2001 From: edelarua Date: Sat, 3 Feb 2024 01:35:34 +0000 Subject: [PATCH 048/126] [skip actions] Bump version to 0.8.16.9068 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index e945aa4ea9..795722814a 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9067 +Version: 0.8.16.9068 Date: 2024-02-03 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 7dba3a24f3..c45db4c9e6 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9067 +# teal.modules.clinical 0.8.16.9068 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From cb0fe9048ca1a45662d791b57771111ea4902fa6 Mon Sep 17 00:00:00 2001 From: Abinaya Yogasekaram <73252787+ayogasekaram@users.noreply.github.com> Date: Fri, 2 Feb 2024 21:29:58 -0500 Subject: [PATCH 049/126] clean up documentation for `tm_t_events_by_grade`. (#1039) closes #949 --------- Signed-off-by: Abinaya Yogasekaram <73252787+ayogasekaram@users.noreply.github.com> Co-authored-by: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Co-authored-by: 27856297+dependabot-preview[bot]@users.noreply.github.com <27856297+dependabot-preview[bot]@users.noreply.github.com> --- R/argument_convention.R | 4 +++ R/tm_t_events_by_grade.R | 46 ++++++++++++++++------------- man/template_arguments.Rd | 6 ++++ man/template_events_by_grade.Rd | 5 +++- man/template_events_col_by_grade.Rd | 16 +++++----- man/tm_t_events_by_grade.Rd | 15 +++++++--- 6 files changed, 60 insertions(+), 32 deletions(-) diff --git a/R/argument_convention.R b/R/argument_convention.R index 3b50bad4d7..c7c0fc8d0b 100644 --- a/R/argument_convention.R +++ b/R/argument_convention.R @@ -54,6 +54,10 @@ #' @param hlt (`character`)\cr name of the variable with high level term for events. #' @param id_var (`character`)\cr the variable name for subject id. #' @param include_interact (`logical`)\cr whether an interaction term should be included in the model. +#' @param label_hlt (`string`)\cr label of the `hlt` variable from `dataname`. The label will be extracted from the +#' module. +#' @param label_llt (`string`)\cr label of the `llt` variable from `dataname`. The label will be extracted from the +#' module. #' @param llt (`character`)\cr name of the variable with low level term for events. #' @param patient_id (`character`)\cr patient ID. #' @param na_level (`string`)\cr used to replace all `NA` or empty values diff --git a/R/tm_t_events_by_grade.R b/R/tm_t_events_by_grade.R index 716adc8940..884d7c0e74 100644 --- a/R/tm_t_events_by_grade.R +++ b/R/tm_t_events_by_grade.R @@ -1,18 +1,18 @@ #' Template: Events by Grade #' +#' Creates a valid expression to generate a table to summarize events by grade. +#' #' @inheritParams template_arguments -#' @param label_hlt (`string`)\cr label of the `hlt` variable from `dataname`. The label will be extracted from the -#' module. -#' @param label_llt (`string`)\cr label of the `llt` variable from `dataname`. The label will be extracted from the -#' module. #' @param id (`character`)\cr unique identifier of patients in datasets, default to `"USUBJID"`. #' @param grade (`character`)\cr name of the severity level variable. #' @param label_grade (`string`)\cr label of the `grade` variable from `dataname`. The label will be extracted from the #' module. #' +#' @inherit template_arguments return +#' #' @seealso [tm_t_events_by_grade()] -#' @keywords internal #' +#' @keywords internal template_events_by_grade <- function(dataname, parentname, arm_var, @@ -371,18 +371,17 @@ template_events_by_grade <- function(dataname, y } -#' Template: Adverse Events grouped by Grade with threshold +#' Template: Adverse Events Grouped by Grade with Threshold +#' +#' Creates a valid expression to generate a table to summarize adverse events grouped by grade. #' #' @inheritParams template_arguments -#' @param id (`character`) \cr unique identifier of patients in datasets, default to `"USUBJID"`. -#' @param label_hlt (`string`)\cr label of the `hlt` variable from `dataname`. The label will be extracted from the -#' module. -#' @param label_llt (`string`)\cr label of the `llt` variable from `dataname`. The label will be extracted from the -#' module. -#' @param grade (`character`) \cr grade term which grading_groups is based on, default to `"AETOXGR"`. -#' @param label_grade (`string`)\cr label of the `grade` variable from `dataname`. The label will be extracted from the -#' module. -#' @param grading_groups (`character`)\cr list of grading groups. +#' @param id (`character`)\cr name of variable to uniquely identify patients in datasets. +#' @param grade (`character`)\cr name of grade variable to base `grading_groups` on. +#' @param label_grade (`character`)\cr label of the `grade` variable from `dataname`. +#' @param grading_groups (`list`)\cr named list of grading groups. +#' +#' @inherit template_arguments return #' #' @seealso [tm_t_events_by_grade()] #' @keywords internal @@ -787,13 +786,20 @@ template_events_col_by_grade <- function(dataname, y } -#' Teal Module: Events by Grade +#' teal Module: Events by Grade +#' +#' This module produces a table to summarize events by grade. #' #' @inheritParams module_arguments #' @inheritParams template_events_by_grade #' @inheritParams template_events_col_by_grade -#' @param col_by_grade (`flag`)\cr whether to display the grading groups in nested columns. -#' @param grading_groups (`character`)\cr list of grading groups used when col_by_grade = TRUE. +#' @param col_by_grade (`logical`)\cr whether to display the grading groups in nested columns. +#' @param grading_groups (`list`)\cr named list of grading groups used when `col_by_grade = TRUE`. +#' +#' @inherit module_arguments return +#' +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. #' #' @export #' @examples @@ -908,7 +914,7 @@ tm_t_events_by_grade <- function(label, ) } -#' @noRd +#' @keywords internal ui_t_events_by_grade <- function(id, ...) { ns <- shiny::NS(id) a <- list(...) @@ -995,7 +1001,7 @@ ui_t_events_by_grade <- function(id, ...) { ) } -#' @noRd +#' @keywords internal srv_t_events_by_grade <- function(id, data, reporter, diff --git a/man/template_arguments.Rd b/man/template_arguments.Rd index 21dd1961b9..66f45e8072 100644 --- a/man/template_arguments.Rd +++ b/man/template_arguments.Rd @@ -79,6 +79,12 @@ For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", p \item{include_interact}{(\code{logical})\cr whether an interaction term should be included in the model.} +\item{label_hlt}{(\code{string})\cr label of the \code{hlt} variable from \code{dataname}. The label will be extracted from the +module.} + +\item{label_llt}{(\code{string})\cr label of the \code{llt} variable from \code{dataname}. The label will be extracted from the +module.} + \item{llt}{(\code{character})\cr name of the variable with low level term for events.} \item{na_level}{(\code{string})\cr used to replace all \code{NA} or empty values diff --git a/man/template_events_by_grade.Rd b/man/template_events_by_grade.Rd index e7b8c8f6b3..0ccf59044f 100644 --- a/man/template_events_by_grade.Rd +++ b/man/template_events_by_grade.Rd @@ -74,8 +74,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Template: Events by Grade +Creates a valid expression to generate a table to summarize events by grade. } \seealso{ \code{\link[=tm_t_events_by_grade]{tm_t_events_by_grade()}} diff --git a/man/template_events_col_by_grade.Rd b/man/template_events_col_by_grade.Rd index bf52d4555d..4b49e35b0d 100644 --- a/man/template_events_col_by_grade.Rd +++ b/man/template_events_col_by_grade.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_events_by_grade.R \name{template_events_col_by_grade} \alias{template_events_col_by_grade} -\title{Template: Adverse Events grouped by Grade with threshold} +\title{Template: Adverse Events Grouped by Grade with Threshold} \usage{ template_events_col_by_grade( dataname, @@ -33,7 +33,7 @@ template_events_col_by_grade( \item{arm_var}{(\code{character})\cr variable names that can be used as \code{arm_var}.} -\item{grading_groups}{(\code{character})\cr list of grading groups.} +\item{grading_groups}{(\code{list})\cr named list of grading groups.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} @@ -41,7 +41,7 @@ template_events_col_by_grade( enabled (see \code{add_total}). Defaults to \code{"All Patients"}. To set a new default \code{total_label} to apply in all modules, run \code{set_default_total_label("new_default")}.} -\item{id}{(\code{character}) \cr unique identifier of patients in datasets, default to \code{"USUBJID"}.} +\item{id}{(\code{character})\cr name of variable to uniquely identify patients in datasets.} \item{hlt}{(\code{character})\cr name of the variable with high level term for events.} @@ -53,10 +53,9 @@ module.} \item{label_llt}{(\code{string})\cr label of the \code{llt} variable from \code{dataname}. The label will be extracted from the module.} -\item{grade}{(\code{character}) \cr grade term which grading_groups is based on, default to \code{"AETOXGR"}.} +\item{grade}{(\code{character})\cr name of grade variable to base \code{grading_groups} on.} -\item{label_grade}{(\code{string})\cr label of the \code{grade} variable from \code{dataname}. The label will be extracted from the -module.} +\item{label_grade}{(\code{character})\cr label of the \code{grade} variable from \code{dataname}.} \item{prune_freq}{(\code{number})\cr threshold to use for trimming table using event incidence rate in any column.} @@ -78,8 +77,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Template: Adverse Events grouped by Grade with threshold +Creates a valid expression to generate a table to summarize adverse events grouped by grade. } \seealso{ \code{\link[=tm_t_events_by_grade]{tm_t_events_by_grade()}} diff --git a/man/tm_t_events_by_grade.Rd b/man/tm_t_events_by_grade.Rd index 81ff7559ae..6341d68697 100644 --- a/man/tm_t_events_by_grade.Rd +++ b/man/tm_t_events_by_grade.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_events_by_grade.R \name{tm_t_events_by_grade} \alias{tm_t_events_by_grade} -\title{Teal Module: Events by Grade} +\title{teal Module: Events by Grade} \usage{ tm_t_events_by_grade( label, @@ -46,9 +46,9 @@ second variable will be nested under the first variable.} \item{grade}{(\code{character})\cr name of the severity level variable.} -\item{grading_groups}{(\code{character})\cr list of grading groups used when col_by_grade = TRUE.} +\item{grading_groups}{(\code{list})\cr named list of grading groups used when \code{col_by_grade = TRUE}.} -\item{col_by_grade}{(\code{flag})\cr whether to display the grading groups in nested columns.} +\item{col_by_grade}{(\code{logical})\cr whether to display the grading groups in nested columns.} \item{prune_freq}{(\code{number})\cr threshold to use for trimming table using event incidence rate in any column.} @@ -82,8 +82,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -Teal Module: Events by Grade +This module produces a table to summarize events by grade. } \examples{ data <- teal_data() @@ -126,3 +129,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} From b4b97333229594816d84935a745fde388b1426f5 Mon Sep 17 00:00:00 2001 From: ayogasekaram Date: Sat, 3 Feb 2024 02:30:59 +0000 Subject: [PATCH 050/126] [skip actions] Bump version to 0.8.16.9069 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 795722814a..f39edf4978 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9068 +Version: 0.8.16.9069 Date: 2024-02-03 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index c45db4c9e6..7bf9f05bb0 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9068 +# teal.modules.clinical 0.8.16.9069 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From f003b0cc4378665a72abd35d4e15fd708ec9ffd0 Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Mon, 5 Feb 2024 05:41:53 -0500 Subject: [PATCH 051/126] Clean up documentation for `tm_t_logistic` (#1007) # Pull Request Fixes #956 Also deprecates `paramcd` argument in `template_logistic` which is not used in the function. --------- Co-authored-by: Davide Garolini --- R/tm_t_logistic.R | 74 +++++++++++++--------------- man/template_logistic.Rd | 28 +++++------ man/tm_t_logistic.Rd | 27 ++++++---- tests/testthat/test-tm_t_logisitic.R | 3 -- 4 files changed, 65 insertions(+), 67 deletions(-) diff --git a/R/tm_t_logistic.R b/R/tm_t_logistic.R index aa8cba78b8..78a30b7d6e 100644 --- a/R/tm_t_logistic.R +++ b/R/tm_t_logistic.R @@ -1,29 +1,26 @@ #' Template: Logistic Regression #' -#' Creates an expression for logistic regressions. +#' Creates a valid expression to generate a logistic regression table. #' #' @inheritParams template_arguments -#' @param arm_var (`character`)\cr -#' variable names that can be used as `arm_var`. No arm or treatment variable is included in the logistic model is -#' being `NULL`. -#' @param topleft (`character`)\cr -#' the top-left annotation in the table. -#' @param at optional, (`NULL` or `numeric`)\cr -#' values for the interaction variable. Otherwise the median is used. -#' @param interaction_var (`character`)\cr -#' names of the variables that can be used for interaction variable selection. -#' @param responder_val (`character`)\cr -#' values of the responder variable corresponding with a successful response. -#' @param paramcd (`character`)\cr response parameter value to use in the table title. -#' @param label_paramcd (`character`)\cr Label of response parameter value to use in the table title. +#' @inheritParams tern::tidy.glm +#' @param arm_var (`character`)\cr variable names that can be used as `arm_var`. To fit a logistic model with no +#' arm/treatment variable, set to `NULL`. +#' @param topleft (`character`)\cr text to use as top-left annotation in the table. +#' @param interaction_var (`character`)\cr names of the variables that can be used for interaction variable selection. +#' @param responder_val (`character`)\cr values of the responder variable corresponding with a successful response. +#' @param paramcd `r lifecycle::badge("deprecated")` The `paramcd` argument is not used in this function. +#' @param label_paramcd (`character`)\cr label of response parameter value to print in the table title. +#' +#' @inherit template_arguments return #' #' @seealso [tm_t_logistic()] -#' @keywords internal #' +#' @keywords internal template_logistic <- function(dataname, arm_var, aval_var, - paramcd, + paramcd = lifecycle::deprecated(), label_paramcd, cov_var, interaction_var, @@ -35,11 +32,14 @@ template_logistic <- function(dataname, responder_val = c("CR", "PR"), at = NULL, basic_table_args = teal.widgets::basic_table_args()) { + if (lifecycle::is_present(paramcd)) { + lifecycle::deprecate_warn("0.8.16", "template_logistic(paramcd)") + } + # Common assertion no matter if arm_var is NULL or not. assertthat::assert_that( assertthat::is.string(dataname), assertthat::is.string(aval_var), - assertthat::is.string(paramcd), assertthat::is.string(label_paramcd) || is.null(label_paramcd), assertthat::is.string(topleft) || is.null(topleft), is.character(cov_var) || is.null(cov_var), @@ -181,8 +181,6 @@ template_logistic <- function(dataname, paste("Summary of Logistic Regression Analysis for", label_paramcd, "for", responder_val, "Responders") } - - parsed_basic_table_args <- teal.widgets::parse_basic_table_args( teal.widgets::resolve_basic_table_args( user_table = basic_table_args, @@ -211,23 +209,26 @@ template_logistic <- function(dataname, y } - -#' Teal Module: Logistic Regression +#' teal Module: Logistic Regression #' -#' @description This module produces a multi-variable logistic regression table that matches `LGRT02`. +#' This module produces a multi-variable logistic regression table consistent with the TLG Catalog template +#' `LGRT02` available [here](https://insightsengineering.github.io/tlg-catalog/stable/tables/efficacy/lgrt02.html). #' #' @inheritParams module_arguments #' @inheritParams template_logistic -#' @param arm_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()]) or `NULL`\cr -#' object with all available choices -#' and preselected option for variable names that can be used as `arm_var`. -#' It defines the grouping variable(s) in the results table. If there are two elements selected for `arm_var`, -#' second variable will be nested under the first variable. -#' arm_var is optional, when being NULL, no arm or treatment variable is included in the logistic model. -#' @param avalc_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' object with all available choices and preselected option for the analysis variable (categorical). +#' @param arm_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()] or `NULL`)\cr object +#' with all available choices and preselected option for variable names that can be used as `arm_var`. This defines +#' the grouping variable(s) in the results table. If there are two elements selected for `arm_var`, the second +#' variable will be nested under the first variable. If `NULL`, no arm/treatment variable is included in the +#' logistic model. +#' @param avalc_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the analysis variable (categorical). +#' +#' @inherit module_arguments return +#' +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. #' -#' @export #' @examples #' ADSL <- tmc_ex_adsl #' ADRS <- tmc_ex_adrs %>% @@ -278,6 +279,7 @@ template_logistic <- function(dataname, #' shinyApp(ui = app$ui, server = app$server) #' } #' +#' @export tm_t_logistic <- function(label, dataname, parentname = ifelse( @@ -339,9 +341,7 @@ tm_t_logistic <- function(label, ) } -#' User Interface for `tm_t_logistic` -#' @noRd -#' +#' @keywords internal ui_t_logistic <- function(id, ...) { a <- list(...) if (!is.null(a$arm_var)) { @@ -359,7 +359,6 @@ ui_t_logistic <- function(id, ...) { ) } - ns <- shiny::NS(id) teal.widgets::standard_layout( output = teal.widgets::white_small_well( @@ -437,9 +436,7 @@ ui_t_logistic <- function(id, ...) { ) } -#' Server Function for `tm_t_logistic` -#' @noRd -#' +#' @keywords internal srv_t_logistic <- function(id, data, reporter, @@ -684,7 +681,6 @@ srv_t_logistic <- function(id, dataname = "ANL", arm_var = names(merged$anl_input_r()$columns_source$arm_var), aval_var = names(merged$anl_input_r()$columns_source$avalc_var), - paramcd = paramcd, label_paramcd = label_paramcd, cov_var = if (length(cov_var) > 0) cov_var else NULL, interaction_var = if (interaction_flag) interaction_var else NULL, diff --git a/man/template_logistic.Rd b/man/template_logistic.Rd index 121cd0ceeb..11aac543eb 100644 --- a/man/template_logistic.Rd +++ b/man/template_logistic.Rd @@ -8,7 +8,7 @@ template_logistic( dataname, arm_var, aval_var, - paramcd, + paramcd = lifecycle::deprecated(), label_paramcd, cov_var, interaction_var, @@ -25,37 +25,32 @@ template_logistic( \arguments{ \item{dataname}{(\code{character})\cr analysis data used in teal module.} -\item{arm_var}{(\code{character})\cr -variable names that can be used as \code{arm_var}. No arm or treatment variable is included in the logistic model is -being \code{NULL}.} +\item{arm_var}{(\code{character})\cr variable names that can be used as \code{arm_var}. To fit a logistic model with no +arm/treatment variable, set to \code{NULL}.} \item{aval_var}{(\code{character})\cr name of the analysis value variable.} -\item{paramcd}{(\code{character})\cr response parameter value to use in the table title.} +\item{paramcd}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} The \code{paramcd} argument is not used in this function.} -\item{label_paramcd}{(\code{character})\cr Label of response parameter value to use in the table title.} +\item{label_paramcd}{(\code{character})\cr label of response parameter value to print in the table title.} \item{cov_var}{(\code{character})\cr names of the covariates variables.} -\item{interaction_var}{(\code{character})\cr -names of the variables that can be used for interaction variable selection.} +\item{interaction_var}{(\code{character})\cr names of the variables that can be used for interaction variable selection.} \item{ref_arm}{(\code{character})\cr the level of reference arm in case of arm comparison.} \item{comp_arm}{(\code{character})\cr the level of comparison arm in case of arm comparison.} -\item{topleft}{(\code{character})\cr -the top-left annotation in the table.} +\item{topleft}{(\code{character})\cr text to use as top-left annotation in the table.} \item{conf_level}{(\code{numeric})\cr value for the confidence level within the range of (0, 1).} \item{combine_comp_arms}{(\code{logical})\cr triggers the combination of comparison arms.} -\item{responder_val}{(\code{character})\cr -values of the responder variable corresponding with a successful response.} +\item{responder_val}{(\code{character})\cr values of the responder variable corresponding with a successful response.} -\item{at}{optional, (\code{NULL} or \code{numeric})\cr -values for the interaction variable. Otherwise the median is used.} +\item{at}{(\code{NULL} or \code{numeric})\cr optional values for the interaction variable. Otherwise the median is used.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default @@ -63,8 +58,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Creates an expression for logistic regressions. +Creates a valid expression to generate a logistic regression table. } \seealso{ \code{\link[=tm_t_logistic]{tm_t_logistic()}} diff --git a/man/tm_t_logistic.Rd b/man/tm_t_logistic.Rd index 1669e3598e..36f004ed6f 100644 --- a/man/tm_t_logistic.Rd +++ b/man/tm_t_logistic.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_logistic.R \name{tm_t_logistic} \alias{tm_t_logistic} -\title{Teal Module: Logistic Regression} +\title{teal Module: Logistic Regression} \usage{ tm_t_logistic( label, @@ -29,12 +29,11 @@ tm_t_logistic( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}}) or \code{NULL}\cr -object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. -It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, -second variable will be nested under the first variable. -arm_var is optional, when being NULL, no arm or treatment variable is included in the logistic model.} +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}} or \code{NULL})\cr object +with all available choices and preselected option for variable names that can be used as \code{arm_var}. This defines +the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, the second +variable will be nested under the first variable. If \code{NULL}, no arm/treatment variable is included in the +logistic model.} \item{arm_ref_comp}{optional, (\code{list})\cr If specified it must be a named list with each element corresponding to an arm variable in \code{ADSL} and the element must be another list (possibly @@ -47,8 +46,8 @@ reference and comparison arms when the arm variable is changed.} \item{cov_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected option for the covariates variables.} -\item{avalc_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -object with all available choices and preselected option for the analysis variable (categorical).} +\item{avalc_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the analysis variable (categorical).} \item{conf_level}{(\code{choices_selected})\cr object with all available choices and preselected option for the confidence level, each within range of (0, 1).} @@ -65,8 +64,12 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -This module produces a multi-variable logistic regression table that matches \code{LGRT02}. +This module produces a multi-variable logistic regression table consistent with the TLG Catalog template +\code{LGRT02} available \href{https://insightsengineering.github.io/tlg-catalog/stable/tables/efficacy/lgrt02.html}{here}. } \examples{ ADSL <- tmc_ex_adsl @@ -119,3 +122,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} diff --git a/tests/testthat/test-tm_t_logisitic.R b/tests/testthat/test-tm_t_logisitic.R index 5616e0b86a..111d167ab3 100644 --- a/tests/testthat/test-tm_t_logisitic.R +++ b/tests/testthat/test-tm_t_logisitic.R @@ -3,7 +3,6 @@ testthat::test_that("template_logistic generates correct expressions", { dataname = "ANL", arm_var = "ARMCD", aval_var = "AVALC", - paramcd = "PARAMCD", label_paramcd = "Best Confirmed Overall Response by Investigator", cov_var = c("AGE", "SEX"), interaction_var = "AGE", @@ -25,7 +24,6 @@ testthat::test_that("template_logistic generates correct expressions for no arm dataname = "ANL", arm_var = NULL, aval_var = "AVALC", - paramcd = "PARAMCD", label_paramcd = "Best Confirmed Overall Response by Investigator", cov_var = c("AGE", "SEX"), interaction_var = "AGE", @@ -45,7 +43,6 @@ testthat::test_that("template_logistic generates correct expressions", { dataname = "ANL", arm_var = "ARMCD", aval_var = "AVALC", - paramcd = "PARAMCD", label_paramcd = "Best Confirmed Overall Response by Investigator", cov_var = c("AGE", "SEX"), interaction_var = "AGE", From b05e9f204d18b42c65716cd50b6dfc5c4915a88a Mon Sep 17 00:00:00 2001 From: Melkiades Date: Mon, 5 Feb 2024 10:42:45 +0000 Subject: [PATCH 052/126] [skip actions] Bump version to 0.8.16.9070 --- DESCRIPTION | 4 ++-- NEWS.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index f39edf4978..9535a934b5 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9069 -Date: 2024-02-03 +Version: 0.8.16.9070 +Date: 2024-02-05 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), person("Jana", "Stoilova", , "jana.stoilova@roche.com", role = "aut"), diff --git a/NEWS.md b/NEWS.md index 7bf9f05bb0..8f473b0472 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9069 +# teal.modules.clinical 0.8.16.9070 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From e99e8ea5e6297cc403b5cf6a2dd344e0b1a10834 Mon Sep 17 00:00:00 2001 From: Zelos Zhu Date: Mon, 5 Feb 2024 06:01:30 -0500 Subject: [PATCH 053/126] Clean up documentation for `tm_t_exposure()` (#1028) Closes #955 --------- Co-authored-by: Davide Garolini --- R/argument_convention.R | 66 +++++++++++++++----------- R/tm_t_exposure.R | 41 +++++++++------- man/module_arguments.Rd | 62 +++++++++++++----------- man/template_exposure.Rd | 21 ++++---- man/tm_a_gee.Rd | 23 +++++---- man/tm_a_mmrm.Rd | 23 +++++---- man/tm_g_ci.Rd | 4 +- man/tm_g_forest_rsp.Rd | 18 +++---- man/tm_g_forest_tte.Rd | 26 +++++----- man/tm_g_ipp.Rd | 15 +++--- man/tm_g_km.Rd | 22 +++++---- man/tm_g_lineplot.Rd | 7 +-- man/tm_t_abnormality.Rd | 14 +++--- man/tm_t_abnormality_by_worst_grade.Rd | 6 ++- man/tm_t_ancova.Rd | 18 +++---- man/tm_t_binary_outcome.Rd | 14 +++--- man/tm_t_coxreg.Rd | 22 +++++---- man/tm_t_events.Rd | 6 ++- man/tm_t_events_by_grade.Rd | 6 ++- man/tm_t_events_patyear.Rd | 11 +++-- man/tm_t_events_summary.Rd | 3 +- man/tm_t_exposure.Rd | 28 +++++++---- man/tm_t_logistic.Rd | 11 +++-- man/tm_t_mult_events.Rd | 6 ++- man/tm_t_shift_by_arm.Rd | 19 ++++---- man/tm_t_shift_by_arm_by_worst.Rd | 14 +++--- man/tm_t_shift_by_grade.Rd | 11 +++-- man/tm_t_smq.Rd | 6 ++- man/tm_t_summary.Rd | 4 +- man/tm_t_summary_by.Rd | 14 +++--- man/tm_t_tte.Rd | 18 +++---- 31 files changed, 322 insertions(+), 237 deletions(-) diff --git a/R/argument_convention.R b/R/argument_convention.R index c7c0fc8d0b..97f4d07366 100644 --- a/R/argument_convention.R +++ b/R/argument_convention.R @@ -55,9 +55,9 @@ #' @param id_var (`character`)\cr the variable name for subject id. #' @param include_interact (`logical`)\cr whether an interaction term should be included in the model. #' @param label_hlt (`string`)\cr label of the `hlt` variable from `dataname`. The label will be extracted from the -#' module. +#' module. #' @param label_llt (`string`)\cr label of the `llt` variable from `dataname`. The label will be extracted from the -#' module. +#' module. #' @param llt (`character`)\cr name of the variable with low level term for events. #' @param patient_id (`character`)\cr patient ID. #' @param na_level (`string`)\cr used to replace all `NA` or empty values @@ -127,27 +127,28 @@ NULL #' second variable will be nested under the first variable. #' @param atirel ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all #' available choices and preselected option for the `ATIREL` variable from `dataname`. -#' @param aval_var (`choices_selected` or `data_extract_spec`)\cr object with all available choices and preselected -#' option for the analysis variable. +#' @param aval_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' all available choices and pre-selected option for the analysis variable. #' @param avalu_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with #' all available choices and preselected option for the analysis unit variable. -#' @param avisit (`choices_selected` or `data_extract_spec`)\cr value of analysis visit `AVISIT` of interest. +#' @param avisit ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr value of analysis +#' visit `AVISIT` of interest. #' @param baseline_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with #' all available choices and preselected option for variable values that can be used as `baseline_var`. -#' @param by_vars (`choices_selected` or `data_extract_spec`)\cr object with all available choices and preselected -#' option for variable names used to split the summary by rows. +#' @param by_vars ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for variable names used to split the summary by rows. #' @param cmdecod ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all #' available choices and preselected option for the `CMDECOD` variable from `dataname`. #' @param cmindc ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all #' available choices and preselected option for the `CMINDC` variable from `dataname`. #' @param cmstdy ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all #' available choices and preselected option for the `CMSTDY` variable from `dataname`. -#' @param cnsr_var (`choices_selected` or `data_extract_spec`)\cr object with all available choices and preselected -#' option for the censoring variable. -#' @param conf_level (`choices_selected`)\cr object with all available choices and preselected option for the -#' confidence level, each within range of (0, 1). -#' @param cov_var (`choices_selected` or `data_extract_spec`)\cr object with all available choices and preselected -#' option for the covariates variables. +#' @param cnsr_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the censoring variable. +#' @param conf_level ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' all available choices and pre-selected option for the confidence level, each within range of (0, 1). +#' @param cov_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the covariates variables. #' @param dataname (`character`)\cr analysis data used in teal module. #' @param default_responses (`list` or `character`)\cr defines #' the default codes for the response variable in the module per value of `paramcd`. @@ -158,16 +159,20 @@ NULL #' @param fixed_symbol_size (`logical`)\cr When (`TRUE`), the same symbol size is used for plotting each estimate. #' Otherwise, the symbol size will be proportional to the sample size in each each subgroup. #' @param font_size (`numeric`)\cr numeric vector of length 3 of current, minimum and maximum font size values. -#' @param hlt (`choices_selected` or `data_extract_spec`)\cr name of the variable with high level term for events. -#' @param id_var (`choices_selected` or `data_extract_spec`)\cr object specifying the variable name for subject id. +#' @param hlt ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr name of the variable +#' with high level term for events. +#' @param id_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object specifying +#' the variable name for subject id. #' @param interact_var (`character`)\cr name of the variable that should have interactions #' with arm. If the interaction is not needed, the default option is `NULL`. #' @param interact_y (`character`)\cr a selected item from the interact_var column which will be used #' to select the specific `ANCOVA` results when interact_var is discrete. If the interaction is not #' needed, the default option is `FALSE`. #' @param label (`character`)\cr menu item label of the module in the teal app. -#' @param llt (`choices_selected` or `data_extract_spec`)\cr name of the variable with low level term for events. -#' @param paramcd (`choices_selected` or `data_extract_spec`)\cr variable value designating the studied parameter. +#' @param llt ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr name of the variable +#' with low level term for events. +#' @param paramcd ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr variable value +#' designating the studied parameter. #' @param parentname (`character`)\cr parent analysis data used in teal module, usually this refers to `ADSL`. #' @param patient_col (`character`)\cr name of patient ID variable. #' @param plot_height optional, (`numeric`)\cr a vector of length three with `c(value, min, max)`. Specifies the @@ -178,21 +183,24 @@ NULL #' For example the [shiny::helpText()] elements are useful. #' @param pre_output optional, (`shiny.tag`)\cr with text placed before the output to put the output into context. #' For example a title. -#' @param strata_var (`choices_selected` or `data_extract_spec`)\cr names of the variables for stratified analysis. -#' @param summarize_vars (`choices_selected` or `data_extract_spec`)\cr names of the variables that should be -#' summarized. -#' @param subgroup_var (`choices_selected` or `data_extract_spec`)\cr object with all available choices and -#' preselected option for variable names that can be used as the default subgroups. +#' @param strata_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr names of +#' the variables for stratified analysis. +#' @param summarize_vars ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr names of +#' the variables that should be summarized. +#' @param subgroup_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' all available choices and preselected option for variable names that can be used as the default subgroups. #' @param time_points (`choices_selected`)\cr object with all available choices and preselected option for time #' points that can be used in [tern::surv_timepoint()]. -#' @param time_unit_var (`choices_selected` or `data_extract_spec`)\cr object with all available choices and -#' preselected option for the time unit variable. -#' @param treatment_flag (`choices_selected`] or `data_extract_spec`)\cr value indicating on treatment -#' records in `treatment_flag_var`. -#' @param treatment_flag_var (`choices_selected` or `data_extract_spec`)\cr on treatment flag variable. +#' @param time_unit_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object +#' with all available choices and pre-selected option for the time unit variable. +#' @param treatment_flag ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr value +#' indicating on treatment records in `treatment_flag_var`. +#' @param treatment_flag_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr on +#' treatment flag variable. #' @param useNA (`character`)\cr whether missing data (`NA`) should be displayed as a level. -#' @param visit_var (`choices_selected` or `data_extract_spec`)\cr object with all available choices and preselected -#' option for variable names that can be used as `visit` variable. Must be a factor in `dataname`. +#' @param visit_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' all available choices and preselected option for variable names that can be used as `visit` variable. +#' Must be a factor in `dataname`. #' @param worst_flag_indicator ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr #' value indicating worst grade. #' @param worst_flag_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object diff --git a/R/tm_t_exposure.R b/R/tm_t_exposure.R index 41d2c8c499..b63db16ae3 100644 --- a/R/tm_t_exposure.R +++ b/R/tm_t_exposure.R @@ -1,20 +1,23 @@ #' Template: Exposure Table for Risk management plan #' +#' Creates a valid expression to generate exposure table for risk management plan. +#' #' @inheritParams template_arguments -#' @param row_by_var (`character`)\cr -#' variable name used to split the rows. -#' @param col_by_var (`character`)\cr -#' variable name used to split the columns. -#' @param drop_levels (`flag`)\cr -#' whether empty rows should be removed from the table. -#' @param paramcd_label (`character`)\cr -#' the column from the dataset where the value will be used to label the argument `paramcd`. +#' @param row_by_var (`character`)\cr variable name used to split the values by rows. +#' @param col_by_var (`character`)\cr variable name used to split the values by columns. +#' @param drop_levels (`flag`)\cr whether empty rows should be removed from the table. +#' @param paramcd_label (`character`)\cr the column from the `dataname` dataset where the +#' value will be used to label the argument `paramcd`. #' @param add_total_row (`flag`)\cr whether a "total" level should be added after the others which includes all the #' levels that constitute the split. A custom label can be set for this level via the `total_row_label` argument. -#' @param total_row_label (`character`)\cr string to display as total row label if row is enabled (see `add_total_row`). +#' @param total_row_label (`character`)\cr string to display as total row label if row is +#' enabled (see `add_total_row`). +#' +#' @inherit template_arguments return +#' #' @seealso [tm_t_exposure()] -#' @keywords internal #' +#' @keywords internal template_exposure <- function(parentname, dataname, id_var, @@ -206,7 +209,9 @@ template_exposure <- function(parentname, y } -#' Teal module: Exposure Table for Risk management plan +#' teal Module: Exposure Table for Risk management plan +#' +#' The module produces an exposure table for risk management plan. #' #' @inheritParams module_arguments #' @inheritParams template_exposure @@ -219,10 +224,13 @@ template_exposure <- function(parentname, #' @param parcat ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr #' object with all available choices and preselected option for #' parameter category values. -#' @param paramcd_label (`character`)\cr -#' the column from the dataset where the value will be used to label the argument `paramcd`. +#' @param paramcd_label (`character`)\cr the column from the dataset where the value will be used to +#' label the argument `paramcd`. #' -#' @export +#' @inherit module_arguments return +#' +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. #' #' @examples #' data <- teal_data() @@ -279,6 +287,7 @@ template_exposure <- function(parentname, #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_t_exposure <- function(label, dataname, parentname = ifelse( @@ -371,7 +380,7 @@ tm_t_exposure <- function(label, } -#' @noRd +#' @keywords internal ui_t_exposure <- function(id, ...) { ns <- shiny::NS(id) a <- list(...) # module args @@ -455,7 +464,7 @@ ui_t_exposure <- function(id, ...) { ) } -#' @noRd +#' @keywords internal srv_t_exposure <- function(id, data, reporter, diff --git a/man/module_arguments.Rd b/man/module_arguments.Rd index ffbf46d8ec..6457df04de 100644 --- a/man/module_arguments.Rd +++ b/man/module_arguments.Rd @@ -19,19 +19,20 @@ second variable will be nested under the first variable.} \item{atirel}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for the \code{ATIREL} variable from \code{dataname}.} -\item{aval_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the analysis variable.} +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the analysis variable.} \item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for the analysis unit variable.} -\item{avisit}{(\code{choices_selected} or \code{data_extract_spec})\cr value of analysis visit \code{AVISIT} of interest.} +\item{avisit}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr value of analysis +visit \code{AVISIT} of interest.} \item{baseline_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for variable values that can be used as \code{baseline_var}.} -\item{by_vars}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for variable names used to split the summary by rows.} +\item{by_vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names used to split the summary by rows.} \item{cmdecod}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for the \code{CMDECOD} variable from \code{dataname}.} @@ -42,14 +43,14 @@ available choices and preselected option for the \code{CMINDC} variable from \co \item{cmstdy}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for the \code{CMSTDY} variable from \code{dataname}.} -\item{cnsr_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the censoring variable.} +\item{cnsr_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the censoring variable.} -\item{conf_level}{(\code{choices_selected})\cr object with all available choices and preselected option for the -confidence level, each within range of (0, 1).} +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the confidence level, each within range of (0, 1).} -\item{cov_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the covariates variables.} +\item{cov_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the covariates variables.} \item{dataname}{(\code{character})\cr analysis data used in teal module.} @@ -65,9 +66,11 @@ Otherwise, the symbol size will be proportional to the sample size in each each \item{font_size}{(\code{numeric})\cr numeric vector of length 3 of current, minimum and maximum font size values.} -\item{hlt}{(\code{choices_selected} or \code{data_extract_spec})\cr name of the variable with high level term for events.} +\item{hlt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable +with high level term for events.} -\item{id_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object specifying the variable name for subject id.} +\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying +the variable name for subject id.} \item{interact_var}{(\code{character})\cr name of the variable that should have interactions with arm. If the interaction is not needed, the default option is \code{NULL}.} @@ -78,9 +81,11 @@ needed, the default option is \code{FALSE}.} \item{label}{(\code{character})\cr menu item label of the module in the teal app.} -\item{llt}{(\code{choices_selected} or \code{data_extract_spec})\cr name of the variable with low level term for events.} +\item{llt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable +with low level term for events.} -\item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value +designating the studied parameter.} \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} @@ -98,29 +103,32 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. For example a title.} -\item{strata_var}{(\code{choices_selected} or \code{data_extract_spec})\cr names of the variables for stratified analysis.} +\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of +the variables for stratified analysis.} -\item{summarize_vars}{(\code{choices_selected} or \code{data_extract_spec})\cr names of the variables that should be -summarized.} +\item{summarize_vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of +the variables that should be summarized.} -\item{subgroup_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and -preselected option for variable names that can be used as the default subgroups.} +\item{subgroup_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and preselected option for variable names that can be used as the default subgroups.} \item{time_points}{(\code{choices_selected})\cr object with all available choices and preselected option for time points that can be used in \code{\link[tern:survival_timepoint]{tern::surv_timepoint()}}.} -\item{time_unit_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and -preselected option for the time unit variable.} +\item{time_unit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +with all available choices and pre-selected option for the time unit variable.} -\item{treatment_flag}{(\code{choices_selected}] or \code{data_extract_spec})\cr value indicating on treatment -records in \code{treatment_flag_var}.} +\item{treatment_flag}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr value +indicating on treatment records in \code{treatment_flag_var}.} -\item{treatment_flag_var}{(\code{choices_selected} or \code{data_extract_spec})\cr on treatment flag variable.} +\item{treatment_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr on +treatment flag variable.} \item{useNA}{(\code{character})\cr whether missing data (\code{NA}) should be displayed as a level.} -\item{visit_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for variable names that can be used as \code{visit} variable. Must be a factor in \code{dataname}.} +\item{visit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and preselected option for variable names that can be used as \code{visit} variable. +Must be a factor in \code{dataname}.} \item{worst_flag_indicator}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr value indicating worst grade.} diff --git a/man/template_exposure.Rd b/man/template_exposure.Rd index cb7ff3f734..9da7220808 100644 --- a/man/template_exposure.Rd +++ b/man/template_exposure.Rd @@ -32,14 +32,12 @@ template_exposure( \item{paramcd}{(\code{character})\cr variable value designating the studied parameter.} -\item{paramcd_label}{(\code{character})\cr -the column from the dataset where the value will be used to label the argument \code{paramcd}.} +\item{paramcd_label}{(\code{character})\cr the column from the \code{dataname} dataset where the +value will be used to label the argument \code{paramcd}.} -\item{row_by_var}{(\code{character})\cr -variable name used to split the rows.} +\item{row_by_var}{(\code{character})\cr variable name used to split the values by rows.} -\item{col_by_var}{(\code{character})\cr -variable name used to split the columns.} +\item{col_by_var}{(\code{character})\cr variable name used to split the values by columns.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} @@ -50,10 +48,10 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} \item{add_total_row}{(\code{flag})\cr whether a "total" level should be added after the others which includes all the levels that constitute the split. A custom label can be set for this level via the \code{total_row_label} argument.} -\item{total_row_label}{(\code{character})\cr string to display as total row label if row is enabled (see \code{add_total_row}).} +\item{total_row_label}{(\code{character})\cr string to display as total row label if row is +enabled (see \code{add_total_row}).} -\item{drop_levels}{(\code{flag})\cr -whether empty rows should be removed from the table.} +\item{drop_levels}{(\code{flag})\cr whether empty rows should be removed from the table.} \item{na_level}{(\code{string})\cr used to replace all \code{NA} or empty values in character or factor variables in the data. Defaults to \code{""}. To set a @@ -69,8 +67,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Template: Exposure Table for Risk management plan +Creates a valid expression to generate exposure table for risk management plan. } \seealso{ \code{\link[=tm_t_exposure]{tm_t_exposure()}} diff --git a/man/tm_a_gee.Rd b/man/tm_a_gee.Rd index 1fecf0f462..b81bbf019d 100644 --- a/man/tm_a_gee.Rd +++ b/man/tm_a_gee.Rd @@ -30,10 +30,11 @@ tm_a_gee( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{aval_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the analysis variable.} +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the analysis variable.} -\item{id_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object specifying the variable name for subject id.} +\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying +the variable name for subject id.} \item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. @@ -41,11 +42,12 @@ It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{visit_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for variable names that can be used as \code{visit} variable. Must be a factor in \code{dataname}.} +\item{visit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and preselected option for variable names that can be used as \code{visit} variable. +Must be a factor in \code{dataname}.} -\item{cov_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the covariates variables.} +\item{cov_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the covariates variables.} \item{arm_ref_comp}{optional, (\code{list})\cr If specified it must be a named list with each element corresponding to an arm variable in \code{ADSL} and the element must be another list (possibly @@ -53,10 +55,11 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value +designating the studied parameter.} -\item{conf_level}{(\code{choices_selected})\cr object with all available choices and preselected option for the -confidence level, each within range of (0, 1).} +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. For example a title.} diff --git a/man/tm_a_mmrm.Rd b/man/tm_a_mmrm.Rd index c1b6c625c0..f414d9f0af 100644 --- a/man/tm_a_mmrm.Rd +++ b/man/tm_a_mmrm.Rd @@ -36,10 +36,11 @@ tm_a_mmrm( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{aval_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the analysis variable.} +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the analysis variable.} -\item{id_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object specifying the variable name for subject id.} +\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying +the variable name for subject id.} \item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. @@ -47,11 +48,12 @@ It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{visit_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for variable names that can be used as \code{visit} variable. Must be a factor in \code{dataname}.} +\item{visit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and preselected option for variable names that can be used as \code{visit} variable. +Must be a factor in \code{dataname}.} -\item{cov_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the covariates variables.} +\item{cov_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the covariates variables.} \item{arm_ref_comp}{optional, (\code{list})\cr If specified it must be a named list with each element corresponding to an arm variable in \code{ADSL} and the element must be another list (possibly @@ -59,13 +61,14 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value +designating the studied parameter.} \item{method}{(\code{choices_selected})\cr object with all available choices and preselected option for the adjustment method.} -\item{conf_level}{(\code{choices_selected})\cr object with all available choices and preselected option for the -confidence level, each within range of (0, 1).} +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{plot_height}{optional, (\code{numeric})\cr a vector of length three with \code{c(value, min, max)}. Specifies the height of the main plot and renders a slider on the plot to interactively adjust the plot height.} diff --git a/man/tm_g_ci.Rd b/man/tm_g_ci.Rd index a54793981b..4fcc79c1e4 100644 --- a/man/tm_g_ci.Rd +++ b/man/tm_g_ci.Rd @@ -31,8 +31,8 @@ and point shape).} \item{stat}{(\code{character})\cr either \code{mean} or \code{median}.} -\item{conf_level}{(\code{choices_selected})\cr object with all available choices and preselected option for the -confidence level, each within range of (0, 1).} +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{plot_height}{optional, (\code{numeric})\cr a vector of length three with \code{c(value, min, max)}. Specifies the height of the main plot and renders a slider on the plot to interactively adjust the plot height.} diff --git a/man/tm_g_forest_rsp.Rd b/man/tm_g_forest_rsp.Rd index 041e56b242..224fc3c176 100644 --- a/man/tm_g_forest_rsp.Rd +++ b/man/tm_g_forest_rsp.Rd @@ -47,21 +47,23 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value +designating the studied parameter.} -\item{aval_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the analysis variable.} +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the analysis variable.} -\item{subgroup_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and -preselected option for variable names that can be used as the default subgroups.} +\item{subgroup_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and preselected option for variable names that can be used as the default subgroups.} -\item{strata_var}{(\code{choices_selected} or \code{data_extract_spec})\cr names of the variables for stratified analysis.} +\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of +the variables for stratified analysis.} \item{fixed_symbol_size}{(\code{logical})\cr When (\code{TRUE}), the same symbol size is used for plotting each estimate. Otherwise, the symbol size will be proportional to the sample size in each each subgroup.} -\item{conf_level}{(\code{choices_selected})\cr object with all available choices and preselected option for the -confidence level, each within range of (0, 1).} +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{default_responses}{(\code{list} or \code{character})\cr defines the default codes for the response variable in the module per value of \code{paramcd}. diff --git a/man/tm_g_forest_tte.Rd b/man/tm_g_forest_tte.Rd index 012b082c5d..8b96f14911 100644 --- a/man/tm_g_forest_tte.Rd +++ b/man/tm_g_forest_tte.Rd @@ -50,24 +50,26 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{subgroup_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and -preselected option for variable names that can be used as the default subgroups.} +\item{subgroup_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and preselected option for variable names that can be used as the default subgroups.} -\item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value +designating the studied parameter.} -\item{strata_var}{(\code{choices_selected} or \code{data_extract_spec})\cr names of the variables for stratified analysis.} +\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of +the variables for stratified analysis.} -\item{aval_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the analysis variable.} +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the analysis variable.} -\item{cnsr_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the censoring variable.} +\item{cnsr_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the censoring variable.} -\item{conf_level}{(\code{choices_selected})\cr object with all available choices and preselected option for the -confidence level, each within range of (0, 1).} +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the confidence level, each within range of (0, 1).} -\item{time_unit_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and -preselected option for the time unit variable.} +\item{time_unit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +with all available choices and pre-selected option for the time unit variable.} \item{fixed_symbol_size}{(\code{logical})\cr When (\code{TRUE}), the same symbol size is used for plotting each estimate. Otherwise, the symbol size will be proportional to the sample size in each each subgroup.} diff --git a/man/tm_g_ipp.Rd b/man/tm_g_ipp.Rd index ebc7ace0ee..6408af553f 100644 --- a/man/tm_g_ipp.Rd +++ b/man/tm_g_ipp.Rd @@ -45,15 +45,18 @@ tm_g_ipp( object with all available choices and preselected option for variable values that can be used as \code{arm_var}.} -\item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value +designating the studied parameter.} -\item{id_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object specifying the variable name for subject id.} +\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying +the variable name for subject id.} -\item{visit_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for variable names that can be used as \code{visit} variable. Must be a factor in \code{dataname}.} +\item{visit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and preselected option for variable names that can be used as \code{visit} variable. +Must be a factor in \code{dataname}.} -\item{aval_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the analysis variable.} +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the analysis variable.} \item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for the analysis unit variable.} diff --git a/man/tm_g_km.Rd b/man/tm_g_km.Rd index 15062c5e6e..6b7a4bfe5f 100644 --- a/man/tm_g_km.Rd +++ b/man/tm_g_km.Rd @@ -48,24 +48,26 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value +designating the studied parameter.} -\item{strata_var}{(\code{choices_selected} or \code{data_extract_spec})\cr names of the variables for stratified analysis.} +\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of +the variables for stratified analysis.} \item{facet_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for names of variable that can be used for plot faceting.} -\item{time_unit_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and -preselected option for the time unit variable.} +\item{time_unit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +with all available choices and pre-selected option for the time unit variable.} -\item{aval_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the analysis variable.} +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the analysis variable.} -\item{cnsr_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the censoring variable.} +\item{cnsr_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the censoring variable.} -\item{conf_level}{(\code{choices_selected})\cr object with all available choices and preselected option for the -confidence level, each within range of (0, 1).} +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{plot_height}{optional, (\code{numeric})\cr a vector of length three with \code{c(value, min, max)}. Specifies the height of the main plot and renders a slider on the plot to interactively adjust the plot height.} diff --git a/man/tm_g_lineplot.Rd b/man/tm_g_lineplot.Rd index 5dca1f93a9..6adde4a73a 100644 --- a/man/tm_g_lineplot.Rd +++ b/man/tm_g_lineplot.Rd @@ -52,12 +52,13 @@ tm_g_lineplot( \item{y_unit}{(\code{character} or \code{NA})\cr \code{y_unit} variable name.} -\item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value +designating the studied parameter.} \item{param}{(\code{character})\cr parameter to filter the data by.} -\item{conf_level}{(\code{choices_selected})\cr object with all available choices and preselected option for the -confidence level, each within range of (0, 1).} +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{interval}{(\code{character} or \code{NULL})\cr names of the statistics that will be plotted as intervals. All the statistics indicated in \code{interval} variable must be present in the object returned by \code{sfun}, diff --git a/man/tm_t_abnormality.Rd b/man/tm_t_abnormality.Rd index c053287bfc..d29efc686b 100644 --- a/man/tm_t_abnormality.Rd +++ b/man/tm_t_abnormality.Rd @@ -45,8 +45,8 @@ It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{by_vars}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for variable names used to split the summary by rows.} +\item{by_vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names used to split the summary by rows.} \item{grade}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for variable names that can be used to @@ -54,15 +54,17 @@ specify the abnormality grade. Variable must be factor.} \item{abnormal}{(\verb{named list})\cr defined by user to indicate what abnormalities are to be displayed.} -\item{id_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object specifying the variable name for subject id.} +\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying +the variable name for subject id.} \item{baseline_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable for baseline abnormality grade.} -\item{treatment_flag_var}{(\code{choices_selected} or \code{data_extract_spec})\cr on treatment flag variable.} +\item{treatment_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr on +treatment flag variable.} -\item{treatment_flag}{(\code{choices_selected}] or \code{data_extract_spec})\cr value indicating on treatment -records in \code{treatment_flag_var}.} +\item{treatment_flag}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr value +indicating on treatment records in \code{treatment_flag_var}.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} diff --git a/man/tm_t_abnormality_by_worst_grade.Rd b/man/tm_t_abnormality_by_worst_grade.Rd index 627d781fd0..1629964f29 100644 --- a/man/tm_t_abnormality_by_worst_grade.Rd +++ b/man/tm_t_abnormality_by_worst_grade.Rd @@ -44,9 +44,11 @@ It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{id_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object specifying the variable name for subject id.} +\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying +the variable name for subject id.} -\item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value +designating the studied parameter.} \item{atoxgr_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option diff --git a/man/tm_t_ancova.Rd b/man/tm_t_ancova.Rd index 4074fea19f..91e2ba551b 100644 --- a/man/tm_t_ancova.Rd +++ b/man/tm_t_ancova.Rd @@ -44,11 +44,11 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{aval_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the analysis variable.} +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the analysis variable.} -\item{cov_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the covariates variables.} +\item{cov_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the covariates variables.} \item{include_interact}{(\code{logical})\cr whether an interaction term should be included in the model.} @@ -59,12 +59,14 @@ with arm. If the interaction is not needed, the default option is \code{NULL}.} to select the specific \code{ANCOVA} results when interact_var is discrete. If the interaction is not needed, the default option is \code{FALSE}.} -\item{avisit}{(\code{choices_selected} or \code{data_extract_spec})\cr value of analysis visit \code{AVISIT} of interest.} +\item{avisit}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr value of analysis +visit \code{AVISIT} of interest.} -\item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value +designating the studied parameter.} -\item{conf_level}{(\code{choices_selected})\cr object with all available choices and preselected option for the -confidence level, each within range of (0, 1).} +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. For example a title.} diff --git a/man/tm_t_binary_outcome.Rd b/man/tm_t_binary_outcome.Rd index 9fcb43b413..3c50db5916 100644 --- a/man/tm_t_binary_outcome.Rd +++ b/man/tm_t_binary_outcome.Rd @@ -48,15 +48,17 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value +designating the studied parameter.} -\item{strata_var}{(\code{choices_selected} or \code{data_extract_spec})\cr names of the variables for stratified analysis.} +\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of +the variables for stratified analysis.} -\item{aval_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the analysis variable.} +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the analysis variable.} -\item{conf_level}{(\code{choices_selected})\cr object with all available choices and preselected option for the -confidence level, each within range of (0, 1).} +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{default_responses}{(\code{list} or \code{character})\cr defines the default codes for the response variable in the module per value of \code{paramcd}. diff --git a/man/tm_t_coxreg.Rd b/man/tm_t_coxreg.Rd index 003d21f091..cb8e1b5913 100644 --- a/man/tm_t_coxreg.Rd +++ b/man/tm_t_coxreg.Rd @@ -46,18 +46,20 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value +designating the studied parameter.} -\item{cov_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the covariates variables.} +\item{cov_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the covariates variables.} -\item{strata_var}{(\code{choices_selected} or \code{data_extract_spec})\cr names of the variables for stratified analysis.} +\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of +the variables for stratified analysis.} -\item{aval_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the analysis variable.} +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the analysis variable.} -\item{cnsr_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the censoring variable.} +\item{cnsr_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the censoring variable.} \item{multivariate}{(\code{logical})\cr if \code{FALSE}, the univariable approach is used instead of the multi-variable model.} @@ -66,8 +68,8 @@ multi-variable model.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{conf_level}{(\code{choices_selected})\cr object with all available choices and preselected option for the -confidence level, each within range of (0, 1).} +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. For example a title.} diff --git a/man/tm_t_events.Rd b/man/tm_t_events.Rd index a005da7b6d..b5f60714aa 100644 --- a/man/tm_t_events.Rd +++ b/man/tm_t_events.Rd @@ -40,9 +40,11 @@ It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{hlt}{(\code{choices_selected} or \code{data_extract_spec})\cr name of the variable with high level term for events.} +\item{hlt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable +with high level term for events.} -\item{llt}{(\code{choices_selected} or \code{data_extract_spec})\cr name of the variable with low level term for events.} +\item{llt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable +with low level term for events.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} diff --git a/man/tm_t_events_by_grade.Rd b/man/tm_t_events_by_grade.Rd index 6341d68697..730c71f05e 100644 --- a/man/tm_t_events_by_grade.Rd +++ b/man/tm_t_events_by_grade.Rd @@ -40,9 +40,11 @@ It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{hlt}{(\code{choices_selected} or \code{data_extract_spec})\cr name of the variable with high level term for events.} +\item{hlt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable +with high level term for events.} -\item{llt}{(\code{choices_selected} or \code{data_extract_spec})\cr name of the variable with low level term for events.} +\item{llt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable +with low level term for events.} \item{grade}{(\code{character})\cr name of the severity level variable.} diff --git a/man/tm_t_events_patyear.Rd b/man/tm_t_events_patyear.Rd index 2f5f283005..1b09003217 100644 --- a/man/tm_t_events_patyear.Rd +++ b/man/tm_t_events_patyear.Rd @@ -43,10 +43,11 @@ second variable will be nested under the first variable.} \item{events_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for the variable with all event counts.} -\item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value +designating the studied parameter.} -\item{aval_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the analysis variable.} +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the analysis variable.} \item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for the analysis unit variable.} @@ -61,8 +62,8 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{conf_level}{(\code{choices_selected})\cr object with all available choices and preselected option for the -confidence level, each within range of (0, 1).} +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the diff --git a/man/tm_t_events_summary.Rd b/man/tm_t_events_summary.Rd index bfe70cf3ea..c6d2c3ed91 100644 --- a/man/tm_t_events_summary.Rd +++ b/man/tm_t_events_summary.Rd @@ -63,7 +63,8 @@ with all available choices and preselected option for variable names that can be reason variable. Records with \code{"ADVERSE EVENTS"} are summarized in the table row for "Total number of patients withdrawn from study due to an AE".} -\item{llt}{(\code{choices_selected} or \code{data_extract_spec})\cr name of the variable with low level term for events.} +\item{llt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable +with low level term for events.} \item{aeseq_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable for adverse events sequence number from \code{dataset}. Used for counting total number of events.} diff --git a/man/tm_t_exposure.Rd b/man/tm_t_exposure.Rd index 8bbeee1122..fd58f46236 100644 --- a/man/tm_t_exposure.Rd +++ b/man/tm_t_exposure.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_exposure.R \name{tm_t_exposure} \alias{tm_t_exposure} -\title{Teal module: Exposure Table for Risk management plan} +\title{teal Module: Exposure Table for Risk management plan} \usage{ tm_t_exposure( label, @@ -46,19 +46,21 @@ variable names that can be used to split rows.} object with all available choices and preselected option for variable names that can be used to split columns.} -\item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value +designating the studied parameter.} -\item{paramcd_label}{(\code{character})\cr -the column from the dataset where the value will be used to label the argument \code{paramcd}.} +\item{paramcd_label}{(\code{character})\cr the column from the dataset where the value will be used to +label the argument \code{paramcd}.} -\item{id_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object specifying the variable name for subject id.} +\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying +the variable name for subject id.} \item{parcat}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for parameter category values.} -\item{aval_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the analysis variable.} +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the analysis variable.} \item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for the analysis unit variable.} @@ -72,7 +74,8 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} \item{add_total_row}{(\code{flag})\cr whether a "total" level should be added after the others which includes all the levels that constitute the split. A custom label can be set for this level via the \code{total_row_label} argument.} -\item{total_row_label}{(\code{character})\cr string to display as total row label if row is enabled (see \code{add_total_row}).} +\item{total_row_label}{(\code{character})\cr string to display as total row label if row is +enabled (see \code{add_total_row}).} \item{na_level}{(\code{string})\cr used to replace all \code{NA} or empty values in character or factor variables in the data. Defaults to \code{""}. To set a @@ -90,8 +93,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -Teal module: Exposure Table for Risk management plan +The module produces an exposure table for risk management plan. } \examples{ data <- teal_data() @@ -149,3 +155,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} diff --git a/man/tm_t_logistic.Rd b/man/tm_t_logistic.Rd index 36f004ed6f..2972a2974a 100644 --- a/man/tm_t_logistic.Rd +++ b/man/tm_t_logistic.Rd @@ -41,16 +41,17 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value +designating the studied parameter.} -\item{cov_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the covariates variables.} +\item{cov_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the covariates variables.} \item{avalc_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for the analysis variable (categorical).} -\item{conf_level}{(\code{choices_selected})\cr object with all available choices and preselected option for the -confidence level, each within range of (0, 1).} +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. For example a title.} diff --git a/man/tm_t_mult_events.Rd b/man/tm_t_mult_events.Rd index 35cb20ced2..b00c6db342 100644 --- a/man/tm_t_mult_events.Rd +++ b/man/tm_t_mult_events.Rd @@ -40,9 +40,11 @@ second variable will be nested under the first variable.} all available choices and preselected option for variable names that can be used as analysis sequence number variable. Used for counting the unique number of events.} -\item{hlt}{(\code{choices_selected} or \code{data_extract_spec})\cr name of the variable with high level term for events.} +\item{hlt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable +with high level term for events.} -\item{llt}{(\code{choices_selected} or \code{data_extract_spec})\cr name of the variable with low level term for events.} +\item{llt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable +with low level term for events.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} diff --git a/man/tm_t_shift_by_arm.Rd b/man/tm_t_shift_by_arm.Rd index 93cd856993..159dbe5d63 100644 --- a/man/tm_t_shift_by_arm.Rd +++ b/man/tm_t_shift_by_arm.Rd @@ -41,23 +41,26 @@ It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value +designating the studied parameter.} -\item{visit_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for variable names that can be used as \code{visit} variable. Must be a factor in \code{dataname}.} +\item{visit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and preselected option for variable names that can be used as \code{visit} variable. +Must be a factor in \code{dataname}.} -\item{aval_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the analysis variable.} +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the analysis variable.} \item{base_var}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Please use the \code{baseline_var} argument instead.} \item{baseline_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for variable values that can be used as \code{baseline_var}.} -\item{treatment_flag_var}{(\code{choices_selected} or \code{data_extract_spec})\cr on treatment flag variable.} +\item{treatment_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr on +treatment flag variable.} -\item{treatment_flag}{(\code{choices_selected}] or \code{data_extract_spec})\cr value indicating on treatment -records in \code{treatment_flag_var}.} +\item{treatment_flag}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr value +indicating on treatment records in \code{treatment_flag_var}.} \item{useNA}{(\code{character})\cr whether missing data (\code{NA}) should be displayed as a level.} diff --git a/man/tm_t_shift_by_arm_by_worst.Rd b/man/tm_t_shift_by_arm_by_worst.Rd index d77f0a249e..656e164dd7 100644 --- a/man/tm_t_shift_by_arm_by_worst.Rd +++ b/man/tm_t_shift_by_arm_by_worst.Rd @@ -41,10 +41,11 @@ It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value +designating the studied parameter.} -\item{aval_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the analysis variable.} +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the analysis variable.} \item{base_var}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Please use the \code{baseline_var} argument instead.} @@ -56,10 +57,11 @@ with all available choices and preselected option for variable names that can be \item{worst_flag}{(\code{character})\cr value indicating worst analysis indicator level.} -\item{treatment_flag_var}{(\code{choices_selected} or \code{data_extract_spec})\cr on treatment flag variable.} +\item{treatment_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr on +treatment flag variable.} -\item{treatment_flag}{(\code{choices_selected}] or \code{data_extract_spec})\cr value indicating on treatment -records in \code{treatment_flag_var}.} +\item{treatment_flag}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr value +indicating on treatment records in \code{treatment_flag_var}.} \item{useNA}{(\code{character})\cr whether missing data (\code{NA}) should be displayed as a level.} diff --git a/man/tm_t_shift_by_grade.Rd b/man/tm_t_shift_by_grade.Rd index bc38b51c80..b2cfa449df 100644 --- a/man/tm_t_shift_by_grade.Rd +++ b/man/tm_t_shift_by_grade.Rd @@ -50,10 +50,12 @@ It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{visit_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for variable names that can be used as \code{visit} variable. Must be a factor in \code{dataname}.} +\item{visit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and preselected option for variable names that can be used as \code{visit} variable. +Must be a factor in \code{dataname}.} -\item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value +designating the studied parameter.} \item{worst_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for variable names that can be used as worst flag variable.} @@ -67,7 +69,8 @@ variable for analysis toxicity grade.} \item{base_toxgrade_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable for baseline toxicity grade.} -\item{id_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object specifying the variable name for subject id.} +\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying +the variable name for subject id.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} diff --git a/man/tm_t_smq.Rd b/man/tm_t_smq.Rd index 7c4dc2fd0e..b57fd424ac 100644 --- a/man/tm_t_smq.Rd +++ b/man/tm_t_smq.Rd @@ -39,9 +39,11 @@ It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{id_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object specifying the variable name for subject id.} +\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying +the variable name for subject id.} -\item{llt}{(\code{choices_selected} or \code{data_extract_spec})\cr name of the variable with low level term for events.} +\item{llt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable +with low level term for events.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} diff --git a/man/tm_t_summary.Rd b/man/tm_t_summary.Rd index 753dbdcb0f..46f27b3ce2 100644 --- a/man/tm_t_summary.Rd +++ b/man/tm_t_summary.Rd @@ -37,8 +37,8 @@ It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{summarize_vars}{(\code{choices_selected} or \code{data_extract_spec})\cr names of the variables that should be -summarized.} +\item{summarize_vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of +the variables that should be summarized.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} diff --git a/man/tm_t_summary_by.Rd b/man/tm_t_summary_by.Rd index fb24914fce..66e6eb81c0 100644 --- a/man/tm_t_summary_by.Rd +++ b/man/tm_t_summary_by.Rd @@ -44,15 +44,17 @@ It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{by_vars}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for variable names used to split the summary by rows.} +\item{by_vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names used to split the summary by rows.} -\item{summarize_vars}{(\code{choices_selected} or \code{data_extract_spec})\cr names of the variables that should be -summarized.} +\item{summarize_vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of +the variables that should be summarized.} -\item{id_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object specifying the variable name for subject id.} +\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying +the variable name for subject id.} -\item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value +designating the studied parameter.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} diff --git a/man/tm_t_tte.Rd b/man/tm_t_tte.Rd index d7bea44682..80f00068e6 100644 --- a/man/tm_t_tte.Rd +++ b/man/tm_t_tte.Rd @@ -53,15 +53,17 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{choices_selected} or \code{data_extract_spec})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value +designating the studied parameter.} -\item{strata_var}{(\code{choices_selected} or \code{data_extract_spec})\cr names of the variables for stratified analysis.} +\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of +the variables for stratified analysis.} -\item{aval_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the analysis variable.} +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the analysis variable.} -\item{cnsr_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and preselected -option for the censoring variable.} +\item{cnsr_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the censoring variable.} \item{conf_level_coxph}{(\code{\link[=choices_selected]{choices_selected()}})\cr object with all available choices and pre-selected option for confidence level, each within range of (0, 1).} @@ -72,8 +74,8 @@ for confidence level, each within range of (0, 1).} \item{time_points}{(\code{choices_selected})\cr object with all available choices and preselected option for time points that can be used in \code{\link[tern:survival_timepoint]{tern::surv_timepoint()}}.} -\item{time_unit_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices and -preselected option for the time unit variable.} +\item{time_unit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +with all available choices and pre-selected option for the time unit variable.} \item{event_desc_var}{(\code{character} or \code{\link[=data_extract_spec]{data_extract_spec()}})\cr variable name with the event description information, optional.} From 66e4c5ca937c765ad835d8f46135f491e8455949 Mon Sep 17 00:00:00 2001 From: Melkiades Date: Mon, 5 Feb 2024 11:02:27 +0000 Subject: [PATCH 054/126] [skip actions] Bump version to 0.8.16.9071 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 9535a934b5..c3b40ec640 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9070 +Version: 0.8.16.9071 Date: 2024-02-05 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 8f473b0472..f1fcf754fe 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9070 +# teal.modules.clinical 0.8.16.9071 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 64f247cc17fcf449ea4a2d59faaca56f29f0d981 Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Mon, 5 Feb 2024 09:12:57 -0500 Subject: [PATCH 055/126] Clean up documentation for `tm_g_ipp` (#1034) # Pull Request Fixes #945 --------- Co-authored-by: Davide Garolini --- R/argument_convention.R | 1 + R/tm_g_ipp.R | 69 +++++++++++++++++++-------------------- man/template_arguments.Rd | 2 ++ man/template_g_ipp.Rd | 40 +++++++++++++---------- man/tm_g_ipp.Rd | 38 +++++++++++---------- 5 files changed, 80 insertions(+), 70 deletions(-) diff --git a/R/argument_convention.R b/R/argument_convention.R index 97f4d07366..08b2de5bda 100644 --- a/R/argument_convention.R +++ b/R/argument_convention.R @@ -17,6 +17,7 @@ #' @param avalu `r lifecycle::badge("deprecated")` Please use the `avalu_var` argument instead. #' @param avalu_var (`character`)\cr name of the analysis value unit variable. #' @param aval_var (`character`)\cr name of the analysis value variable. +#' @param baseline_var (`character`)\cr name of the variable for baseline values of the analysis variable. #' @param base_var `r lifecycle::badge("deprecated")` Please use the `baseline_var` argument instead. #' @param basic_table_args optional, (`basic_table_args`)\cr object created by [teal.widgets::basic_table_args()] #' with settings for the module table. The argument is merged with option `teal.basic_table_args` and with default diff --git a/R/tm_g_ipp.R b/R/tm_g_ipp.R index da5f85c7b3..61d3cc8516 100644 --- a/R/tm_g_ipp.R +++ b/R/tm_g_ipp.R @@ -1,26 +1,30 @@ #' Template: Individual Patient Plots #' +#' Creates a valid expression to generate [ggplot2::ggplot()] plots of individual patients. +#' #' @inheritParams template_arguments -#' @param avalu_var (`string`)\cr variable name designating the unit of the analysis variable. -#' @param baseline_var (`string`)\cr variable name designating the baseline values of analysis variable. -#' @param visit_var (`string`)\cr variable name designating the visit timepoint variable. -#' @param add_baseline_hline (`flag`)\cr adds horizontal line at baseline y-value on plot -#' @param separate_by_obs (`flag`)\cr creates multi panel plots when TRUE -#' @param suppress_legend (`flag`)\cr allow user to suppress legend -#' @param arm_levels (`character`)\cr vector of all arm variable levels. -#' @param avalu_first (`string`)\cr `avalu` value. -#' @param paramcd_first (`string`)\cr `paramcd` value. -#' @param add_avalu (`flag`)\cr allow user to not display value unit in the plot. -#' @param ggplot2_args optional, (`ggplot2_args`)\cr -#' object created by [teal.widgets::ggplot2_args()] with settings for the module plot. -#' For this module, this argument will only accept `ggplot2_args` object with `labs` list of following child elements: -#' `title`, `subtitle`, `x`, `y`. -#' No other elements would be taken into account. The argument is merged with option `teal.ggplot2_args` and -#' with default module arguments (hard coded in the module body). +#' @param visit_var (`character`)\cr name of the variable for visit timepoints. +#' @param add_baseline_hline (`logical`)\cr whether a horizontal line should be added to the plot at baseline y-value. +#' @param separate_by_obs (`logical`)\cr whether to create multi-panel plots. +#' @param suppress_legend (`logical`)\cr whether to suppress the plot legend. +#' @param arm_levels (`character`)\cr vector of all levels of `arm_var`. +#' @param avalu_first (`character`)\cr `avalu_var` text to append to the plot title and y-axis label if `add_avalu` is +#' `TRUE`. +#' @param paramcd_first (`character`)\cr `paramcd` text to append to the plot title and y-axis label. +#' @param add_avalu (`logical`)\cr whether `avalu_first` text should be appended to the plot title and y-axis label. +#' @param ggplot2_args optional, (`ggplot2_args`)\cr object created by [teal.widgets::ggplot2_args()] with settings +#' for the module plot. For this module, this argument will only accept `ggplot2_args` object with `labs` list of +#' the following child elements: `title`, `subtitle`, `x`, `y`. No other elements are taken into account. The +#' argument is merged with option `teal.ggplot2_args` and with default module arguments (hard coded in the module +#' body). #' -#' For more details, see the vignette: `vignette("custom-ggplot2-arguments", package = "teal.widgets")`. -#' @keywords internal +#' For more details, see the vignette: `vignette("custom-ggplot2-arguments", package = "teal.widgets")`. +#' +#' @inherit template_arguments return #' +#' @seealso [tm_g_ipp()] +#' +#' @keywords internal template_g_ipp <- function(dataname = "ANL", paramcd, arm_var, @@ -93,8 +97,6 @@ template_g_ipp <- function(dataname = "ANL", ) ) - - graph_list <- list() graph_list <- add_expr( graph_list, @@ -167,27 +169,20 @@ template_g_ipp <- function(dataname = "ANL", y } -#' Teal Module: Individual Patient Plot +#' teal Module: Individual Patient Plots #' -#' This teal module produces grid style Individual patient plot(s) that show -#' trends in parameter values over time for each patient using data with -#' `ADaM` structure. +#' This module produces [ggplot2::ggplot()] type individual patient plots that display trends in parameter +#' values over time for each patient, using data with ADaM structure. #' #' @inheritParams module_arguments #' @inheritParams template_g_ipp -#' @param arm_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' object with all available choices -#' and preselected option for variable values that can be used as `arm_var`. -#' @param ggplot2_args optional, (`ggplot2_args`)\cr -#' object created by [teal.widgets::ggplot2_args()] with settings for the module plot. -#' For this module, this argument will only accept `ggplot2_args` object with `labs` list of following child elements: -#' `title`, `subtitle`, `x`, `y`. -#' No other elements would be taken into account. The argument is merged with option `teal.ggplot2_args` and -#' with default module arguments (hard coded in the module body). +#' @param arm_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' all available choices and preselected option for variable values that can be used as arm variable. #' -#' For more details, see the vignette: `vignette("custom-ggplot2-arguments", package = "teal.widgets")`. +#' @inherit module_arguments return #' -#' @export +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. #' #' @examples #' library(nestcolor) @@ -254,6 +249,7 @@ template_g_ipp <- function(dataname = "ANL", #' shinyApp(ui = app$ui, server = app$server) #' } #' +#' @export tm_g_ipp <- function(label, dataname, parentname = ifelse( @@ -358,7 +354,7 @@ tm_g_ipp <- function(label, ) } - +#' @keywords internal ui_g_ipp <- function(id, ...) { a <- list(...) # module args is_single_dataset_value <- teal.transform::is_single_dataset( @@ -460,6 +456,7 @@ ui_g_ipp <- function(id, ...) { ) } +#' @keywords internal srv_g_ipp <- function(id, data, reporter, diff --git a/man/template_arguments.Rd b/man/template_arguments.Rd index 66f45e8072..7ee381a004 100644 --- a/man/template_arguments.Rd +++ b/man/template_arguments.Rd @@ -20,6 +20,8 @@ \item{aval_var}{(\code{character})\cr name of the analysis value variable.} +\item{baseline_var}{(\code{character})\cr name of the variable for baseline values of the analysis variable.} + \item{base_var}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Please use the \code{baseline_var} argument instead.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} diff --git a/man/template_g_ipp.Rd b/man/template_g_ipp.Rd index e5c36fcf6d..0665e8f394 100644 --- a/man/template_g_ipp.Rd +++ b/man/template_g_ipp.Rd @@ -31,42 +31,48 @@ template_g_ipp( \item{arm_var}{(\code{character})\cr variable names that can be used as \code{arm_var}.} -\item{arm_levels}{(\code{character})\cr vector of all arm variable levels.} +\item{arm_levels}{(\code{character})\cr vector of all levels of \code{arm_var}.} -\item{avalu_first}{(\code{string})\cr \code{avalu} value.} +\item{avalu_first}{(\code{character})\cr \code{avalu_var} text to append to the plot title and y-axis label if \code{add_avalu} is +\code{TRUE}.} -\item{paramcd_first}{(\code{string})\cr \code{paramcd} value.} +\item{paramcd_first}{(\code{character})\cr \code{paramcd} text to append to the plot title and y-axis label.} \item{aval_var}{(\code{character})\cr name of the analysis value variable.} -\item{avalu_var}{(\code{string})\cr variable name designating the unit of the analysis variable.} +\item{avalu_var}{(\code{character})\cr name of the analysis value unit variable.} \item{id_var}{(\code{character})\cr the variable name for subject id.} -\item{visit_var}{(\code{string})\cr variable name designating the visit timepoint variable.} +\item{visit_var}{(\code{character})\cr name of the variable for visit timepoints.} \item{base_var}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Please use the \code{baseline_var} argument instead.} -\item{baseline_var}{(\code{string})\cr variable name designating the baseline values of analysis variable.} +\item{baseline_var}{(\code{character})\cr name of the variable for baseline values of the analysis variable.} -\item{add_baseline_hline}{(\code{flag})\cr adds horizontal line at baseline y-value on plot} +\item{add_baseline_hline}{(\code{logical})\cr whether a horizontal line should be added to the plot at baseline y-value.} -\item{separate_by_obs}{(\code{flag})\cr creates multi panel plots when TRUE} +\item{separate_by_obs}{(\code{logical})\cr whether to create multi-panel plots.} -\item{ggplot2_args}{optional, (\code{ggplot2_args})\cr -object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. -For this module, this argument will only accept \code{ggplot2_args} object with \code{labs} list of following child elements: -\code{title}, \code{subtitle}, \code{x}, \code{y}. -No other elements would be taken into account. The argument is merged with option \code{teal.ggplot2_args} and -with default module arguments (hard coded in the module body). +\item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings +for the module plot. For this module, this argument will only accept \code{ggplot2_args} object with \code{labs} list of +the following child elements: \code{title}, \code{subtitle}, \code{x}, \code{y}. No other elements are taken into account. The +argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module +body). For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} -\item{suppress_legend}{(\code{flag})\cr allow user to suppress legend} +\item{suppress_legend}{(\code{logical})\cr whether to suppress the plot legend.} -\item{add_avalu}{(\code{flag})\cr allow user to not display value unit in the plot.} +\item{add_avalu}{(\code{logical})\cr whether \code{avalu_first} text should be appended to the plot title and y-axis label.} +} +\value{ +a \code{list} of expressions to generate a table or plot object. } \description{ -Template: Individual Patient Plots +Creates a valid expression to generate \code{\link[ggplot2:ggplot]{ggplot2::ggplot()}} plots of individual patients. +} +\seealso{ +\code{\link[=tm_g_ipp]{tm_g_ipp()}} } \keyword{internal} diff --git a/man/tm_g_ipp.Rd b/man/tm_g_ipp.Rd index 6408af553f..e56ceda381 100644 --- a/man/tm_g_ipp.Rd +++ b/man/tm_g_ipp.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_g_ipp.R \name{tm_g_ipp} \alias{tm_g_ipp} -\title{Teal Module: Individual Patient Plot} +\title{teal Module: Individual Patient Plots} \usage{ tm_g_ipp( label, @@ -41,9 +41,8 @@ tm_g_ipp( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -object with all available choices -and preselected option for variable values that can be used as \code{arm_var}.} +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and preselected option for variable values that can be used as arm variable.} \item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value designating the studied parameter.} @@ -66,13 +65,13 @@ all available choices and preselected option for the analysis unit variable.} \item{baseline_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for variable values that can be used as \code{baseline_var}.} -\item{add_baseline_hline}{(\code{flag})\cr adds horizontal line at baseline y-value on plot} +\item{add_baseline_hline}{(\code{logical})\cr whether a horizontal line should be added to the plot at baseline y-value.} -\item{separate_by_obs}{(\code{flag})\cr creates multi panel plots when TRUE} +\item{separate_by_obs}{(\code{logical})\cr whether to create multi-panel plots.} -\item{suppress_legend}{(\code{flag})\cr allow user to suppress legend} +\item{suppress_legend}{(\code{logical})\cr whether to suppress the plot legend.} -\item{add_avalu}{(\code{flag})\cr allow user to not display value unit in the plot.} +\item{add_avalu}{(\code{logical})\cr whether \code{avalu_first} text should be appended to the plot title and y-axis label.} \item{plot_height}{optional, (\code{numeric})\cr a vector of length three with \code{c(value, min, max)}. Specifies the height of the main plot and renders a slider on the plot to interactively adjust the plot height.} @@ -86,19 +85,20 @@ For example a title.} \item{post_output}{optional, (\code{shiny.tag})\cr with text placed after the output to put the output into context. For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are useful.} -\item{ggplot2_args}{optional, (\code{ggplot2_args})\cr -object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. -For this module, this argument will only accept \code{ggplot2_args} object with \code{labs} list of following child elements: -\code{title}, \code{subtitle}, \code{x}, \code{y}. -No other elements would be taken into account. The argument is merged with option \code{teal.ggplot2_args} and -with default module arguments (hard coded in the module body). +\item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings +for the module plot. For this module, this argument will only accept \code{ggplot2_args} object with \code{labs} list of +the following child elements: \code{title}, \code{subtitle}, \code{x}, \code{y}. No other elements are taken into account. The +argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module +body). For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -This teal module produces grid style Individual patient plot(s) that show -trends in parameter values over time for each patient using data with -\code{ADaM} structure. +This module produces \code{\link[ggplot2:ggplot]{ggplot2::ggplot()}} type individual patient plots that display trends in parameter +values over time for each patient, using data with ADaM structure. } \examples{ library(nestcolor) @@ -166,3 +166,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} From 44f145c6f071f9f90c3fffb1f52cc9f2f3e5c6d9 Mon Sep 17 00:00:00 2001 From: Melkiades Date: Mon, 5 Feb 2024 14:13:48 +0000 Subject: [PATCH 056/126] [skip actions] Bump version to 0.8.16.9072 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index c3b40ec640..99a8280096 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9071 +Version: 0.8.16.9072 Date: 2024-02-05 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index f1fcf754fe..f27dc20c7a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9071 +# teal.modules.clinical 0.8.16.9072 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 8f4f22994accc5c1598d74336a81a06df4d98d2b Mon Sep 17 00:00:00 2001 From: Melkiades Date: Mon, 5 Feb 2024 14:14:47 +0000 Subject: [PATCH 057/126] [skip actions] Update WORDLIST --- inst/WORDLIST | 1 - 1 file changed, 1 deletion(-) diff --git a/inst/WORDLIST b/inst/WORDLIST index f06a2a3e2f..7fccb580ae 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -23,6 +23,5 @@ programmatically repo responder responders -timepoint unadjusted univariable From 06edde0ee84b3426218773c8b793c806559ee2aa Mon Sep 17 00:00:00 2001 From: Abinaya Yogasekaram <73252787+ayogasekaram@users.noreply.github.com> Date: Mon, 5 Feb 2024 10:02:42 -0500 Subject: [PATCH 058/126] 944 clean tm a gee@main (#1040) closes #944 --------- Signed-off-by: Abinaya Yogasekaram <73252787+ayogasekaram@users.noreply.github.com> Co-authored-by: Davide Garolini Co-authored-by: 27856297+dependabot-preview[bot]@users.noreply.github.com <27856297+dependabot-preview[bot]@users.noreply.github.com> --- R/tm_a_gee.R | 25 ++++++++++++++++++------- man/template_a_gee.Rd | 14 +++++++++----- man/tm_a_gee.Rd | 11 +++++++++-- 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/R/tm_a_gee.R b/R/tm_a_gee.R index 28d9a64c1a..dc6c77d7cf 100644 --- a/R/tm_a_gee.R +++ b/R/tm_a_gee.R @@ -1,15 +1,20 @@ #' Template for Generalized Estimating Equations (GEE) analysis module #' +#' Creates a valid expression to generate an analysis table using Generalized Estimating Equations (GEE). +#' #' @inheritParams template_arguments -#' @param output_table (`character`)\cr type of output table (`"t_gee_cov", "t_gee_coef", "t_gee_lsmeans"`) -#' @param data_model_fit (`character`)\cr dataset used to fit the model by `tern.gee::fit_gee()` -#' @param dataname_lsmeans (`character`)\cr dataset used for `alt_counts_df` argument of `rtables::build_table()` -#' @param split_covariates (`character`)\cr vector of names of variables to use as covariates in `tern.gee::vars_gee()` +#' @param output_table (`character`)\cr type of output table (`"t_gee_cov", "t_gee_coef", "t_gee_lsmeans"`). +#' @param data_model_fit (`character`)\cr dataset used to fit the model by `tern.gee::fit_gee()`. +#' @param dataname_lsmeans (`character`)\cr dataset used for `alt_counts_df` argument of `rtables::build_table()`. +#' @param split_covariates (`character`)\cr vector of names of variables to use as covariates in +#' `tern.gee::vars_gee()`. #' @param cor_struct (`character`)\cr assumed correlation structure in `tern.gee::fit_gee`. #' +#' @inherit template_arguments return +#' #' @seealso [tm_a_gee()] -#' @keywords internal #' +#' @keywords internal template_a_gee <- function(output_table, data_model_fit = "ANL", dataname_lsmeans = "ANL_ADSL", @@ -121,13 +126,18 @@ template_a_gee <- function(output_table, y } -#' Teal Module: Teal module for Generalized Estimating Equations (GEE) analysis +#' teal Module: Generalized Estimating Equations (GEE) analysis +#' +#' This module produces an analysis table using Generalized Estimating Equations (GEE). #' #' @inheritParams module_arguments #' @inheritParams template_arguments #' @inheritParams template_a_gee #' -#' @export +#' @inherit module_arguments return +#' +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. #' #' @examples #' data <- teal_data() @@ -171,6 +181,7 @@ template_a_gee <- function(output_table, #' shiny::shinyApp(app$ui, app$server) #' } #' +#' @export tm_a_gee <- function(label, dataname, parentname = ifelse( diff --git a/man/template_a_gee.Rd b/man/template_a_gee.Rd index f13c940bc9..ab965b1f46 100644 --- a/man/template_a_gee.Rd +++ b/man/template_a_gee.Rd @@ -21,11 +21,11 @@ template_a_gee( ) } \arguments{ -\item{output_table}{(\code{character})\cr type of output table (\verb{"t_gee_cov", "t_gee_coef", "t_gee_lsmeans"})} +\item{output_table}{(\code{character})\cr type of output table (\verb{"t_gee_cov", "t_gee_coef", "t_gee_lsmeans"}).} -\item{data_model_fit}{(\code{character})\cr dataset used to fit the model by \code{tern.gee::fit_gee()}} +\item{data_model_fit}{(\code{character})\cr dataset used to fit the model by \code{tern.gee::fit_gee()}.} -\item{dataname_lsmeans}{(\code{character})\cr dataset used for \code{alt_counts_df} argument of \code{rtables::build_table()}} +\item{dataname_lsmeans}{(\code{character})\cr dataset used for \code{alt_counts_df} argument of \code{rtables::build_table()}.} \item{aval_var}{(\code{character})\cr name of the analysis value variable.} @@ -36,7 +36,8 @@ template_a_gee( \item{visit_var}{(\code{character})\cr variable names that can be used as \code{visit} variable. Must be a factor in \code{dataname}.} -\item{split_covariates}{(\code{character})\cr vector of names of variables to use as covariates in \code{tern.gee::vars_gee()}} +\item{split_covariates}{(\code{character})\cr vector of names of variables to use as covariates in +\code{tern.gee::vars_gee()}.} \item{cor_struct}{(\code{character})\cr assumed correlation structure in \code{tern.gee::fit_gee}.} @@ -48,8 +49,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Template for Generalized Estimating Equations (GEE) analysis module +Creates a valid expression to generate an analysis table using Generalized Estimating Equations (GEE). } \seealso{ \code{\link[=tm_a_gee]{tm_a_gee()}} diff --git a/man/tm_a_gee.Rd b/man/tm_a_gee.Rd index b81bbf019d..2ca77dce3d 100644 --- a/man/tm_a_gee.Rd +++ b/man/tm_a_gee.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_a_gee.R \name{tm_a_gee} \alias{tm_a_gee} -\title{Teal Module: Teal module for Generalized Estimating Equations (GEE) analysis} +\title{teal Module: Generalized Estimating Equations (GEE) analysis} \usage{ tm_a_gee( label, @@ -73,8 +73,11 @@ module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -Teal Module: Teal module for Generalized Estimating Equations (GEE) analysis +This module produces an analysis table using Generalized Estimating Equations (GEE). } \examples{ data <- teal_data() @@ -119,3 +122,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} From a3b3666ca03ffb643cb2b0816e050ac2f531e30d Mon Sep 17 00:00:00 2001 From: ayogasekaram Date: Mon, 5 Feb 2024 15:03:40 +0000 Subject: [PATCH 059/126] [skip actions] Bump version to 0.8.16.9073 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 99a8280096..530f7210b3 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9072 +Version: 0.8.16.9073 Date: 2024-02-05 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index f27dc20c7a..6739236bb0 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9072 +# teal.modules.clinical 0.8.16.9073 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 07e1c0c6702eea4614531725756dfdddebc53e4c Mon Sep 17 00:00:00 2001 From: Davide Garolini Date: Mon, 5 Feb 2024 16:32:24 +0100 Subject: [PATCH 060/126] `tm_t_events` review (#1002) Fixes #958 --------- Signed-off-by: Davide Garolini Signed-off-by: Davide Garolini Co-authored-by: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Co-authored-by: 27856297+dependabot-preview[bot]@users.noreply.github.com <27856297+dependabot-preview[bot]@users.noreply.github.com> --- R/argument_convention.R | 7 +++--- R/tm_t_events.R | 29 +++++++++++----------- man/make_barchart_simple_call.Rd | 1 - man/template_a_gee.Rd | 1 - man/template_abnormality.Rd | 1 - man/template_abnormality_by_worst_grade.Rd | 1 - man/template_adverse_events.Rd | 1 - man/template_ancova.Rd | 1 - man/template_arguments.Rd | 7 +++--- man/template_binary_outcome.Rd | 1 - man/template_coxreg_m.Rd | 1 - man/template_coxreg_u.Rd | 1 - man/template_events.Rd | 10 +++++--- man/template_events_by_grade.Rd | 1 - man/template_events_col_by_grade.Rd | 1 - man/template_events_patyear.Rd | 1 - man/template_exposure.Rd | 1 - man/template_fit_mmrm.Rd | 2 -- man/template_forest_tte.Rd | 1 - man/template_g_ci.Rd | 1 - man/template_logistic.Rd | 1 - man/template_mult_events.Rd | 1 - man/template_patient_timeline.Rd | 1 - man/template_shift_by_arm.Rd | 1 - man/template_shift_by_arm_by_worst.Rd | 1 - man/template_shift_by_grade.Rd | 1 - man/template_smq.Rd | 6 ++--- man/template_summary.Rd | 1 - man/template_summary_by.Rd | 1 - man/template_therapy.Rd | 1 - man/template_tte.Rd | 1 - man/template_vitals.Rd | 1 - man/tm_a_gee.Rd | 1 - man/tm_a_mmrm.Rd | 1 - man/tm_g_barchart_simple.Rd | 1 - man/tm_g_ci.Rd | 1 - man/tm_g_forest_tte.Rd | 1 - man/tm_g_pp_adverse_events.Rd | 1 - man/tm_g_pp_patient_timeline.Rd | 1 - man/tm_g_pp_therapy.Rd | 1 - man/tm_g_pp_vitals.Rd | 1 - man/tm_t_abnormality.Rd | 1 - man/tm_t_abnormality_by_worst_grade.Rd | 1 - man/tm_t_ancova.Rd | 1 - man/tm_t_binary_outcome.Rd | 1 - man/tm_t_coxreg.Rd | 1 - man/tm_t_events.Rd | 16 ++++++++---- man/tm_t_events_by_grade.Rd | 1 - man/tm_t_events_patyear.Rd | 1 - man/tm_t_events_summary.Rd | 1 - man/tm_t_exposure.Rd | 1 - man/tm_t_logistic.Rd | 1 - man/tm_t_mult_events.Rd | 1 - man/tm_t_shift_by_arm.Rd | 1 - man/tm_t_shift_by_arm_by_worst.Rd | 1 - man/tm_t_shift_by_grade.Rd | 1 - man/tm_t_smq.Rd | 6 ++--- man/tm_t_summary.Rd | 1 - man/tm_t_summary_by.Rd | 1 - man/tm_t_tte.Rd | 1 - 60 files changed, 44 insertions(+), 91 deletions(-) diff --git a/R/argument_convention.R b/R/argument_convention.R index 08b2de5bda..15fa384e1e 100644 --- a/R/argument_convention.R +++ b/R/argument_convention.R @@ -22,7 +22,6 @@ #' @param basic_table_args optional, (`basic_table_args`)\cr object created by [teal.widgets::basic_table_args()] #' with settings for the module table. The argument is merged with option `teal.basic_table_args` and with default #' module arguments (hard coded in the module body). -#' #' For more details, see the vignette: `vignette("custom-basic-table-arguments", package = "teal.widgets")`. #' @param by_vars (`character`)\cr variable names used to split the summary by rows. #' @param cmdecod (`character`)\cr name of standardized medication name variable. @@ -50,7 +49,6 @@ #' @param ggplot2_args optional, (`ggplot2_args`)\cr object created by [teal.widgets::ggplot2_args()] with settings #' for the module plot. The argument is merged with option `teal.ggplot2_args` and with default module arguments #' (hard coded in the module body). -#' #' For more details, see the vignette: `vignette("custom-ggplot2-arguments", package = "teal.widgets")`. #' @param hlt (`character`)\cr name of the variable with high level term for events. #' @param id_var (`character`)\cr the variable name for subject id. @@ -74,8 +72,9 @@ #' rates between any two columns. #' @param prune_freq (`number`)\cr threshold to use for trimming table using event incidence rate in any column. #' @param ref_arm (`character`)\cr the level of reference arm in case of arm comparison. -#' @param sort_criteria (`character`)\cr criteria to use to sort the table. Default option `freq_desc` sorts by -#' decreasing total number of patients with event. Alternative option `alpha` sorts events alphabetically. +#' @param sort_criteria (`character`)\cr how to sort the final table. Default option `freq_desc` sorts +#' on column `sort_freq_col` by decreasing number of patients with event. Alternative option `alpha` sorts events +#' alphabetically. #' @param strata_var (`character`)\cr names of the variables for stratified analysis. #' @param subgroup_var (`character`)\cr with variable names that can be used as subgroups. #' @param sum_vars (`character`)\cr names of the variables that should be summarized. diff --git a/R/tm_t_events.R b/R/tm_t_events.R index f11a6969ae..c6f93bc623 100644 --- a/R/tm_t_events.R +++ b/R/tm_t_events.R @@ -1,22 +1,17 @@ #' Template: Events by Term #' +#' Creates a valid expression to generate a table of events by term. +#' #' @inheritParams template_arguments -#' @param label_hlt (`string`)\cr label of the `hlt` variable from `dataname`. The label will be extracted from the -#' module. -#' @param label_llt (`string`)\cr label of the `llt` variable from `dataname`. The label will be extracted from the -#' module. -#' @param event_type (`character`)\cr type of event that is summarized (e.g. adverse event, treatment). -#' Default is "event". -#' @param sort_criteria (`character`)\cr how to sort the final table. Default option `freq_desc` sorts -#' on column `sort_freq_col` by decreasing number of patients with event. Alternative option `alpha` sorts events -#' alphabetically. #' @param sort_freq_col (`character`)\cr column to sort by frequency on if `sort_criteria` is set to `freq_desc`. #' @param incl_overall_sum (`flag`)\cr whether two rows which summarize the overall number of adverse events #' should be included at the top of the table. #' +#' @inherit template_arguments return +#' #' @seealso [tm_t_events()] -#' @keywords internal #' +#' @keywords internal template_events <- function(dataname, parentname, arm_var, @@ -459,12 +454,17 @@ template_events <- function(dataname, y } -#' Teal Module: Events by Term +#' teal Module: Events by Term +#' +#' This module produces a table of events by term. #' #' @inheritParams module_arguments #' @inheritParams template_events #' -#' @export +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. +#' +#' @inherit module_arguments return #' #' @examples #' ADSL <- tmc_ex_adsl @@ -501,6 +501,7 @@ template_events <- function(dataname, #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_t_events <- function(label, dataname, parentname = ifelse( @@ -573,7 +574,7 @@ tm_t_events <- function(label, ) } -#' @noRd +#' @keywords internal ui_t_events_byterm <- function(id, ...) { ns <- shiny::NS(id) a <- list(...) @@ -655,7 +656,7 @@ ui_t_events_byterm <- function(id, ...) { ) } -#' @noRd +#' @keywords internal srv_t_events_byterm <- function(id, data, filter_panel_api, diff --git a/man/make_barchart_simple_call.Rd b/man/make_barchart_simple_call.Rd index f80c1f010f..0e0f9edf83 100644 --- a/man/make_barchart_simple_call.Rd +++ b/man/make_barchart_simple_call.Rd @@ -50,7 +50,6 @@ also be drawn as text.} \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} \item{yname}{(\code{character} or \code{NULL})\cr name of the y-axis variable.} diff --git a/man/template_a_gee.Rd b/man/template_a_gee.Rd index ab965b1f46..61cf33a39b 100644 --- a/man/template_a_gee.Rd +++ b/man/template_a_gee.Rd @@ -46,7 +46,6 @@ template_a_gee( \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_abnormality.Rd b/man/template_abnormality.Rd index c5e467b1fe..8bc5beb0a7 100644 --- a/man/template_abnormality.Rd +++ b/man/template_abnormality.Rd @@ -66,7 +66,6 @@ user input for this parameter is ignored.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} \item{tbl_title}{(\code{character})\cr Title with label of variables from by bars} diff --git a/man/template_abnormality_by_worst_grade.Rd b/man/template_abnormality_by_worst_grade.Rd index 6e7786b302..50fdc7c32a 100644 --- a/man/template_abnormality_by_worst_grade.Rd +++ b/man/template_abnormality_by_worst_grade.Rd @@ -56,7 +56,6 @@ user input for this parameter is ignored.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_adverse_events.Rd b/man/template_adverse_events.Rd index 8938245285..3e9da8a3c3 100644 --- a/man/template_adverse_events.Rd +++ b/man/template_adverse_events.Rd @@ -42,7 +42,6 @@ template_adverse_events( \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_ancova.Rd b/man/template_ancova.Rd index bd60001f9e..fad566073c 100644 --- a/man/template_ancova.Rd +++ b/man/template_ancova.Rd @@ -74,7 +74,6 @@ variable levels for studied visits.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_arguments.Rd b/man/template_arguments.Rd index 7ee381a004..5f4925635a 100644 --- a/man/template_arguments.Rd +++ b/man/template_arguments.Rd @@ -27,7 +27,6 @@ \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} \item{by_vars}{(\code{character})\cr variable names used to split the summary by rows.} @@ -72,7 +71,6 @@ is \code{"event"}.} \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} \item{hlt}{(\code{character})\cr name of the variable with high level term for events.} @@ -111,8 +109,9 @@ rates between any two columns.} \item{ref_arm}{(\code{character})\cr the level of reference arm in case of arm comparison.} -\item{sort_criteria}{(\code{character})\cr criteria to use to sort the table. Default option \code{freq_desc} sorts by -decreasing total number of patients with event. Alternative option \code{alpha} sorts events alphabetically.} +\item{sort_criteria}{(\code{character})\cr how to sort the final table. Default option \code{freq_desc} sorts +on column \code{sort_freq_col} by decreasing number of patients with event. Alternative option \code{alpha} sorts events +alphabetically.} \item{strata_var}{(\code{character})\cr names of the variables for stratified analysis.} diff --git a/man/template_binary_outcome.Rd b/man/template_binary_outcome.Rd index 5640d93362..21a048c574 100644 --- a/man/template_binary_outcome.Rd +++ b/man/template_binary_outcome.Rd @@ -68,7 +68,6 @@ default \code{na_level} to apply in all modules, run \code{set_default_na_str("n \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_coxreg_m.Rd b/man/template_coxreg_m.Rd index f36e7c139f..a26523ac8e 100644 --- a/man/template_coxreg_m.Rd +++ b/man/template_coxreg_m.Rd @@ -54,7 +54,6 @@ default \code{na_level} to apply in all modules, run \code{set_default_na_str("n \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_coxreg_u.Rd b/man/template_coxreg_u.Rd index 94b883dc3f..9ec32d6a3b 100644 --- a/man/template_coxreg_u.Rd +++ b/man/template_coxreg_u.Rd @@ -57,7 +57,6 @@ default \code{na_level} to apply in all modules, run \code{set_default_na_str("n \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_events.Rd b/man/template_events.Rd index 2c39368a0d..444a9c5c04 100644 --- a/man/template_events.Rd +++ b/man/template_events.Rd @@ -52,8 +52,8 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{event_type}{(\code{character})\cr type of event that is summarized (e.g. adverse event, treatment). -Default is "event".} +\item{event_type}{(\code{character})\cr type of event that is summarized (e.g. adverse event, treatment). Default +is \code{"event"}.} \item{sort_criteria}{(\code{character})\cr how to sort the final table. Default option \code{freq_desc} sorts on column \code{sort_freq_col} by decreasing number of patients with event. Alternative option \code{alpha} sorts events @@ -77,11 +77,13 @@ should be included at the top of the table.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Template: Events by Term +Creates a valid expression to generate a table of events by term. } \seealso{ \code{\link[=tm_t_events]{tm_t_events()}} diff --git a/man/template_events_by_grade.Rd b/man/template_events_by_grade.Rd index 0ccf59044f..6f8f4d8db8 100644 --- a/man/template_events_by_grade.Rd +++ b/man/template_events_by_grade.Rd @@ -71,7 +71,6 @@ user input for this parameter is ignored.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_events_col_by_grade.Rd b/man/template_events_col_by_grade.Rd index 4b49e35b0d..799d1dfb64 100644 --- a/man/template_events_col_by_grade.Rd +++ b/man/template_events_col_by_grade.Rd @@ -74,7 +74,6 @@ user input for this parameter is ignored.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_events_patyear.Rd b/man/template_events_patyear.Rd index a825ecd513..e761aed965 100644 --- a/man/template_events_patyear.Rd +++ b/man/template_events_patyear.Rd @@ -52,7 +52,6 @@ user input for this parameter is ignored.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_exposure.Rd b/man/template_exposure.Rd index 9da7220808..a6d2eca5d2 100644 --- a/man/template_exposure.Rd +++ b/man/template_exposure.Rd @@ -64,7 +64,6 @@ default \code{na_level} to apply in all modules, run \code{set_default_na_str("n \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_fit_mmrm.Rd b/man/template_fit_mmrm.Rd index 60e9785c6d..a6390ce6b1 100644 --- a/man/template_fit_mmrm.Rd +++ b/man/template_fit_mmrm.Rd @@ -97,7 +97,6 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} \item{lsmeans_plot}{a \code{list} of controls for LS means plot. See more \code{\link[tern.mmrm:g_mmrm_lsmeans]{tern.mmrm::g_mmrm_lsmeans()}}} @@ -107,7 +106,6 @@ For more details, see the vignette: \code{vignette("custom-basic-table-arguments \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } \description{ diff --git a/man/template_forest_tte.Rd b/man/template_forest_tte.Rd index 76c1d5976e..e269b34ec8 100644 --- a/man/template_forest_tte.Rd +++ b/man/template_forest_tte.Rd @@ -53,7 +53,6 @@ to calculate the estimator. If \code{NULL}, the same symbol size is used for all \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_g_ci.Rd b/man/template_g_ci.Rd index e17af1f74e..db7c3acc32 100644 --- a/man/template_g_ci.Rd +++ b/man/template_g_ci.Rd @@ -35,7 +35,6 @@ read.} \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } \description{ diff --git a/man/template_logistic.Rd b/man/template_logistic.Rd index 11aac543eb..9e4db4dfe1 100644 --- a/man/template_logistic.Rd +++ b/man/template_logistic.Rd @@ -55,7 +55,6 @@ arm/treatment variable, set to \code{NULL}.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_mult_events.Rd b/man/template_mult_events.Rd index 7d7b509361..22d9395ee9 100644 --- a/man/template_mult_events.Rd +++ b/man/template_mult_events.Rd @@ -54,7 +54,6 @@ user input for this parameter is ignored.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_patient_timeline.Rd b/man/template_patient_timeline.Rd index a29dd2fced..678de4f1b1 100644 --- a/man/template_patient_timeline.Rd +++ b/man/template_patient_timeline.Rd @@ -54,7 +54,6 @@ template_patient_timeline( \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } \description{ diff --git a/man/template_shift_by_arm.Rd b/man/template_shift_by_arm.Rd index 2ed330c795..4f9ca9bfc7 100644 --- a/man/template_shift_by_arm.Rd +++ b/man/template_shift_by_arm.Rd @@ -60,7 +60,6 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_shift_by_arm_by_worst.Rd b/man/template_shift_by_arm_by_worst.Rd index 8a543c510f..8846564ccd 100644 --- a/man/template_shift_by_arm_by_worst.Rd +++ b/man/template_shift_by_arm_by_worst.Rd @@ -62,7 +62,6 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_shift_by_grade.Rd b/man/template_shift_by_grade.Rd index 3794b17ffc..0c9c5b7f3f 100644 --- a/man/template_shift_by_grade.Rd +++ b/man/template_shift_by_grade.Rd @@ -65,7 +65,6 @@ default \code{na_level} to apply in all modules, run \code{set_default_na_str("n \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_smq.Rd b/man/template_smq.Rd index 6dad50fb30..98cedd5229 100644 --- a/man/template_smq.Rd +++ b/man/template_smq.Rd @@ -35,8 +35,9 @@ template_smq( enabled (see \code{add_total}). Defaults to \code{"All Patients"}. To set a new default \code{total_label} to apply in all modules, run \code{set_default_total_label("new_default")}.} -\item{sort_criteria}{(\code{character})\cr criteria to use to sort the table. Default option \code{freq_desc} sorts by -decreasing total number of patients with event. Alternative option \code{alpha} sorts events alphabetically.} +\item{sort_criteria}{(\code{character})\cr how to sort the final table. Default option \code{freq_desc} sorts +on column \code{sort_freq_col} by decreasing number of patients with event. Alternative option \code{alpha} sorts events +alphabetically.} \item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the @@ -56,7 +57,6 @@ default \code{na_level} to apply in all modules, run \code{set_default_na_str("n \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_summary.Rd b/man/template_summary.Rd index 59a9d6e38f..5cbf845190 100644 --- a/man/template_summary.Rd +++ b/man/template_summary.Rd @@ -64,7 +64,6 @@ user input for this parameter is ignored.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_summary_by.Rd b/man/template_summary_by.Rd index 4fb6a3a2a1..fd91ccab1a 100644 --- a/man/template_summary_by.Rd +++ b/man/template_summary_by.Rd @@ -76,7 +76,6 @@ user input for this parameter is ignored.} \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_therapy.Rd b/man/template_therapy.Rd index f56ccbca6d..cc43be967f 100644 --- a/man/template_therapy.Rd +++ b/man/template_therapy.Rd @@ -51,7 +51,6 @@ template_therapy( \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_tte.Rd b/man/template_tte.Rd index cf4a1593a7..985ed7f4c7 100644 --- a/man/template_tte.Rd +++ b/man/template_tte.Rd @@ -70,7 +70,6 @@ default \code{na_level} to apply in all modules, run \code{set_default_na_str("n \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/template_vitals.Rd b/man/template_vitals.Rd index 8ba724510f..467c31ed79 100644 --- a/man/template_vitals.Rd +++ b/man/template_vitals.Rd @@ -36,7 +36,6 @@ template_vitals( \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } \description{ diff --git a/man/tm_a_gee.Rd b/man/tm_a_gee.Rd index 2ca77dce3d..2c9cb54e54 100644 --- a/man/tm_a_gee.Rd +++ b/man/tm_a_gee.Rd @@ -70,7 +70,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_a_mmrm.Rd b/man/tm_a_mmrm.Rd index f414d9f0af..35d846b5d6 100644 --- a/man/tm_a_mmrm.Rd +++ b/man/tm_a_mmrm.Rd @@ -89,7 +89,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} \item{ggplot2_args}{optional, (\code{ggplot2_args}) \cr diff --git a/man/tm_g_barchart_simple.Rd b/man/tm_g_barchart_simple.Rd index 367dbf98c4..ae6b2756d7 100644 --- a/man/tm_g_barchart_simple.Rd +++ b/man/tm_g_barchart_simple.Rd @@ -46,7 +46,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_g_ci.Rd b/man/tm_g_ci.Rd index 4fcc79c1e4..346fe3afd0 100644 --- a/man/tm_g_ci.Rd +++ b/man/tm_g_ci.Rd @@ -49,7 +49,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } \description{ diff --git a/man/tm_g_forest_tte.Rd b/man/tm_g_forest_tte.Rd index 8b96f14911..70889942ad 100644 --- a/man/tm_g_forest_tte.Rd +++ b/man/tm_g_forest_tte.Rd @@ -89,7 +89,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_g_pp_adverse_events.Rd b/man/tm_g_pp_adverse_events.Rd index e7711c6a0f..d4224ef100 100644 --- a/man/tm_g_pp_adverse_events.Rd +++ b/man/tm_g_pp_adverse_events.Rd @@ -71,7 +71,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_g_pp_patient_timeline.Rd b/man/tm_g_pp_patient_timeline.Rd index 6f4d0294fd..ab1a93b4b4 100644 --- a/man/tm_g_pp_patient_timeline.Rd +++ b/man/tm_g_pp_patient_timeline.Rd @@ -86,7 +86,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } \description{ diff --git a/man/tm_g_pp_therapy.Rd b/man/tm_g_pp_therapy.Rd index 807555e2be..fcd4cdca3d 100644 --- a/man/tm_g_pp_therapy.Rd +++ b/man/tm_g_pp_therapy.Rd @@ -83,7 +83,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_g_pp_vitals.Rd b/man/tm_g_pp_vitals.Rd index 685be0bbd0..9d62c2433d 100644 --- a/man/tm_g_pp_vitals.Rd +++ b/man/tm_g_pp_vitals.Rd @@ -58,7 +58,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } \description{ diff --git a/man/tm_t_abnormality.Rd b/man/tm_t_abnormality.Rd index d29efc686b..9a83c43f2a 100644 --- a/man/tm_t_abnormality.Rd +++ b/man/tm_t_abnormality.Rd @@ -90,7 +90,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \description{ diff --git a/man/tm_t_abnormality_by_worst_grade.Rd b/man/tm_t_abnormality_by_worst_grade.Rd index 1629964f29..080bda45d8 100644 --- a/man/tm_t_abnormality_by_worst_grade.Rd +++ b/man/tm_t_abnormality_by_worst_grade.Rd @@ -84,7 +84,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_t_ancova.Rd b/man/tm_t_ancova.Rd index 91e2ba551b..f489acfef6 100644 --- a/man/tm_t_ancova.Rd +++ b/man/tm_t_ancova.Rd @@ -77,7 +77,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_t_binary_outcome.Rd b/man/tm_t_binary_outcome.Rd index 3c50db5916..2a6058608e 100644 --- a/man/tm_t_binary_outcome.Rd +++ b/man/tm_t_binary_outcome.Rd @@ -88,7 +88,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_t_coxreg.Rd b/man/tm_t_coxreg.Rd index cb8e1b5913..d57634c756 100644 --- a/man/tm_t_coxreg.Rd +++ b/man/tm_t_coxreg.Rd @@ -80,7 +80,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_t_events.Rd b/man/tm_t_events.Rd index b5f60714aa..5ba3cfc485 100644 --- a/man/tm_t_events.Rd +++ b/man/tm_t_events.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_events.R \name{tm_t_events} \alias{tm_t_events} -\title{Teal Module: Events by Term} +\title{teal Module: Events by Term} \usage{ tm_t_events( label, @@ -56,8 +56,8 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{event_type}{(\code{character})\cr type of event that is summarized (e.g. adverse event, treatment). -Default is "event".} +\item{event_type}{(\code{character})\cr type of event that is summarized (e.g. adverse event, treatment). Default +is \code{"event"}.} \item{sort_criteria}{(\code{character})\cr how to sort the final table. Default option \code{freq_desc} sorts on column \code{sort_freq_col} by decreasing number of patients with event. Alternative option \code{alpha} sorts events @@ -87,11 +87,13 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -Teal Module: Events by Term +This module produces a table of events by term. } \examples{ ADSL <- tmc_ex_adsl @@ -129,3 +131,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} diff --git a/man/tm_t_events_by_grade.Rd b/man/tm_t_events_by_grade.Rd index 730c71f05e..872c6a70fe 100644 --- a/man/tm_t_events_by_grade.Rd +++ b/man/tm_t_events_by_grade.Rd @@ -81,7 +81,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_t_events_patyear.Rd b/man/tm_t_events_patyear.Rd index 1b09003217..ec3e532337 100644 --- a/man/tm_t_events_patyear.Rd +++ b/man/tm_t_events_patyear.Rd @@ -79,7 +79,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_t_events_summary.Rd b/man/tm_t_events_summary.Rd index c6d2c3ed91..4de65b7f93 100644 --- a/man/tm_t_events_summary.Rd +++ b/man/tm_t_events_summary.Rd @@ -97,7 +97,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_t_exposure.Rd b/man/tm_t_exposure.Rd index fd58f46236..2abab08d69 100644 --- a/man/tm_t_exposure.Rd +++ b/man/tm_t_exposure.Rd @@ -90,7 +90,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_t_logistic.Rd b/man/tm_t_logistic.Rd index 2972a2974a..4d65ef3b53 100644 --- a/man/tm_t_logistic.Rd +++ b/man/tm_t_logistic.Rd @@ -62,7 +62,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_t_mult_events.Rd b/man/tm_t_mult_events.Rd index b00c6db342..c16bb7a3d7 100644 --- a/man/tm_t_mult_events.Rd +++ b/man/tm_t_mult_events.Rd @@ -73,7 +73,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_t_shift_by_arm.Rd b/man/tm_t_shift_by_arm.Rd index 159dbe5d63..af1f4610f1 100644 --- a/man/tm_t_shift_by_arm.Rd +++ b/man/tm_t_shift_by_arm.Rd @@ -83,7 +83,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_t_shift_by_arm_by_worst.Rd b/man/tm_t_shift_by_arm_by_worst.Rd index 656e164dd7..31edf60d65 100644 --- a/man/tm_t_shift_by_arm_by_worst.Rd +++ b/man/tm_t_shift_by_arm_by_worst.Rd @@ -84,7 +84,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_t_shift_by_grade.Rd b/man/tm_t_shift_by_grade.Rd index b2cfa449df..7ed57eb6cc 100644 --- a/man/tm_t_shift_by_grade.Rd +++ b/man/tm_t_shift_by_grade.Rd @@ -98,7 +98,6 @@ default \code{na_level} to apply in all modules, run \code{set_default_na_str("n \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_t_smq.Rd b/man/tm_t_smq.Rd index b57fd424ac..19912d23fe 100644 --- a/man/tm_t_smq.Rd +++ b/man/tm_t_smq.Rd @@ -51,8 +51,9 @@ with low level term for events.} enabled (see \code{add_total}). Defaults to \code{"All Patients"}. To set a new default \code{total_label} to apply in all modules, run \code{set_default_total_label("new_default")}.} -\item{sort_criteria}{(\code{character})\cr criteria to use to sort the table. Default option \code{freq_desc} sorts by -decreasing total number of patients with event. Alternative option \code{alpha} sorts events alphabetically.} +\item{sort_criteria}{(\code{character})\cr how to sort the final table. Default option \code{freq_desc} sorts +on column \code{sort_freq_col} by decreasing number of patients with event. Alternative option \code{alpha} sorts events +alphabetically.} \item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the @@ -80,7 +81,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_t_summary.Rd b/man/tm_t_summary.Rd index 46f27b3ce2..8e82e6f10e 100644 --- a/man/tm_t_summary.Rd +++ b/man/tm_t_summary.Rd @@ -74,7 +74,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_t_summary_by.Rd b/man/tm_t_summary_by.Rd index 66e6eb81c0..a43c46e2e1 100644 --- a/man/tm_t_summary_by.Rd +++ b/man/tm_t_summary_by.Rd @@ -97,7 +97,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ diff --git a/man/tm_t_tte.Rd b/man/tm_t_tte.Rd index 80f00068e6..a33071694c 100644 --- a/man/tm_t_tte.Rd +++ b/man/tm_t_tte.Rd @@ -99,7 +99,6 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{basic_table_args}{optional, (\code{basic_table_args})\cr object created by \code{\link[teal.widgets:basic_table_args]{teal.widgets::basic_table_args()}} with settings for the module table. The argument is merged with option \code{teal.basic_table_args} and with default module arguments (hard coded in the module body). - For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } \value{ From 59bc08c4e30219fcdadde2a6e40bf248405798d7 Mon Sep 17 00:00:00 2001 From: Melkiades Date: Mon, 5 Feb 2024 15:33:19 +0000 Subject: [PATCH 061/126] [skip actions] Bump version to 0.8.16.9074 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 530f7210b3..16ac232b9a 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9073 +Version: 0.8.16.9074 Date: 2024-02-05 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 6739236bb0..07ee8b7fb3 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9073 +# teal.modules.clinical 0.8.16.9074 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 57f9c0b56280f12d4e09f596ad2d17f443d17a00 Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Mon, 5 Feb 2024 10:47:12 -0500 Subject: [PATCH 062/126] Clean up documentation for `tm_t_pp_laboratory` (#1036) Fixes #971 --- R/argument_convention.R | 9 +++-- R/tm_a_gee.R | 5 +-- R/tm_g_barchart_simple.R | 5 +-- R/tm_g_forest_rsp.R | 5 +-- R/tm_g_forest_tte.R | 5 +-- R/tm_g_ipp.R | 5 +-- R/tm_g_km.R | 5 +-- R/tm_g_lineplot.R | 5 +-- R/tm_t_abnormality.R | 11 ++--- R/tm_t_abnormality_by_worst_grade.R | 6 +-- R/tm_t_ancova.R | 30 ++++++-------- R/tm_t_binary_outcome.R | 5 +-- R/tm_t_coxreg.R | 5 +-- R/tm_t_events.R | 5 +-- R/tm_t_events_by_grade.R | 5 +-- R/tm_t_events_patyear.R | 5 +-- R/tm_t_events_summary.R | 5 +-- R/tm_t_exposure.R | 5 +-- R/tm_t_logistic.R | 5 +-- R/tm_t_mult_events.R | 5 +-- R/tm_t_pp_laboratory.R | 47 +++++++++++----------- R/tm_t_shift_by_arm.R | 5 +-- R/tm_t_shift_by_grade.R | 5 +-- R/tm_t_smq.R | 5 +-- R/tm_t_summary.R | 5 +-- R/tm_t_summary_by.R | 5 +-- R/tm_t_tte.R | 5 +-- man/module_arguments.Rd | 8 +++- man/template_abnormality_by_worst_grade.Rd | 2 +- man/template_arguments.Rd | 2 +- man/template_coxreg_m.Rd | 2 +- man/template_coxreg_u.Rd | 2 +- man/template_exposure.Rd | 2 +- man/template_fit_mmrm.Rd | 2 +- man/template_g_ipp.Rd | 2 +- man/template_laboratory.Rd | 15 ++++--- man/template_shift_by_arm.Rd | 2 +- man/template_shift_by_arm_by_worst.Rd | 2 +- man/template_shift_by_grade.Rd | 2 +- man/tm_a_gee.Rd | 4 +- man/tm_a_mmrm.Rd | 4 +- man/tm_g_forest_rsp.Rd | 4 +- man/tm_g_forest_tte.Rd | 4 +- man/tm_g_ipp.Rd | 4 +- man/tm_g_km.Rd | 4 +- man/tm_g_lineplot.Rd | 4 +- man/tm_t_abnormality.Rd | 5 ++- man/tm_t_abnormality_by_worst_grade.Rd | 6 +-- man/tm_t_ancova.Rd | 25 +++++------- man/tm_t_binary_outcome.Rd | 4 +- man/tm_t_coxreg.Rd | 4 +- man/tm_t_events_patyear.Rd | 4 +- man/tm_t_exposure.Rd | 4 +- man/tm_t_logistic.Rd | 4 +- man/tm_t_pp_laboratory.Rd | 34 +++++++++------- man/tm_t_shift_by_arm.Rd | 4 +- man/tm_t_shift_by_arm_by_worst.Rd | 4 +- man/tm_t_shift_by_grade.Rd | 4 +- man/tm_t_summary_by.Rd | 4 +- man/tm_t_tte.Rd | 4 +- 60 files changed, 165 insertions(+), 229 deletions(-) diff --git a/R/argument_convention.R b/R/argument_convention.R index 15fa384e1e..d28219bd25 100644 --- a/R/argument_convention.R +++ b/R/argument_convention.R @@ -65,7 +65,7 @@ #' @param na.rm (`logical`)\cr whether `NA` values should be removed prior to analysis. #' @param numeric_stats (`character`)\cr names of statistics to display for numeric summary variables. Available #' statistics are `n`, `mean_sd`, `mean_ci`, `median`, `median_ci`, `quantiles`, `range`, and `geom_mean`. -#' @param paramcd (`character`)\cr variable value designating the studied parameter. +#' @param paramcd (`character`)\cr name of the parameter code variable. #' @param parentname (`character`)\cr parent analysis data used in teal module, usually this refers to `ADSL`. #' @param patient_id (`character`)\cr patient ID. #' @param prune_diff (`number`)\cr threshold to use for trimming table using as criteria difference in @@ -171,8 +171,8 @@ NULL #' @param label (`character`)\cr menu item label of the module in the teal app. #' @param llt ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr name of the variable #' with low level term for events. -#' @param paramcd ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr variable value -#' designating the studied parameter. +#' @param paramcd ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the parameter code variable from `dataname`. #' @param parentname (`character`)\cr parent analysis data used in teal module, usually this refers to `ADSL`. #' @param patient_col (`character`)\cr name of patient ID variable. #' @param plot_height optional, (`numeric`)\cr a vector of length three with `c(value, min, max)`. Specifies the @@ -208,6 +208,9 @@ NULL #' #' @return a `teal_module` object. #' +#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example +#' apps implementing this module can be found. +#' #' @name module_arguments #' @keywords internal NULL diff --git a/R/tm_a_gee.R b/R/tm_a_gee.R index dc6c77d7cf..4b79cb98d1 100644 --- a/R/tm_a_gee.R +++ b/R/tm_a_gee.R @@ -134,10 +134,7 @@ template_a_gee <- function(output_table, #' @inheritParams template_arguments #' @inheritParams template_a_gee #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' data <- teal_data() diff --git a/R/tm_g_barchart_simple.R b/R/tm_g_barchart_simple.R index fb54aa21c7..b1ec53189f 100644 --- a/R/tm_g_barchart_simple.R +++ b/R/tm_g_barchart_simple.R @@ -13,10 +13,7 @@ #' @param y_facet (`data_extract_spec`)\cr column-wise faceting groups. #' @param plot_options (`list`)\cr list of plot options. #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' library(nestcolor) diff --git a/R/tm_g_forest_rsp.R b/R/tm_g_forest_rsp.R index 9e99a8a775..22fb258b89 100644 --- a/R/tm_g_forest_rsp.R +++ b/R/tm_g_forest_rsp.R @@ -198,10 +198,7 @@ template_forest_rsp <- function(dataname = "ANL", #' @inheritParams module_arguments #' @inheritParams template_forest_rsp #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' library(nestcolor) diff --git a/R/tm_g_forest_tte.R b/R/tm_g_forest_tte.R index aeddfa9b7b..f3105204f4 100644 --- a/R/tm_g_forest_tte.R +++ b/R/tm_g_forest_tte.R @@ -206,10 +206,7 @@ template_forest_tte <- function(dataname = "ANL", #' @inheritParams module_arguments #' @inheritParams template_forest_tte #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' library(nestcolor) diff --git a/R/tm_g_ipp.R b/R/tm_g_ipp.R index 61d3cc8516..ff7083e7f1 100644 --- a/R/tm_g_ipp.R +++ b/R/tm_g_ipp.R @@ -179,10 +179,7 @@ template_g_ipp <- function(dataname = "ANL", #' @param arm_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with #' all available choices and preselected option for variable values that can be used as arm variable. #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' library(nestcolor) diff --git a/R/tm_g_km.R b/R/tm_g_km.R index 401c5c1c1d..a0773aa28b 100644 --- a/R/tm_g_km.R +++ b/R/tm_g_km.R @@ -242,10 +242,7 @@ template_g_km <- function(dataname = "ANL", #' @param facet_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with #' all available choices and preselected option for names of variable that can be used for plot faceting. #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' library(nestcolor) diff --git a/R/tm_g_lineplot.R b/R/tm_g_lineplot.R index d24badad1b..6c6ca9ccad 100644 --- a/R/tm_g_lineplot.R +++ b/R/tm_g_lineplot.R @@ -204,10 +204,7 @@ template_g_lineplot <- function(dataname = "ANL", #' @inheritParams module_arguments #' @inheritParams template_g_lineplot #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' library(nestcolor) diff --git a/R/tm_t_abnormality.R b/R/tm_t_abnormality.R index ad90bd5ab2..f06c0fd285 100644 --- a/R/tm_t_abnormality.R +++ b/R/tm_t_abnormality.R @@ -224,7 +224,6 @@ template_abnormality <- function(parentname, y } - #' teal Module: Abnormality Summary Table #' #' This module produces a table to summarize abnormality. @@ -239,13 +238,10 @@ template_abnormality <- function(parentname, #' variable for baseline abnormality grade. #' @param na_level (`character`)\cr the NA level in the input dataset, default to `""`. #' -#' @note Patients with the same abnormality at baseline as on the treatment visit can be -#' excluded in accordance with `GDSR` specifications by using `exclude_base_abn`. -#' -#' @export +#' @inherit module_arguments return seealso #' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @note Patients with the same abnormality at baseline as on the treatment visit can be +#' excluded in accordance with GDSR specifications by using `exclude_base_abn`. #' #' @examples #' data <- teal_data() @@ -297,6 +293,7 @@ template_abnormality <- function(parentname, #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_t_abnormality <- function(label, dataname, parentname = ifelse( diff --git a/R/tm_t_abnormality_by_worst_grade.R b/R/tm_t_abnormality_by_worst_grade.R index 41d3e2b260..33e2116319 100644 --- a/R/tm_t_abnormality_by_worst_grade.R +++ b/R/tm_t_abnormality_by_worst_grade.R @@ -248,11 +248,7 @@ template_abnormality_by_worst_grade <- function(parentname, # nolint #' @param worst_flag_indicator ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr #' value indicating worst grade. #' -#' @inherit module_arguments return -#' -#' @seealso [template_abnormality_by_worst_grade()] -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @export #' diff --git a/R/tm_t_ancova.R b/R/tm_t_ancova.R index e67415dccd..d7d31550a7 100644 --- a/R/tm_t_ancova.R +++ b/R/tm_t_ancova.R @@ -1,7 +1,7 @@ #' Template: ANCOVA Summary #' #' Creates a valid expression to generate an analysis of variance summary table. - +#' #' @inheritParams template_arguments #' @param paramcd_levels (`character`)\cr #' variable levels for the studied parameter. @@ -418,30 +418,25 @@ template_ancova <- function(dataname = "ANL", #' teal Module: ANCOVA Summary #' -#' This module produces a table to summarize analysis of variance. +#' This module produces a table to summarize analysis of variance, consistent with the TLG Catalog +#' template for `AOVT01` available [here]( +#' https://insightsengineering.github.io/tlg-catalog/stable/tables/efficacy/aovt01.html) when multiple +#' endpoints are selected. #' #' @inheritParams module_arguments #' @inheritParams template_ancova #' #' @inherit module_arguments return #' -#' @details This module produces an analysis of variance summary table that is -#' similar to `AOVT01` when multiple endpoints are selected. -#' When a single endpoint is selected, both unadjusted and adjusted comparison -#' would be provided. This modules expects that the analysis data has the -#' following variables: -#' -#' \tabular{ll}{ -#' `AVISIT` \tab variable used to filter for analysis visits.\cr -#' `PARAMCD` \tab variable used to filter for endpoints, after filtering for -#' `paramcd` and `avisit`, one observation per patient is expected for the analysis -#' to be meaningful. -#' } +#' @details +#' When a single endpoint is selected, both unadjusted and adjusted comparison are provided. This modules +#' expects that the analysis data has the following variables: #' -#' @export +#' * `AVISIT`: variable used to filter for analysis visits. +#' * `PARAMCD`: variable used to filter for endpoints, after filtering for `paramcd` and `avisit`, one +#' observation per patient is expected for the analysis to be meaningful. #' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' ADSL <- tmc_ex_adsl @@ -503,6 +498,7 @@ template_ancova <- function(dataname = "ANL", #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_t_ancova <- function(label, dataname, parentname = ifelse( diff --git a/R/tm_t_binary_outcome.R b/R/tm_t_binary_outcome.R index 0aef5c9ae6..7266dcf56e 100644 --- a/R/tm_t_binary_outcome.R +++ b/R/tm_t_binary_outcome.R @@ -342,10 +342,7 @@ template_binary_outcome <- function(dataname, #' #' * Reference arms are automatically combined if multiple arms selected as reference group. #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' ADSL <- tmc_ex_adsl diff --git a/R/tm_t_coxreg.R b/R/tm_t_coxreg.R index 834af3c82b..d06dd264a5 100644 --- a/R/tm_t_coxreg.R +++ b/R/tm_t_coxreg.R @@ -359,10 +359,7 @@ template_coxreg_m <- function(dataname, #' test will be substituted in these cases. #' * Multi-variable is the default choice for backward compatibility. #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' ## First example diff --git a/R/tm_t_events.R b/R/tm_t_events.R index c6f93bc623..bf82ddda98 100644 --- a/R/tm_t_events.R +++ b/R/tm_t_events.R @@ -461,10 +461,7 @@ template_events <- function(dataname, #' @inheritParams module_arguments #' @inheritParams template_events #' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. -#' -#' @inherit module_arguments return +#' @inherit module_arguments return seealso #' #' @examples #' ADSL <- tmc_ex_adsl diff --git a/R/tm_t_events_by_grade.R b/R/tm_t_events_by_grade.R index 884d7c0e74..2a3470d71e 100644 --- a/R/tm_t_events_by_grade.R +++ b/R/tm_t_events_by_grade.R @@ -796,10 +796,7 @@ template_events_col_by_grade <- function(dataname, #' @param col_by_grade (`logical`)\cr whether to display the grading groups in nested columns. #' @param grading_groups (`list`)\cr named list of grading groups used when `col_by_grade = TRUE`. #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @export #' @examples diff --git a/R/tm_t_events_patyear.R b/R/tm_t_events_patyear.R index e3e04db2cf..9765a93034 100644 --- a/R/tm_t_events_patyear.R +++ b/R/tm_t_events_patyear.R @@ -155,10 +155,7 @@ template_events_patyear <- function(dataname, #' @param events_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with #' all available choices and preselected option for the variable with all event counts. #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' ADSL <- tmc_ex_adsl diff --git a/R/tm_t_events_summary.R b/R/tm_t_events_summary.R index 227e879a1d..1753bc3fae 100644 --- a/R/tm_t_events_summary.R +++ b/R/tm_t_events_summary.R @@ -501,10 +501,7 @@ template_events_summary <- function(anl_name, #' @param aeseq_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr variable for #' adverse events sequence number from `dataset`. Used for counting total number of events. #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' data <- teal_data() diff --git a/R/tm_t_exposure.R b/R/tm_t_exposure.R index b63db16ae3..88f48f694a 100644 --- a/R/tm_t_exposure.R +++ b/R/tm_t_exposure.R @@ -227,10 +227,7 @@ template_exposure <- function(parentname, #' @param paramcd_label (`character`)\cr the column from the dataset where the value will be used to #' label the argument `paramcd`. #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' data <- teal_data() diff --git a/R/tm_t_logistic.R b/R/tm_t_logistic.R index 78a30b7d6e..ffdbc0790b 100644 --- a/R/tm_t_logistic.R +++ b/R/tm_t_logistic.R @@ -224,10 +224,7 @@ template_logistic <- function(dataname, #' @param avalc_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all #' available choices and preselected option for the analysis variable (categorical). #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' ADSL <- tmc_ex_adsl diff --git a/R/tm_t_mult_events.R b/R/tm_t_mult_events.R index 37f265d7d4..14573f9eb3 100644 --- a/R/tm_t_mult_events.R +++ b/R/tm_t_mult_events.R @@ -284,10 +284,7 @@ template_mult_events <- function(dataname, #' all available choices and preselected option for variable names that can be used as analysis sequence number #' variable. Used for counting the unique number of events. #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' ADSL <- tmc_ex_adsl diff --git a/R/tm_t_pp_laboratory.R b/R/tm_t_pp_laboratory.R index 73d60d408c..55be709978 100644 --- a/R/tm_t_pp_laboratory.R +++ b/R/tm_t_pp_laboratory.R @@ -1,16 +1,19 @@ -#' Template: Laboratory +#' Template: Patient Profile Laboratory Table +#' +#' Creates a valid expression to generate a patient profile laboratory table using ADaM datasets. #' -#' Creates a laboratory template. #' @inheritParams template_arguments #' @param paramcd (`character`)\cr name of the parameter code variable. #' @param param (`character`)\cr name of the parameter variable. -#' @param timepoints (`character`)\cr name of time variable used for -#' the laboratory table. +#' @param timepoints (`character`)\cr name of time variable. #' @param anrind (`character`)\cr name of the analysis reference range indicator variable. -#' @param patient_id (`character`)\cr patient ID. -#' @param round_value (`numeric`)\cr number of decimal places to be used when rounding. -#' @keywords internal +#' @param round_value (`numeric`)\cr number of decimal places to round to. +#' +#' @inherit template_arguments return #' +#' @seealso [tm_t_pp_laboratory()] +#' +#' @keywords internal template_laboratory <- function(dataname = "ANL", paramcd = "PARAMCD", param = "PARAM", @@ -128,28 +131,21 @@ template_laboratory <- function(dataname = "ANL", y } -#' Teal Module: Patient Profile Laboratory Teal Module +#' teal Module: Patient Profile Laboratory Table #' -#' This teal module produces a patient profile laboratory table using `ADaM` datasets. +#' This module produces a patient profile laboratory table using ADaM datasets. #' #' @inheritParams module_arguments #' @inheritParams template_laboratory -#' @param patient_col (`character`)\cr patient ID column to be used. -#' @param paramcd ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `PARAMCD` column of the `ADLB` dataset. -#' @param param ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `PARAM` column of the `ADLB` dataset. -#' @param timepoints ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' Time variable to be represented in the laboratory table. -#' @param anrind ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `ANRIND` column of the `ADLB` dataset with 3 possible levels "HIGH", "LOW" and "NORMAL". -#' @param aval_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `AVAL` column of the `ADLB` dataset. -#' @param avalu_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `AVALU` column of the `ADLB` dataset. -#' @inheritParams module_arguments +#' @param param ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `PARAM` variable from `dataname`. +#' @param timepoints ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the time variable from `dataname`. +#' @param anrind ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `ANRIND` variable from `dataname`. Variable should have the +#' following 3 levels: `"HIGH"`, `"LOW"`, and `"NORMAL"`. #' -#' @export +#' @inherit module_arguments return #' #' @examples #' ADSL <- tmc_ex_adsl @@ -200,6 +196,7 @@ template_laboratory <- function(dataname = "ANL", #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_t_pp_laboratory <- function(label, dataname = "ADLB", parentname = "ADSL", @@ -272,6 +269,7 @@ tm_t_pp_laboratory <- function(label, ) } +#' @keywords internal ui_g_laboratory <- function(id, ...) { ui_args <- list(...) is_single_dataset_value <- teal.transform::is_single_dataset( @@ -352,6 +350,7 @@ ui_g_laboratory <- function(id, ...) { ) } +#' @keywords internal srv_g_laboratory <- function(id, data, reporter, diff --git a/R/tm_t_shift_by_arm.R b/R/tm_t_shift_by_arm.R index 6135a6d619..674039ab3e 100644 --- a/R/tm_t_shift_by_arm.R +++ b/R/tm_t_shift_by_arm.R @@ -185,10 +185,7 @@ template_shift_by_arm <- function(dataname, #' @inheritParams module_arguments #' @inheritParams template_shift_by_arm #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' ADSL <- tmc_ex_adsl diff --git a/R/tm_t_shift_by_grade.R b/R/tm_t_shift_by_grade.R index 261446e1f1..ffceeec190 100644 --- a/R/tm_t_shift_by_grade.R +++ b/R/tm_t_shift_by_grade.R @@ -473,10 +473,7 @@ template_shift_by_grade <- function(parentname, #' @param base_toxgrade_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr #' variable for baseline toxicity grade. #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' ADSL <- tmc_ex_adsl diff --git a/R/tm_t_smq.R b/R/tm_t_smq.R index 91c68a6fbe..98bdf7f132 100644 --- a/R/tm_t_smq.R +++ b/R/tm_t_smq.R @@ -315,10 +315,7 @@ template_smq <- function(dataname, #' @param scopes ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all #' available choices for the scopes of standardized queries. #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' data <- teal_data() diff --git a/R/tm_t_summary.R b/R/tm_t_summary.R index 3c9e3bf320..4998fb0815 100644 --- a/R/tm_t_summary.R +++ b/R/tm_t_summary.R @@ -200,10 +200,7 @@ template_summary <- function(dataname, #' @inheritParams module_arguments #' @inheritParams template_summary #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' # Preparation of the test case - use `EOSDY` and `DCSREAS` variables to demonstrate missing data. diff --git a/R/tm_t_summary_by.R b/R/tm_t_summary_by.R index 7f82a2b7d9..84e0fceda9 100644 --- a/R/tm_t_summary_by.R +++ b/R/tm_t_summary_by.R @@ -320,10 +320,7 @@ template_summary_by <- function(parentname, #' @inheritParams module_arguments #' @inheritParams template_summary_by #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' ADSL <- tmc_ex_adsl diff --git a/R/tm_t_tte.R b/R/tm_t_tte.R index 77fbb12a54..86275e2e42 100644 --- a/R/tm_t_tte.R +++ b/R/tm_t_tte.R @@ -401,10 +401,7 @@ template_tte <- function(dataname = "ANL", #' * `PARAMCD`: variable used to filter for endpoint (e.g. OS). After #' filtering for `PARAMCD` one observation per patient is expected #' -#' @inherit module_arguments return -#' -#' @seealso The [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example -#' apps implementing this module can be found. +#' @inherit module_arguments return seealso #' #' @examples #' ADSL <- tmc_ex_adsl diff --git a/man/module_arguments.Rd b/man/module_arguments.Rd index 6457df04de..cc1bb866c0 100644 --- a/man/module_arguments.Rd +++ b/man/module_arguments.Rd @@ -84,8 +84,8 @@ needed, the default option is \code{FALSE}.} \item{llt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable with low level term for events.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value -designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} @@ -155,4 +155,8 @@ excluded to reduce duplication as each module function inherits parameters from function. } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} \keyword{internal} diff --git a/man/template_abnormality_by_worst_grade.Rd b/man/template_abnormality_by_worst_grade.Rd index 50fdc7c32a..05ae0e91a3 100644 --- a/man/template_abnormality_by_worst_grade.Rd +++ b/man/template_abnormality_by_worst_grade.Rd @@ -29,7 +29,7 @@ template_abnormality_by_worst_grade( \item{id_var}{(\code{character})\cr the variable name for subject id.} -\item{paramcd}{(\code{character})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{character})\cr name of the parameter code variable.} \item{atoxgr_var}{(\code{character})\cr name of the variable indicating Analysis Toxicity Grade.} diff --git a/man/template_arguments.Rd b/man/template_arguments.Rd index 5f4925635a..6479d79a07 100644 --- a/man/template_arguments.Rd +++ b/man/template_arguments.Rd @@ -96,7 +96,7 @@ default \code{na_level} to apply in all modules, run \code{set_default_na_str("n \item{numeric_stats}{(\code{character})\cr names of statistics to display for numeric summary variables. Available statistics are \code{n}, \code{mean_sd}, \code{mean_ci}, \code{median}, \code{median_ci}, \code{quantiles}, \code{range}, and \code{geom_mean}.} -\item{paramcd}{(\code{character})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{character})\cr name of the parameter code variable.} \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} diff --git a/man/template_coxreg_m.Rd b/man/template_coxreg_m.Rd index a26523ac8e..692bb7d7b6 100644 --- a/man/template_coxreg_m.Rd +++ b/man/template_coxreg_m.Rd @@ -36,7 +36,7 @@ template_coxreg_m( \item{comp_arm}{(\code{character})\cr the level of comparison arm in case of arm comparison.} -\item{paramcd}{(\code{character})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{character})\cr name of the parameter code variable.} \item{at}{(\code{list} of \code{numeric})\cr when the candidate covariate is a \code{numeric} type variable, use \code{at} to specify the value of the covariate at which the effect should be estimated.} diff --git a/man/template_coxreg_u.Rd b/man/template_coxreg_u.Rd index 9ec32d6a3b..ad35234222 100644 --- a/man/template_coxreg_u.Rd +++ b/man/template_coxreg_u.Rd @@ -37,7 +37,7 @@ template_coxreg_u( \item{comp_arm}{(\code{character})\cr the level of comparison arm in case of arm comparison.} -\item{paramcd}{(\code{character})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{character})\cr name of the parameter code variable.} \item{at}{(\code{list} of \code{numeric})\cr when the candidate covariate is a \code{numeric} type variable, use \code{at} to specify the value of the covariate at which the effect should be estimated.} diff --git a/man/template_exposure.Rd b/man/template_exposure.Rd index a6d2eca5d2..c8abaa8659 100644 --- a/man/template_exposure.Rd +++ b/man/template_exposure.Rd @@ -30,7 +30,7 @@ template_exposure( \item{id_var}{(\code{character})\cr the variable name for subject id.} -\item{paramcd}{(\code{character})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{character})\cr name of the parameter code variable.} \item{paramcd_label}{(\code{character})\cr the column from the \code{dataname} dataset where the value will be used to label the argument \code{paramcd}.} diff --git a/man/template_fit_mmrm.Rd b/man/template_fit_mmrm.Rd index a6390ce6b1..bd4988c39e 100644 --- a/man/template_fit_mmrm.Rd +++ b/man/template_fit_mmrm.Rd @@ -82,7 +82,7 @@ machine (not default).} \item{fit_name}{name of fitted \code{MMRM} object} -\item{paramcd}{(\code{character})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{character})\cr name of the parameter code variable.} \item{show_relative}{should the "reduction" (\code{control - treatment}, default) or the "increase" (\code{treatment - control}) be shown for the relative change from baseline} diff --git a/man/template_g_ipp.Rd b/man/template_g_ipp.Rd index 0665e8f394..4abfb28cd1 100644 --- a/man/template_g_ipp.Rd +++ b/man/template_g_ipp.Rd @@ -27,7 +27,7 @@ template_g_ipp( \arguments{ \item{dataname}{(\code{character})\cr analysis data used in teal module.} -\item{paramcd}{(\code{character})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{character})\cr name of the parameter code variable.} \item{arm_var}{(\code{character})\cr variable names that can be used as \code{arm_var}.} diff --git a/man/template_laboratory.Rd b/man/template_laboratory.Rd index 4808103914..3c144d4eac 100644 --- a/man/template_laboratory.Rd +++ b/man/template_laboratory.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_pp_laboratory.R \name{template_laboratory} \alias{template_laboratory} -\title{Template: Laboratory} +\title{Template: Patient Profile Laboratory Table} \usage{ template_laboratory( dataname = "ANL", @@ -27,8 +27,7 @@ template_laboratory( \item{anrind}{(\code{character})\cr name of the analysis reference range indicator variable.} -\item{timepoints}{(\code{character})\cr name of time variable used for -the laboratory table.} +\item{timepoints}{(\code{character})\cr name of time variable.} \item{aval}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Please use the \code{aval_var} argument instead.} @@ -40,9 +39,15 @@ the laboratory table.} \item{patient_id}{(\code{character})\cr patient ID.} -\item{round_value}{(\code{numeric})\cr number of decimal places to be used when rounding.} +\item{round_value}{(\code{numeric})\cr number of decimal places to round to.} +} +\value{ +a \code{list} of expressions to generate a table or plot object. } \description{ -Creates a laboratory template. +Creates a valid expression to generate a patient profile laboratory table using ADaM datasets. +} +\seealso{ +\code{\link[=tm_t_pp_laboratory]{tm_t_pp_laboratory()}} } \keyword{internal} diff --git a/man/template_shift_by_arm.Rd b/man/template_shift_by_arm.Rd index 4f9ca9bfc7..eac11d1295 100644 --- a/man/template_shift_by_arm.Rd +++ b/man/template_shift_by_arm.Rd @@ -29,7 +29,7 @@ template_shift_by_arm( \item{arm_var}{(\code{character})\cr variable names that can be used as \code{arm_var}.} -\item{paramcd}{(\code{character})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{character})\cr name of the parameter code variable.} \item{visit_var}{(\code{character})\cr variable names that can be used as \code{visit} variable. Must be a factor in \code{dataname}.} diff --git a/man/template_shift_by_arm_by_worst.Rd b/man/template_shift_by_arm_by_worst.Rd index 8846564ccd..893bac145c 100644 --- a/man/template_shift_by_arm_by_worst.Rd +++ b/man/template_shift_by_arm_by_worst.Rd @@ -30,7 +30,7 @@ template_shift_by_arm_by_worst( \item{arm_var}{(\code{character})\cr variable names that can be used as \code{arm_var}.} -\item{paramcd}{(\code{character})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{character})\cr name of the parameter code variable.} \item{worst_flag_var}{(\code{character})\cr name of the worst flag variable.} diff --git a/man/template_shift_by_grade.Rd b/man/template_shift_by_grade.Rd index 0c9c5b7f3f..7e117f63a1 100644 --- a/man/template_shift_by_grade.Rd +++ b/man/template_shift_by_grade.Rd @@ -43,7 +43,7 @@ template_shift_by_grade( \item{base_toxgrade_var}{(\code{character})\cr name of the variable indicating the baseline toxicity grade.} -\item{paramcd}{(\code{character})\cr variable value designating the studied parameter.} +\item{paramcd}{(\code{character})\cr name of the parameter code variable.} \item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var} levels are set to those used in the diff --git a/man/tm_a_gee.Rd b/man/tm_a_gee.Rd index 2c9cb54e54..10d2d2ad33 100644 --- a/man/tm_a_gee.Rd +++ b/man/tm_a_gee.Rd @@ -55,8 +55,8 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value -designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and pre-selected option for the confidence level, each within range of (0, 1).} diff --git a/man/tm_a_mmrm.Rd b/man/tm_a_mmrm.Rd index 35d846b5d6..5284ff2360 100644 --- a/man/tm_a_mmrm.Rd +++ b/man/tm_a_mmrm.Rd @@ -61,8 +61,8 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value -designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{method}{(\code{choices_selected})\cr object with all available choices and preselected option for the adjustment method.} diff --git a/man/tm_g_forest_rsp.Rd b/man/tm_g_forest_rsp.Rd index 224fc3c176..ff064677f4 100644 --- a/man/tm_g_forest_rsp.Rd +++ b/man/tm_g_forest_rsp.Rd @@ -47,8 +47,8 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value -designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and pre-selected option for the analysis variable.} diff --git a/man/tm_g_forest_tte.Rd b/man/tm_g_forest_tte.Rd index 70889942ad..da5b525f31 100644 --- a/man/tm_g_forest_tte.Rd +++ b/man/tm_g_forest_tte.Rd @@ -53,8 +53,8 @@ reference and comparison arms when the arm variable is changed.} \item{subgroup_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for variable names that can be used as the default subgroups.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value -designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of the variables for stratified analysis.} diff --git a/man/tm_g_ipp.Rd b/man/tm_g_ipp.Rd index e56ceda381..76bb75ee8f 100644 --- a/man/tm_g_ipp.Rd +++ b/man/tm_g_ipp.Rd @@ -44,8 +44,8 @@ tm_g_ipp( \item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for variable values that can be used as arm variable.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value -designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying the variable name for subject id.} diff --git a/man/tm_g_km.Rd b/man/tm_g_km.Rd index 6b7a4bfe5f..8a3df74a27 100644 --- a/man/tm_g_km.Rd +++ b/man/tm_g_km.Rd @@ -48,8 +48,8 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value -designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of the variables for stratified analysis.} diff --git a/man/tm_g_lineplot.Rd b/man/tm_g_lineplot.Rd index 6adde4a73a..43a286d5a4 100644 --- a/man/tm_g_lineplot.Rd +++ b/man/tm_g_lineplot.Rd @@ -52,8 +52,8 @@ tm_g_lineplot( \item{y_unit}{(\code{character} or \code{NA})\cr \code{y_unit} variable name.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value -designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{param}{(\code{character})\cr parameter to filter the data by.} diff --git a/man/tm_t_abnormality.Rd b/man/tm_t_abnormality.Rd index 9a83c43f2a..8abbfea7cb 100644 --- a/man/tm_t_abnormality.Rd +++ b/man/tm_t_abnormality.Rd @@ -92,12 +92,15 @@ with settings for the module table. The argument is merged with option \code{tea module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ This module produces a table to summarize abnormality. } \note{ Patients with the same abnormality at baseline as on the treatment visit can be -excluded in accordance with \code{GDSR} specifications by using \code{exclude_base_abn}. +excluded in accordance with GDSR specifications by using \code{exclude_base_abn}. } \examples{ data <- teal_data() diff --git a/man/tm_t_abnormality_by_worst_grade.Rd b/man/tm_t_abnormality_by_worst_grade.Rd index 080bda45d8..6693b454c9 100644 --- a/man/tm_t_abnormality_by_worst_grade.Rd +++ b/man/tm_t_abnormality_by_worst_grade.Rd @@ -47,8 +47,8 @@ second variable will be nested under the first variable.} \item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying the variable name for subject id.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value -designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{atoxgr_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option @@ -133,8 +133,6 @@ if (interactive()) { } \seealso{ -\code{\link[=template_abnormality_by_worst_grade]{template_abnormality_by_worst_grade()}} - The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example apps implementing this module can be found. } diff --git a/man/tm_t_ancova.Rd b/man/tm_t_ancova.Rd index f489acfef6..504666c359 100644 --- a/man/tm_t_ancova.Rd +++ b/man/tm_t_ancova.Rd @@ -62,8 +62,8 @@ needed, the default option is \code{FALSE}.} \item{avisit}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr value of analysis visit \code{AVISIT} of interest.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value -designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and pre-selected option for the confidence level, each within range of (0, 1).} @@ -83,20 +83,17 @@ For more details, see the vignette: \code{vignette("custom-basic-table-arguments a \code{teal_module} object. } \description{ -This module produces a table to summarize analysis of variance. +This module produces a table to summarize analysis of variance, consistent with the TLG Catalog +template for \code{AOVT01} available \href{https://insightsengineering.github.io/tlg-catalog/stable/tables/efficacy/aovt01.html}{here} when multiple +endpoints are selected. } \details{ -This module produces an analysis of variance summary table that is -similar to \code{AOVT01} when multiple endpoints are selected. -When a single endpoint is selected, both unadjusted and adjusted comparison -would be provided. This modules expects that the analysis data has the -following variables: - -\tabular{ll}{ -\code{AVISIT} \tab variable used to filter for analysis visits.\cr -\code{PARAMCD} \tab variable used to filter for endpoints, after filtering for -\code{paramcd} and \code{avisit}, one observation per patient is expected for the analysis -to be meaningful. +When a single endpoint is selected, both unadjusted and adjusted comparison are provided. This modules +expects that the analysis data has the following variables: +\itemize{ +\item \code{AVISIT}: variable used to filter for analysis visits. +\item \code{PARAMCD}: variable used to filter for endpoints, after filtering for \code{paramcd} and \code{avisit}, one +observation per patient is expected for the analysis to be meaningful. } } \examples{ diff --git a/man/tm_t_binary_outcome.Rd b/man/tm_t_binary_outcome.Rd index 2a6058608e..1f4118d740 100644 --- a/man/tm_t_binary_outcome.Rd +++ b/man/tm_t_binary_outcome.Rd @@ -48,8 +48,8 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value -designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of the variables for stratified analysis.} diff --git a/man/tm_t_coxreg.Rd b/man/tm_t_coxreg.Rd index d57634c756..dd5fec239f 100644 --- a/man/tm_t_coxreg.Rd +++ b/man/tm_t_coxreg.Rd @@ -46,8 +46,8 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value -designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{cov_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for the covariates variables.} diff --git a/man/tm_t_events_patyear.Rd b/man/tm_t_events_patyear.Rd index ec3e532337..b7e6fd6765 100644 --- a/man/tm_t_events_patyear.Rd +++ b/man/tm_t_events_patyear.Rd @@ -43,8 +43,8 @@ second variable will be nested under the first variable.} \item{events_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for the variable with all event counts.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value -designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and pre-selected option for the analysis variable.} diff --git a/man/tm_t_exposure.Rd b/man/tm_t_exposure.Rd index 2abab08d69..e2132ea861 100644 --- a/man/tm_t_exposure.Rd +++ b/man/tm_t_exposure.Rd @@ -46,8 +46,8 @@ variable names that can be used to split rows.} object with all available choices and preselected option for variable names that can be used to split columns.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value -designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{paramcd_label}{(\code{character})\cr the column from the dataset where the value will be used to label the argument \code{paramcd}.} diff --git a/man/tm_t_logistic.Rd b/man/tm_t_logistic.Rd index 4d65ef3b53..14ec045331 100644 --- a/man/tm_t_logistic.Rd +++ b/man/tm_t_logistic.Rd @@ -41,8 +41,8 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value -designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{cov_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for the covariates variables.} diff --git a/man/tm_t_pp_laboratory.Rd b/man/tm_t_pp_laboratory.Rd index 8134254375..4e6e2f9683 100644 --- a/man/tm_t_pp_laboratory.Rd +++ b/man/tm_t_pp_laboratory.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_t_pp_laboratory.R \name{tm_t_pp_laboratory} \alias{tm_t_pp_laboratory} -\title{Teal Module: Patient Profile Laboratory Teal Module} +\title{teal Module: Patient Profile Laboratory Table} \usage{ tm_t_pp_laboratory( label, @@ -28,29 +28,30 @@ tm_t_pp_laboratory( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{patient_col}{(\code{character})\cr patient ID column to be used.} +\item{patient_col}{(\code{character})\cr name of patient ID variable.} -\item{timepoints}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -Time variable to be represented in the laboratory table.} +\item{timepoints}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the time variable from \code{dataname}.} \item{aval}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Please use the \code{aval_var} argument instead.} -\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{AVAL} column of the \code{ADLB} dataset.} +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the analysis variable.} \item{avalu}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Please use the \code{avalu_var} argument instead.} -\item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{AVALU} column of the \code{ADLB} dataset.} +\item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and preselected option for the analysis unit variable.} -\item{param}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{PARAM} column of the \code{ADLB} dataset.} +\item{param}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{PARAM} variable from \code{dataname}.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{PARAMCD} column of the \code{ADLB} dataset.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} -\item{anrind}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{ANRIND} column of the \code{ADLB} dataset with 3 possible levels "HIGH", "LOW" and "NORMAL".} +\item{anrind}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{ANRIND} variable from \code{dataname}. Variable should have the +following 3 levels: \code{"HIGH"}, \code{"LOW"}, and \code{"NORMAL"}.} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. For example a title.} @@ -58,8 +59,11 @@ For example a title.} \item{post_output}{optional, (\code{shiny.tag})\cr with text placed after the output to put the output into context. For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are useful.} } +\value{ +a \code{teal_module} object. +} \description{ -This teal module produces a patient profile laboratory table using \code{ADaM} datasets. +This module produces a patient profile laboratory table using ADaM datasets. } \examples{ ADSL <- tmc_ex_adsl diff --git a/man/tm_t_shift_by_arm.Rd b/man/tm_t_shift_by_arm.Rd index af1f4610f1..1128696ad3 100644 --- a/man/tm_t_shift_by_arm.Rd +++ b/man/tm_t_shift_by_arm.Rd @@ -41,8 +41,8 @@ It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value -designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{visit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for variable names that can be used as \code{visit} variable. diff --git a/man/tm_t_shift_by_arm_by_worst.Rd b/man/tm_t_shift_by_arm_by_worst.Rd index 31edf60d65..33b9b31b7c 100644 --- a/man/tm_t_shift_by_arm_by_worst.Rd +++ b/man/tm_t_shift_by_arm_by_worst.Rd @@ -41,8 +41,8 @@ It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value -designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and pre-selected option for the analysis variable.} diff --git a/man/tm_t_shift_by_grade.Rd b/man/tm_t_shift_by_grade.Rd index 7ed57eb6cc..b97cfe154a 100644 --- a/man/tm_t_shift_by_grade.Rd +++ b/man/tm_t_shift_by_grade.Rd @@ -54,8 +54,8 @@ second variable will be nested under the first variable.} all available choices and preselected option for variable names that can be used as \code{visit} variable. Must be a factor in \code{dataname}.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value -designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{worst_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for variable names that can be used as worst flag variable.} diff --git a/man/tm_t_summary_by.Rd b/man/tm_t_summary_by.Rd index a43c46e2e1..889393175a 100644 --- a/man/tm_t_summary_by.Rd +++ b/man/tm_t_summary_by.Rd @@ -53,8 +53,8 @@ the variables that should be summarized.} \item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying the variable name for subject id.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value -designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} diff --git a/man/tm_t_tte.Rd b/man/tm_t_tte.Rd index a33071694c..2242493dac 100644 --- a/man/tm_t_tte.Rd +++ b/man/tm_t_tte.Rd @@ -53,8 +53,8 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable value -designating the studied parameter.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of the variables for stratified analysis.} From 390ea47f9d839816e45e8ba508ddb21169dcf426 Mon Sep 17 00:00:00 2001 From: edelarua Date: Mon, 5 Feb 2024 15:48:09 +0000 Subject: [PATCH 063/126] [skip actions] Bump version to 0.8.16.9075 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 16ac232b9a..43fb665a65 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9074 +Version: 0.8.16.9075 Date: 2024-02-05 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 07ee8b7fb3..9d2d9b5951 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9074 +# teal.modules.clinical 0.8.16.9075 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 85d1ed0a35f8b7fac2fea6c7f7f428ea424f46e6 Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Mon, 5 Feb 2024 11:18:55 -0500 Subject: [PATCH 064/126] Clean up documentation for `tm_g_pp_patient_timeline` (#1038) Fixes #966 --- R/tm_g_pp_patient_timeline.R | 88 ++++++++++++++++---------------- man/template_patient_timeline.Rd | 32 +++++++----- man/tm_g_pp_patient_timeline.Rd | 54 ++++++++++---------- 3 files changed, 90 insertions(+), 84 deletions(-) diff --git a/R/tm_g_pp_patient_timeline.R b/R/tm_g_pp_patient_timeline.R index 1016b55b2c..7103eac218 100644 --- a/R/tm_g_pp_patient_timeline.R +++ b/R/tm_g_pp_patient_timeline.R @@ -1,23 +1,24 @@ -#' Template: Patient Timeline Tab +#' Template: Patient Profile Timeline Plot #' -#' Creates a patient timeline template call. +#' Creates a valid expression to generate a patient profile timeline [ggplot2::ggplot()] plot using ADaM datasets. #' +#' @inheritParams template_adverse_events #' @inheritParams template_arguments -#' @param aeterm (`character`)\cr name of the reported term for the adverse event variable. -#' @param aetime_start (`character`)\cr name of `datetime` start of adverse event variable. -#' @param aetime_end (`character`)\cr name of `datetime` end of adverse event variable. -#' @param dstime_start (`character`)\cr name of `datetime` first exposure to treatment variable. -#' @param dstime_end (`character`)\cr name of `datetime` last exposure to treatment variable. -#' @param cmdecod (`character`)\cr name of reported standardized name of drug, med, or therapy variable. -#' @param aerelday_start (`character`)\cr name of start study day variable. -#' @param aerelday_end (`character`)\cr name of end study day variable. -#' @param dsrelday_start (`character`)\cr name of start study day variable. -#' @param dsrelday_end (`character`)\cr name of end study day variable. -#' @param relative_day (`logical`)\cr whether to use relative days or absolute dates -#' @param patient_id (`character`)\cr patient ID. -#' @param font_size (`numeric`)\cr numeric vector of length 3 for current, min and max font size values. -#' @keywords internal +#' @param aetime_start (`character`)\cr name of start date/time of adverse event variable. +#' @param aetime_end (`character`)\cr name of end date/time of adverse event variable. +#' @param dstime_start (`character`)\cr name of date/time of first exposure to treatment variable. +#' @param dstime_end (`character`)\cr name of date/time of last exposure to treatment variable. +#' @param aerelday_start (`character`)\cr name of adverse event study start day variable. +#' @param aerelday_end (`character`)\cr name of adverse event study end day variable. +#' @param dsrelday_start (`character`)\cr name of concomitant medications study start day variable. +#' @param dsrelday_end (`character`)\cr name of concomitant medications study day start variable. +#' @param relative_day (`logical`)\cr whether to use relative days (`TRUE`) or absolute dates (`FALSE`). +#' +#' @inherit template_arguments return #' +#' @seealso [tm_g_pp_patient_timeline()] +#' +#' @keywords internal template_patient_timeline <- function(dataname = "ANL", aeterm = "AETERM", aetime_start = "ASTDTM", @@ -317,44 +318,39 @@ template_patient_timeline <- function(dataname = "ANL", chart_list } -#' Teal Module: Patient Profile Timeline Teal Module +#' teal Module: Patient Profile Timeline Plot #' -#' This teal module produces a patient profile timeline plot using `ADaM` datasets. +#' This module produces a patient profile timeline [ggplot2::ggplot()] type plot using ADaM datasets. #' +#' @inheritParams tm_g_pp_adverse_events #' @inheritParams module_arguments #' @inheritParams template_patient_timeline -#' @param patient_col (`character`)\cr patient ID column to be used. -#' @param aeterm ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `AETERM` column of the `ADAE` dataset. #' @param dataname_adcm (`character`)\cr name of `ADCM` dataset or equivalent. #' @param dataname_adae (`character`)\cr name of `ADAE` dataset or equivalent. -#' @param aerelday_start ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `ASTDY` column of the `ADAE` dataset. -#' @param aerelday_end ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr `AENDY` -#' column of the `ADAE` dataset. -#' @param dsrelday_start ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr `ASTDY` -#' column of the `ADCM` dataset. -#' @param dsrelday_end ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr `AENDY` -#' column of the `ADCM` dataset. -#' @param cmdecod ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `CMDECOD` column of the `ADCM` dataset. -#' @param aetime_start ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `ASTDTM` column of the `AE` start of the `ADAE` dataset. -#' @param aetime_end ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `AENDTM` column of the `AE` end of the `ADAE` dataset. -#' @param dstime_start ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `CMASTDTM` column of treatment start of the `ADCM` dataset. -#' @param dstime_end ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `CMAENDTM` column of treatment end of the `ADCM` dataset. -#' @param font_size (`numeric`)\cr numeric vector of length 3 for current, min and max font size values. +#' @param aerelday_start ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object +#' with all available choices and preselected option for the `ASTDY` variable from `dataname_adae`. +#' @param aerelday_end ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object +#' with all available choices and preselected option for the `AENDY` variable from `dataname_adae`. +#' @param dsrelday_start ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object +#' with all available choices and preselected option for the `ASTDY` variable from `dataname_adcm`. +#' @param dsrelday_end ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object +#' with all available choices and preselected option for the `AENDY` variable from `dataname_adcm`. +#' @param cmdecod ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `CMDECOD` variable from `dataname_adcm`. +#' @param aetime_start ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' all available choices and preselected option for the `ASTDTM` variable from `dataname_adae`. +#' @param aetime_end ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `AENDTM` variable from `dataname_adae`. +#' @param dstime_start ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' all available choices and preselected option for the `CMASTDTM` variable from `dataname_adcm`. +#' @param dstime_end ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the `CMAENDTM` variable from `dataname_adcm`. #' -#' @export +#' @inherit module_arguments return #' #' @examples #' library(nestcolor) #' -#' adcm_keys <- c("STUDYID", "USUBJID", "ASTDTM", "CMSEQ", "ATC1", "ATC2", "ATC3", "ATC4") -#' #' data <- teal_data() #' data <- within(data, { #' ADAE <- tmc_ex_adae @@ -375,6 +371,7 @@ template_patient_timeline <- function(dataname = "ANL", #' ) #' }) #' +#' adcm_keys <- c("STUDYID", "USUBJID", "ASTDTM", "CMSEQ", "ATC1", "ATC2", "ATC3", "ATC4") #' datanames(data) <- c("ADSL", "ADAE", "ADCM") #' join_keys(data) <- default_cdisc_join_keys[c("ADSL", "ADAE", "ADCM")] #' join_keys(data)["ADCM", "ADCM"] <- adcm_keys @@ -437,6 +434,7 @@ template_patient_timeline <- function(dataname = "ANL", #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_g_pp_patient_timeline <- function(label, dataname_adcm = "ADCM", dataname_adae = "ADAE", @@ -521,6 +519,7 @@ tm_g_pp_patient_timeline <- function(label, ) } +#' @keywords internal ui_g_patient_timeline <- function(id, ...) { ui_args <- list(...) is_single_dataset_value <- teal.transform::is_single_dataset( @@ -661,7 +660,7 @@ ui_g_patient_timeline <- function(id, ...) { ) } - +#' @keywords internal srv_g_patient_timeline <- function(id, data, reporter, @@ -717,7 +716,6 @@ srv_g_patient_timeline <- function(id, ignoreInit = TRUE ) - # Patient timeline tab ---- check_box <- shiny::reactive(input$relday_x_axis) diff --git a/man/template_patient_timeline.Rd b/man/template_patient_timeline.Rd index 678de4f1b1..415ccc9e68 100644 --- a/man/template_patient_timeline.Rd +++ b/man/template_patient_timeline.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_g_pp_patient_timeline.R \name{template_patient_timeline} \alias{template_patient_timeline} -\title{Template: Patient Timeline Tab} +\title{Template: Patient Profile Timeline Plot} \usage{ template_patient_timeline( dataname = "ANL", @@ -27,36 +27,42 @@ template_patient_timeline( \item{aeterm}{(\code{character})\cr name of the reported term for the adverse event variable.} -\item{aetime_start}{(\code{character})\cr name of \code{datetime} start of adverse event variable.} +\item{aetime_start}{(\code{character})\cr name of start date/time of adverse event variable.} -\item{aetime_end}{(\code{character})\cr name of \code{datetime} end of adverse event variable.} +\item{aetime_end}{(\code{character})\cr name of end date/time of adverse event variable.} -\item{dstime_start}{(\code{character})\cr name of \code{datetime} first exposure to treatment variable.} +\item{dstime_start}{(\code{character})\cr name of date/time of first exposure to treatment variable.} -\item{dstime_end}{(\code{character})\cr name of \code{datetime} last exposure to treatment variable.} +\item{dstime_end}{(\code{character})\cr name of date/time of last exposure to treatment variable.} -\item{cmdecod}{(\code{character})\cr name of reported standardized name of drug, med, or therapy variable.} +\item{cmdecod}{(\code{character})\cr name of standardized medication name variable.} -\item{aerelday_start}{(\code{character})\cr name of start study day variable.} +\item{aerelday_start}{(\code{character})\cr name of adverse event study start day variable.} -\item{aerelday_end}{(\code{character})\cr name of end study day variable.} +\item{aerelday_end}{(\code{character})\cr name of adverse event study end day variable.} -\item{dsrelday_start}{(\code{character})\cr name of start study day variable.} +\item{dsrelday_start}{(\code{character})\cr name of concomitant medications study start day variable.} -\item{dsrelday_end}{(\code{character})\cr name of end study day variable.} +\item{dsrelday_end}{(\code{character})\cr name of concomitant medications study day start variable.} -\item{relative_day}{(\code{logical})\cr whether to use relative days or absolute dates} +\item{relative_day}{(\code{logical})\cr whether to use relative days (\code{TRUE}) or absolute dates (\code{FALSE}).} \item{patient_id}{(\code{character})\cr patient ID.} -\item{font_size}{(\code{numeric})\cr numeric vector of length 3 for current, min and max font size values.} +\item{font_size}{(\code{numeric})\cr font size value.} \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Creates a patient timeline template call. +Creates a valid expression to generate a patient profile timeline \code{\link[ggplot2:ggplot]{ggplot2::ggplot()}} plot using ADaM datasets. +} +\seealso{ +\code{\link[=tm_g_pp_patient_timeline]{tm_g_pp_patient_timeline()}} } \keyword{internal} diff --git a/man/tm_g_pp_patient_timeline.Rd b/man/tm_g_pp_patient_timeline.Rd index ab1a93b4b4..9dbf7c6982 100644 --- a/man/tm_g_pp_patient_timeline.Rd +++ b/man/tm_g_pp_patient_timeline.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_g_pp_patient_timeline.R \name{tm_g_pp_patient_timeline} \alias{tm_g_pp_patient_timeline} -\title{Teal Module: Patient Profile Timeline Teal Module} +\title{teal Module: Patient Profile Timeline Plot} \usage{ tm_g_pp_patient_timeline( label, @@ -37,39 +37,39 @@ tm_g_pp_patient_timeline( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{patient_col}{(\code{character})\cr patient ID column to be used.} +\item{patient_col}{(\code{character})\cr name of patient ID variable.} -\item{aeterm}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{AETERM} column of the \code{ADAE} dataset.} +\item{aeterm}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{AETERM} variable from \code{dataname}.} -\item{cmdecod}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{CMDECOD} column of the \code{ADCM} dataset.} +\item{cmdecod}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{CMDECOD} variable from \code{dataname_adcm}.} -\item{aetime_start}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{ASTDTM} column of the \code{AE} start of the \code{ADAE} dataset.} +\item{aetime_start}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and preselected option for the \code{ASTDTM} variable from \code{dataname_adae}.} -\item{aetime_end}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{AENDTM} column of the \code{AE} end of the \code{ADAE} dataset.} +\item{aetime_end}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{AENDTM} variable from \code{dataname_adae}.} -\item{dstime_start}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{CMASTDTM} column of treatment start of the \code{ADCM} dataset.} +\item{dstime_start}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and preselected option for the \code{CMASTDTM} variable from \code{dataname_adcm}.} -\item{dstime_end}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{CMAENDTM} column of treatment end of the \code{ADCM} dataset.} +\item{dstime_end}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the \code{CMAENDTM} variable from \code{dataname_adcm}.} -\item{aerelday_start}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{ASTDY} column of the \code{ADAE} dataset.} +\item{aerelday_start}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +with all available choices and preselected option for the \code{ASTDY} variable from \code{dataname_adae}.} -\item{aerelday_end}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr \code{AENDY} -column of the \code{ADAE} dataset.} +\item{aerelday_end}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +with all available choices and preselected option for the \code{AENDY} variable from \code{dataname_adae}.} -\item{dsrelday_start}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr \code{ASTDY} -column of the \code{ADCM} dataset.} +\item{dsrelday_start}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +with all available choices and preselected option for the \code{ASTDY} variable from \code{dataname_adcm}.} -\item{dsrelday_end}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr \code{AENDY} -column of the \code{ADCM} dataset.} +\item{dsrelday_end}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +with all available choices and preselected option for the \code{AENDY} variable from \code{dataname_adcm}.} -\item{font_size}{(\code{numeric})\cr numeric vector of length 3 for current, min and max font size values.} +\item{font_size}{(\code{numeric})\cr numeric vector of length 3 of current, minimum and maximum font size values.} \item{plot_height}{optional, (\code{numeric})\cr a vector of length three with \code{c(value, min, max)}. Specifies the height of the main plot and renders a slider on the plot to interactively adjust the plot height.} @@ -88,14 +88,15 @@ for the module plot. The argument is merged with option \code{teal.ggplot2_args} (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -This teal module produces a patient profile timeline plot using \code{ADaM} datasets. +This module produces a patient profile timeline \code{\link[ggplot2:ggplot]{ggplot2::ggplot()}} type plot using ADaM datasets. } \examples{ library(nestcolor) -adcm_keys <- c("STUDYID", "USUBJID", "ASTDTM", "CMSEQ", "ATC1", "ATC2", "ATC3", "ATC4") - data <- teal_data() data <- within(data, { ADAE <- tmc_ex_adae @@ -116,6 +117,7 @@ data <- within(data, { ) }) +adcm_keys <- c("STUDYID", "USUBJID", "ASTDTM", "CMSEQ", "ATC1", "ATC2", "ATC3", "ATC4") datanames(data) <- c("ADSL", "ADAE", "ADCM") join_keys(data) <- default_cdisc_join_keys[c("ADSL", "ADAE", "ADCM")] join_keys(data)["ADCM", "ADCM"] <- adcm_keys From 573a39f7bac1df4950810fabfcb778b38ca1ac51 Mon Sep 17 00:00:00 2001 From: edelarua Date: Mon, 5 Feb 2024 16:19:52 +0000 Subject: [PATCH 065/126] [skip actions] Bump version to 0.8.16.9076 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 43fb665a65..aae03892a5 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9075 +Version: 0.8.16.9076 Date: 2024-02-05 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 9d2d9b5951..0e1e2a638b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9075 +# teal.modules.clinical 0.8.16.9076 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 21edeb45b118f415c748d356df0047347d81f2b5 Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Mon, 5 Feb 2024 11:30:09 -0500 Subject: [PATCH 066/126] Clean up documentation for `tm_g_ci` (#1035) Fixes #952 --- R/tm_g_ci.R | 39 +++++++++++++++++++++------------------ man/template_g_ci.Rd | 19 ++++++++++--------- man/tm_g_ci.Rd | 21 ++++++++++++++------- 3 files changed, 45 insertions(+), 34 deletions(-) diff --git a/R/tm_g_ci.R b/R/tm_g_ci.R index fb06f18cce..dc0d4da744 100644 --- a/R/tm_g_ci.R +++ b/R/tm_g_ci.R @@ -1,21 +1,21 @@ #' Template: Confidence Interval Plot #' -#' Writes the expressions to filter data and draw confidence interval -#' estimation. +#' Creates a valid expression to generate a [ggplot2::ggplot()] confidence interval plot. #' #' @inheritParams template_arguments -#' @param x_var (`character`)\cr treatment variable corresponding to the x axis. -#' @param y_var (`character`)\cr response variable corresponding to the y axis. -#' @param grp_var (`character`)\cr group variable corresponding to the colors -#' point shape and line type. -#' @param stat (`character`)\cr either `mean` or `median`. -#' @param unit_var (`character`)\cr variable name in `dataname` where the unit is -#' read. +#' @param x_var (`character`)\cr name of the treatment variable to put on the x-axis. +#' @param y_var (`character`)\cr name of the response variable to put on the y-axis. +#' @param grp_var (`character`)\cr name of the group variable used to determine the plot colors, point shapes, +#' and line types. +#' @param stat (`character`)\cr statistic to plot. Options are `"mean"` and `"median"`. +#' @param unit_var (`character`)\cr name of the unit variable. +#' +#' @inherit template_arguments return #' #' @seealso [tm_g_ci()] -#' @keywords internal #' -template_g_ci <- function(dataname, # nolint +#' @keywords internal +template_g_ci <- function(dataname, x_var, y_var, grp_var = NULL, @@ -178,16 +178,16 @@ template_g_ci <- function(dataname, # nolint ) } -#' Teal Module: Confidence Interval Plot (`CIG01`) +#' teal Module: Confidence Interval Plot #' -#' The module generates the R code and returns the corresponding output. +#' This module produces a [ggplot2::ggplot()] type confidence interval plot consistent with the TLG Catalog template +#' `CIG01` available [here](https://insightsengineering.github.io/tlg-catalog/stable/graphs/other/cig01.html). #' #' @inheritParams module_arguments #' @inheritParams template_g_ci -#' @param color (`data_extract_spec`)\cr the group variable (color, line type -#' and point shape). +#' @param color (`data_extract_spec`)\cr the group variable used to determine the plot colors, shapes, and line types. #' -#' @export +#' @inherit module_arguments return seealso #' #' @examples #' library(nestcolor) @@ -263,6 +263,7 @@ template_g_ci <- function(dataname, # nolint #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_g_ci <- function(label, x_var, y_var, @@ -312,7 +313,8 @@ tm_g_ci <- function(label, ) } -ui_g_ci <- function(id, ...) { # nolint +#' @keywords internal +ui_g_ci <- function(id, ...) { ns <- shiny::NS(id) args <- list(...) @@ -363,7 +365,8 @@ ui_g_ci <- function(id, ...) { # nolint ) } -srv_g_ci <- function(id, # nolint +#' @keywords internal +srv_g_ci <- function(id, data, reporter, filter_panel_api, diff --git a/man/template_g_ci.Rd b/man/template_g_ci.Rd index db7c3acc32..b50156a436 100644 --- a/man/template_g_ci.Rd +++ b/man/template_g_ci.Rd @@ -18,28 +18,29 @@ template_g_ci( \arguments{ \item{dataname}{(\code{character})\cr analysis data used in teal module.} -\item{x_var}{(\code{character})\cr treatment variable corresponding to the x axis.} +\item{x_var}{(\code{character})\cr name of the treatment variable to put on the x-axis.} -\item{y_var}{(\code{character})\cr response variable corresponding to the y axis.} +\item{y_var}{(\code{character})\cr name of the response variable to put on the y-axis.} -\item{grp_var}{(\code{character})\cr group variable corresponding to the colors -point shape and line type.} +\item{grp_var}{(\code{character})\cr name of the group variable used to determine the plot colors, point shapes, +and line types.} -\item{stat}{(\code{character})\cr either \code{mean} or \code{median}.} +\item{stat}{(\code{character})\cr statistic to plot. Options are \code{"mean"} and \code{"median"}.} \item{conf_level}{(\code{numeric})\cr value for the confidence level within the range of (0, 1).} -\item{unit_var}{(\code{character})\cr variable name in \code{dataname} where the unit is -read.} +\item{unit_var}{(\code{character})\cr name of the unit variable.} \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Writes the expressions to filter data and draw confidence interval -estimation. +Creates a valid expression to generate a \code{\link[ggplot2:ggplot]{ggplot2::ggplot()}} confidence interval plot. } \seealso{ \code{\link[=tm_g_ci]{tm_g_ci()}} diff --git a/man/tm_g_ci.Rd b/man/tm_g_ci.Rd index 346fe3afd0..1f1175f634 100644 --- a/man/tm_g_ci.Rd +++ b/man/tm_g_ci.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_g_ci.R \name{tm_g_ci} \alias{tm_g_ci} -\title{Teal Module: Confidence Interval Plot (\code{CIG01})} +\title{teal Module: Confidence Interval Plot} \usage{ tm_g_ci( label, @@ -22,14 +22,13 @@ tm_g_ci( \arguments{ \item{label}{(\code{character})\cr menu item label of the module in the teal app.} -\item{x_var}{(\code{character})\cr treatment variable corresponding to the x axis.} +\item{x_var}{(\code{character})\cr name of the treatment variable to put on the x-axis.} -\item{y_var}{(\code{character})\cr response variable corresponding to the y axis.} +\item{y_var}{(\code{character})\cr name of the response variable to put on the y-axis.} -\item{color}{(\code{data_extract_spec})\cr the group variable (color, line type -and point shape).} +\item{color}{(\code{data_extract_spec})\cr the group variable used to determine the plot colors, shapes, and line types.} -\item{stat}{(\code{character})\cr either \code{mean} or \code{median}.} +\item{stat}{(\code{character})\cr statistic to plot. Options are \code{"mean"} and \code{"median"}.} \item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and pre-selected option for the confidence level, each within range of (0, 1).} @@ -51,8 +50,12 @@ for the module plot. The argument is merged with option \code{teal.ggplot2_args} (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -The module generates the R code and returns the corresponding output. +This module produces a \code{\link[ggplot2:ggplot]{ggplot2::ggplot()}} type confidence interval plot consistent with the TLG Catalog template +\code{CIG01} available \href{https://insightsengineering.github.io/tlg-catalog/stable/graphs/other/cig01.html}{here}. } \examples{ library(nestcolor) @@ -129,3 +132,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} From 03c6c49b13b256e31c5ef58a83883bf5332d3997 Mon Sep 17 00:00:00 2001 From: edelarua Date: Mon, 5 Feb 2024 16:31:02 +0000 Subject: [PATCH 067/126] [skip actions] Bump version to 0.8.16.9077 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index aae03892a5..c8bde61b91 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9076 +Version: 0.8.16.9077 Date: 2024-02-05 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 0e1e2a638b..11ab0677d1 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9076 +# teal.modules.clinical 0.8.16.9077 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From bd5664569a7df30a2efacb1e7d241e7491206b58 Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Mon, 5 Feb 2024 11:43:50 -0500 Subject: [PATCH 068/126] Clean up documentation for `tm_g_pp_vitals` (#1037) Fixes #964 --- R/tm_g_barchart_simple.R | 4 +-- R/tm_g_pp_vitals.R | 43 +++++++++++++++----------------- inst/WORDLIST | 1 + man/make_barchart_simple_call.Rd | 10 ++++---- man/template_vitals.Rd | 17 +++++++------ man/tm_g_pp_vitals.Rd | 27 ++++++++++++-------- 6 files changed, 55 insertions(+), 47 deletions(-) diff --git a/R/tm_g_barchart_simple.R b/R/tm_g_barchart_simple.R index b1ec53189f..ee06fc42ef 100644 --- a/R/tm_g_barchart_simple.R +++ b/R/tm_g_barchart_simple.R @@ -583,8 +583,8 @@ srv_g_barchart_simple <- function(id, #' `ggplot2` call to generate simple bar chart #' #' @inheritParams tm_g_barchart_simple -#' @param yname (`character` or `NULL`)\cr name of the y-axis variable. -#' @param xname (`character` or `NULL`)\cr name of the x-axis variable. Defaults to `NULL` because it is dependent +#' @param y_name (`character` or `NULL`)\cr name of the y-axis variable. +#' @param x_name (`character` or `NULL`)\cr name of the x-axis variable. Defaults to `NULL` because it is dependent #' on extract input which can be empty. #' @param fill_name (`character` or `NULL`)\cr name of the variable to determine the bar fill color. #' @param x_facet_name (`character` or `NULL`)\cr name of the variable to use for horizontal plot faceting. diff --git a/R/tm_g_pp_vitals.R b/R/tm_g_pp_vitals.R index 268ff05a71..16311f304b 100644 --- a/R/tm_g_pp_vitals.R +++ b/R/tm_g_pp_vitals.R @@ -1,18 +1,16 @@ -#' Template: Vitals +#' Template: Patient Profile Vitals Plot +#' +#' Creates a valid expression to generate a patient profile vitals [ggplot2::ggplot()] plot using ADaM datasets. #' -#' Creates a vitals template. #' @inheritParams template_arguments -#' @param paramcd (`character`)\cr name of the parameter code variable. -#' @param paramcd_levels (`character`)\cr (`paramcd`)\cr vector with (`#'paramcd`)\cr levels. -#' @param xaxis (`character`)\cr name of time variable used for the x-axis. -#' @param patient_id (`character`)\cr patient ID. -#' @param font_size (`numeric`)\cr numeric vector of length 3 for current, min and max font size values. +#' @param paramcd_levels (`character`)\cr vector of all levels of `paramcd`. +#' @param xaxis (`character`)\cr name of the time variable to put on the x-axis. #' -#' @note -#' The vitals plot supports horizontal lines for 6 `PARAMCD` levels (`SYSBP, DIABP, TEMP, RESP, OXYSAT -#' and PULSE`)\cr when these levels are present in the analyzed dataset and the spelling matches. -#' @keywords internal +#' @inherit template_arguments return +#' +#' @seealso [tm_g_pp_vitals()] #' +#' @keywords internal template_vitals <- function(dataname = "ANL", paramcd = "PARAMCD", paramcd_levels = c("SYSBP", "DIABP", "PUL", "RESP", "OXYSAT", "WGHT", "TEMP"), @@ -201,22 +199,19 @@ template_vitals <- function(dataname = "ANL", y } -#' Teal Module: Patient Profile Vitals Teal Module +#' teal Module: Patient Profile Vitals Plot +#' +#' This module produces a patient profile vitals [ggplot2::ggplot()] type plot using ADaM datasets. #' -#' This teal module produces a patient profile vitals plot using `ADaM` datasets. +#' This plot supports horizontal lines for the following 6 `PARAMCD` levels when they are present in `dataname`: +#' `"SYSBP"`, `"DIABP"`, `"TEMP"`, `"RESP"`, `"OXYSAT"`. #' #' @inheritParams module_arguments #' @inheritParams template_vitals -#' @param patient_col (`character`)\cr patient ID column to be used. -#' @param paramcd ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `PARAMCD` column of the `ADVS` dataset. -#' @param aval_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' `AVAL` column of the `ADVS` dataset. -#' @param xaxis ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr -#' time variable to be represented in the vitals plot x-axis. -#' @param font_size (`numeric`)\cr numeric vector of length 3 for current, min and max font size values. +#' @param xaxis ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' available choices and preselected option for the time variable from `dataname` to be put on the plot x-axis. #' -#' @export +#' @inherit module_arguments return #' #' @examples #' library(nestcolor) @@ -259,6 +254,7 @@ template_vitals <- function(dataname = "ANL", #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_g_pp_vitals <- function(label, dataname = "ADVS", parentname = "ADSL", @@ -333,6 +329,7 @@ tm_g_pp_vitals <- function(label, ) } +#' @keywords internal ui_g_vitals <- function(id, ...) { ui_args <- list(...) is_single_dataset_value <- teal.transform::is_single_dataset( @@ -393,7 +390,7 @@ ui_g_vitals <- function(id, ...) { ) } - +#' @keywords internal srv_g_vitals <- function(id, data, reporter, diff --git a/inst/WORDLIST b/inst/WORDLIST index 7fccb580ae..fbf1d1b4e8 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -3,6 +3,7 @@ AE ANCOVA Facetting Forkers +GDSR Getter Hoffmann Kaplan diff --git a/man/make_barchart_simple_call.Rd b/man/make_barchart_simple_call.Rd index 0e0f9edf83..6303ad9179 100644 --- a/man/make_barchart_simple_call.Rd +++ b/man/make_barchart_simple_call.Rd @@ -22,6 +22,11 @@ make_barchart_simple_call( ) } \arguments{ +\item{y_name}{(\code{character} or \code{NULL})\cr name of the y-axis variable.} + +\item{x_name}{(\code{character} or \code{NULL})\cr name of the x-axis variable. Defaults to \code{NULL} because it is dependent +on extract input which can be empty.} + \item{fill_name}{(\code{character} or \code{NULL})\cr name of the variable to determine the bar fill color.} \item{x_facet_name}{(\code{character} or \code{NULL})\cr name of the variable to use for horizontal plot faceting.} @@ -51,11 +56,6 @@ also be drawn as text.} for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} - -\item{yname}{(\code{character} or \code{NULL})\cr name of the y-axis variable.} - -\item{xname}{(\code{character} or \code{NULL})\cr name of the x-axis variable. Defaults to \code{NULL} because it is dependent -on extract input which can be empty.} } \value{ \code{call} to produce a \code{ggplot} object. diff --git a/man/template_vitals.Rd b/man/template_vitals.Rd index 467c31ed79..e4674d2490 100644 --- a/man/template_vitals.Rd +++ b/man/template_vitals.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_g_pp_vitals.R \name{template_vitals} \alias{template_vitals} -\title{Template: Vitals} +\title{Template: Patient Profile Vitals Plot} \usage{ template_vitals( dataname = "ANL", @@ -21,9 +21,9 @@ template_vitals( \item{paramcd}{(\code{character})\cr name of the parameter code variable.} -\item{paramcd_levels}{(\code{character})\cr (\code{paramcd})\cr vector with (\verb{#'paramcd})\cr levels.} +\item{paramcd_levels}{(\code{character})\cr vector of all levels of \code{paramcd}.} -\item{xaxis}{(\code{character})\cr name of time variable used for the x-axis.} +\item{xaxis}{(\code{character})\cr name of the time variable to put on the x-axis.} \item{aval}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Please use the \code{aval_var} argument instead.} @@ -31,17 +31,20 @@ template_vitals( \item{patient_id}{(\code{character})\cr patient ID.} -\item{font_size}{(\code{numeric})\cr numeric vector of length 3 for current, min and max font size values.} +\item{font_size}{(\code{numeric})\cr font size value.} \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Creates a vitals template. +Creates a valid expression to generate a patient profile vitals \code{\link[ggplot2:ggplot]{ggplot2::ggplot()}} plot using ADaM datasets. } -\note{ -The vitals plot supports horizontal lines for 6 \code{PARAMCD} levels (\verb{SYSBP, DIABP, TEMP, RESP, OXYSAT and PULSE})\cr when these levels are present in the analyzed dataset and the spelling matches. +\seealso{ +\code{\link[=tm_g_pp_vitals]{tm_g_pp_vitals()}} } \keyword{internal} diff --git a/man/tm_g_pp_vitals.Rd b/man/tm_g_pp_vitals.Rd index 9d62c2433d..94e973b0d1 100644 --- a/man/tm_g_pp_vitals.Rd +++ b/man/tm_g_pp_vitals.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_g_pp_vitals.R \name{tm_g_pp_vitals} \alias{tm_g_pp_vitals} -\title{Teal Module: Patient Profile Vitals Teal Module} +\title{teal Module: Patient Profile Vitals Plot} \usage{ tm_g_pp_vitals( label, @@ -28,20 +28,20 @@ tm_g_pp_vitals( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{patient_col}{(\code{character})\cr patient ID column to be used.} +\item{patient_col}{(\code{character})\cr name of patient ID variable.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{PARAMCD} column of the \code{ADVS} dataset.} +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the parameter code variable from \code{dataname}.} \item{aval}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Please use the \code{aval_var} argument instead.} -\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -\code{AVAL} column of the \code{ADVS} dataset.} +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the analysis variable.} -\item{xaxis}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr -time variable to be represented in the vitals plot x-axis.} +\item{xaxis}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for the time variable from \code{dataname} to be put on the plot x-axis.} -\item{font_size}{(\code{numeric})\cr numeric vector of length 3 for current, min and max font size values.} +\item{font_size}{(\code{numeric})\cr numeric vector of length 3 of current, minimum and maximum font size values.} \item{plot_height}{optional, (\code{numeric})\cr a vector of length three with \code{c(value, min, max)}. Specifies the height of the main plot and renders a slider on the plot to interactively adjust the plot height.} @@ -60,8 +60,15 @@ for the module plot. The argument is merged with option \code{teal.ggplot2_args} (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } +\value{ +a \code{teal_module} object. +} \description{ -This teal module produces a patient profile vitals plot using \code{ADaM} datasets. +This module produces a patient profile vitals \code{\link[ggplot2:ggplot]{ggplot2::ggplot()}} type plot using ADaM datasets. +} +\details{ +This plot supports horizontal lines for the following 6 \code{PARAMCD} levels when they are present in \code{dataname}: +\code{"SYSBP"}, \code{"DIABP"}, \code{"TEMP"}, \code{"RESP"}, \code{"OXYSAT"}. } \examples{ library(nestcolor) From 17e0bf6bcb07b747c4101a5d95fb1259102442ba Mon Sep 17 00:00:00 2001 From: edelarua Date: Mon, 5 Feb 2024 16:44:43 +0000 Subject: [PATCH 069/126] [skip actions] Bump version to 0.8.16.9078 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index c8bde61b91..296296a2ff 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9077 +Version: 0.8.16.9078 Date: 2024-02-05 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 11ab0677d1..c863fda4f6 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9077 +# teal.modules.clinical 0.8.16.9078 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 1c8a977b5f84f52265c129664e44f444189c5f2b Mon Sep 17 00:00:00 2001 From: Abinaya Yogasekaram <73252787+ayogasekaram@users.noreply.github.com> Date: Mon, 5 Feb 2024 11:58:01 -0500 Subject: [PATCH 070/126] clean up documentation for `tm_a_mmrm` (#1041) closes #951 --------- Co-authored-by: Davide Garolini Co-authored-by: Emily de la Rua Co-authored-by: Emily de la Rua <59304861+edelarua@users.noreply.github.com> --- R/tm_a_mmrm.R | 75 ++++++++++++++++++++++------------------ man/template_fit_mmrm.Rd | 36 +++++++++++-------- man/tm_a_mmrm.Rd | 26 ++++++++------ 3 files changed, 79 insertions(+), 58 deletions(-) diff --git a/R/tm_a_mmrm.R b/R/tm_a_mmrm.R index 0e2956d764..d925547b82 100644 --- a/R/tm_a_mmrm.R +++ b/R/tm_a_mmrm.R @@ -1,16 +1,20 @@ -#' Template: Mixed Model Repeated Measurements (`MMRM`) analysis +#' Template: Mixed Model Repeated Measurements (MMRM) Analysis +#' +#' Creates a valid expression to generate analysis tables and plots for Mixed Model Repeated Measurements. #' #' @inheritParams template_arguments -#' @param method a string specifying the adjustment method. -#' @param cor_struct a string specifying the correlation structure, defaults to -#' `"unstructured"`. See the details. +#' @param method (`string`)\cr a string specifying the adjustment method. +#' @param cor_struct (`string`)\cr a string specifying the correlation structure, defaults to +#' `"unstructured"`. See [tern.mmrm::build_formula()] for more options. #' @param weights_emmeans argument from [emmeans::emmeans()], "proportional" by default. -#' @param parallel flag that controls whether optimizer search can use available free cores on the +#' @param parallel (`flag`)\cr flag that controls whether optimizer search can use available free cores on the #' machine (not default). #' +#' @inherit template_arguments return +#' #' @seealso [tm_a_mmrm()] -#' @keywords internal #' +#' @keywords internal template_fit_mmrm <- function(parentname, dataname, aval_var, @@ -150,14 +154,16 @@ template_fit_mmrm <- function(parentname, y } -#' @describeIn template_fit_mmrm +#' @describeIn template_fit_mmrm Creates valid expressions to generate MMRM LS means, covariance matrix, +#' fixed effects, and diagnostic tables. #' #' @inheritParams template_arguments -#' @param fit_name name of fitted `MMRM` object -#' @param show_relative should the "reduction" (`control - treatment`, default) or the "increase" -#' (`treatment - control`) be shown for the relative change from baseline -#' @param table_type (`character`)\cr -#' type of table to output. +#' @param fit_name (`string`)\cr name of fitted MMRM object. +#' @param show_relative (`string`)\cr should the "reduction" (`control - treatment`, default) or the "increase" +#' (`treatment - control`) be shown for the relative change from baseline. +#' @param table_type (`string`)\cr type of table to output. +#' +#' @keywords internal template_mmrm_tables <- function(parentname, dataname, fit_name, @@ -317,12 +323,16 @@ template_mmrm_tables <- function(parentname, y } -#' @describeIn template_fit_mmrm +#' @describeIn template_fit_mmrm Creates valid expressions to generate MMRM LS means and +#' diagnostic plots. #' #' @inheritParams template_arguments -#' @param lsmeans_plot a `list` of controls for LS means plot. See more [tern.mmrm::g_mmrm_lsmeans()] -#' @param diagnostic_plot a `list` of controls for diagnostic_plot. See more [tern.mmrm::g_mmrm_diagnostic()] +#' @param lsmeans_plot (named `list`)\cr a `list` of controls for LS means plot. +#' See more [tern.mmrm::g_mmrm_lsmeans()]. +#' @param diagnostic_plot (named `list`)\cr a `list` of controls for diagnostic_plot. +#' See more [tern.mmrm::g_mmrm_diagnostic()]. #' +#' @keywords internal template_mmrm_plots <- function(fit_name, lsmeans_plot = list( select = c("estimates", "contrasts"), @@ -336,8 +346,6 @@ template_mmrm_plots <- function(fit_name, ggplot2_args = teal.widgets::ggplot2_args()) { y <- list() - - if (!is.null(lsmeans_plot)) { parsed_ggplot2_args <- teal.widgets::parse_ggplot2_args( teal.widgets::resolve_ggplot2_args( @@ -430,22 +438,20 @@ template_mmrm_plots <- function(fit_name, y } -#' Teal Module: Teal module for Mixed Model Repeated Measurements (`MMRM`) analysis +#' teal Module: Mixed Model Repeated Measurements (MMRM) Analysis +#' +#' This module produces analysis tables and plots for Mixed Model Repeated Measurements. #' #' @inheritParams module_arguments #' @inheritParams template_mmrm_tables #' @inheritParams template_mmrm_plots -#' @param method (`choices_selected`)\cr -#' object with all available choices and preselected option for the adjustment method. -#' @param ggplot2_args optional, (`ggplot2_args`) \cr -#' object created by [`teal.widgets::ggplot2_args()`] with settings for all the plots or named list of `ggplot2_args` -#' objects for plot-specific settings. List names should match the following:\cr ` -#' c("default", "lsmeans", "diagnostic")`. -#' The argument is merged with option `teal.ggplot2_args` and with default module arguments -#' (hard coded in the module body).\cr For more details, see the help vignette:\cr -#' `vignette("custom-ggplot2-arguments", package = "teal.widgets")`. -#' -#' @export +#' @param method ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' all available choices and pre-selected option for the adjustment method. +#' @param ggplot2_args (`ggplot2_args`) \cr optional, object created by [`teal.widgets::ggplot2_args()`] +#' with settings for all the plots or named list of `ggplot2_args` objects for plot-specific settings. +#' List names should match the following: `c("default", "lsmeans", "diagnostic")`. The argument is merged +#' with option `teal.ggplot2_args` and with default module arguments (hard coded in the module body). +#' For more details, see the help vignette: `vignette("custom-ggplot2-arguments", package = "teal.widgets")`. #' #' @note #' The ordering of the input data sets can lead to slightly different numerical results or @@ -453,6 +459,8 @@ template_mmrm_plots <- function(fit_name, #' `lme4`. However, once convergence is achieved, the results are reliable up to #' numerical precision. #' +#' @inherit module_arguments return seealso +#' #' @examples #' arm_ref_comp <- list( #' ARMCD = list( @@ -502,6 +510,7 @@ template_mmrm_plots <- function(fit_name, #' shinyApp(app$ui, app$server) #' } #' +#' @export tm_a_mmrm <- function(label, dataname, parentname = ifelse( @@ -586,7 +595,7 @@ tm_a_mmrm <- function(label, ) } -#' @noRd +#' @keywords internal ui_mmrm <- function(id, ...) { a <- list(...) # module args ns <- shiny::NS(id) @@ -803,7 +812,7 @@ ui_mmrm <- function(id, ...) { ) } -#' @noRd +#' @keywords internal srv_mmrm <- function(id, data, reporter, @@ -901,7 +910,7 @@ srv_mmrm <- function(id, ) # selector_list includes cov_var as it is needed for validation rules - # but it is not needed for the merge so it is removed here + # but not needed to merge so it is removed here selector_list_without_cov <- shiny::reactive({ selector_list()[names(selector_list()) != "cov_var"] }) @@ -945,7 +954,7 @@ srv_mmrm <- function(id, show_plot_rv <- shiny::reactiveVal(FALSE) # this will store the current/last state of inputs and data that generated a model-fit - # its purpose is so that any input change can be checked whether it resulted in an out of sync state + # its purpose is to allow any input change to be checked whether it resulted in an out of sync state state <- shiny::reactiveValues(input = NULL, button_start = 0) # Note: diff --git a/man/template_fit_mmrm.Rd b/man/template_fit_mmrm.Rd index bd4988c39e..ab60502079 100644 --- a/man/template_fit_mmrm.Rd +++ b/man/template_fit_mmrm.Rd @@ -4,7 +4,7 @@ \alias{template_fit_mmrm} \alias{template_mmrm_tables} \alias{template_mmrm_plots} -\title{Template: Mixed Model Repeated Measurements (\code{MMRM}) analysis} +\title{Template: Mixed Model Repeated Measurements (MMRM) Analysis} \usage{ template_fit_mmrm( parentname, @@ -70,25 +70,24 @@ template_mmrm_plots( \item{conf_level}{(\code{numeric})\cr value for the confidence level within the range of (0, 1).} -\item{method}{a string specifying the adjustment method.} +\item{method}{(\code{string})\cr a string specifying the adjustment method.} -\item{cor_struct}{a string specifying the correlation structure, defaults to -\code{"unstructured"}. See the details.} +\item{cor_struct}{(\code{string})\cr a string specifying the correlation structure, defaults to +\code{"unstructured"}. See \code{\link[tern.mmrm:build_formula]{tern.mmrm::build_formula()}} for more options.} \item{weights_emmeans}{argument from \code{\link[emmeans:emmeans]{emmeans::emmeans()}}, "proportional" by default.} -\item{parallel}{flag that controls whether optimizer search can use available free cores on the +\item{parallel}{(\code{flag})\cr flag that controls whether optimizer search can use available free cores on the machine (not default).} -\item{fit_name}{name of fitted \code{MMRM} object} +\item{fit_name}{(\code{string})\cr name of fitted MMRM object.} \item{paramcd}{(\code{character})\cr name of the parameter code variable.} -\item{show_relative}{should the "reduction" (\code{control - treatment}, default) or the "increase" -(\code{treatment - control}) be shown for the relative change from baseline} +\item{show_relative}{(\code{string})\cr should the "reduction" (\code{control - treatment}, default) or the "increase" +(\code{treatment - control}) be shown for the relative change from baseline.} -\item{table_type}{(\code{character})\cr -type of table to output.} +\item{table_type}{(\code{string})\cr type of table to output.} \item{total_label}{(\code{string})\cr string to display as total column/row label if column/row is enabled (see \code{add_total}). Defaults to \code{"All Patients"}. To set a new default \code{total_label} to @@ -99,23 +98,30 @@ with settings for the module table. The argument is merged with option \code{tea module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} -\item{lsmeans_plot}{a \code{list} of controls for LS means plot. See more \code{\link[tern.mmrm:g_mmrm_lsmeans]{tern.mmrm::g_mmrm_lsmeans()}}} +\item{lsmeans_plot}{(named \code{list})\cr a \code{list} of controls for LS means plot. +See more \code{\link[tern.mmrm:g_mmrm_lsmeans]{tern.mmrm::g_mmrm_lsmeans()}}.} -\item{diagnostic_plot}{a \code{list} of controls for diagnostic_plot. See more \code{\link[tern.mmrm:g_mmrm_diagnostic]{tern.mmrm::g_mmrm_diagnostic()}}} +\item{diagnostic_plot}{(named \code{list})\cr a \code{list} of controls for diagnostic_plot. +See more \code{\link[tern.mmrm:g_mmrm_diagnostic]{tern.mmrm::g_mmrm_diagnostic()}}.} \item{ggplot2_args}{optional, (\code{ggplot2_args})\cr object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for the module plot. The argument is merged with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} } +\value{ +a \code{list} of expressions to generate a table or plot object. +} \description{ -Template: Mixed Model Repeated Measurements (\code{MMRM}) analysis +Creates a valid expression to generate analysis tables and plots for Mixed Model Repeated Measurements. } \section{Functions}{ \itemize{ -\item \code{template_mmrm_tables()}: +\item \code{template_mmrm_tables()}: Creates valid expressions to generate MMRM LS means, covariance matrix, +fixed effects, and diagnostic tables. -\item \code{template_mmrm_plots()}: +\item \code{template_mmrm_plots()}: Creates valid expressions to generate MMRM LS means and +diagnostic plots. }} \seealso{ diff --git a/man/tm_a_mmrm.Rd b/man/tm_a_mmrm.Rd index 5284ff2360..1e9176fcfa 100644 --- a/man/tm_a_mmrm.Rd +++ b/man/tm_a_mmrm.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tm_a_mmrm.R \name{tm_a_mmrm} \alias{tm_a_mmrm} -\title{Teal Module: Teal module for Mixed Model Repeated Measurements (\code{MMRM}) analysis} +\title{teal Module: Mixed Model Repeated Measurements (MMRM) Analysis} \usage{ tm_a_mmrm( label, @@ -64,8 +64,8 @@ reference and comparison arms when the arm variable is changed.} \item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} -\item{method}{(\code{choices_selected})\cr -object with all available choices and preselected option for the adjustment method.} +\item{method}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +all available choices and pre-selected option for the adjustment method.} \item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and pre-selected option for the confidence level, each within range of (0, 1).} @@ -91,15 +91,17 @@ with settings for the module table. The argument is merged with option \code{tea module arguments (hard coded in the module body). For more details, see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}.} -\item{ggplot2_args}{optional, (\code{ggplot2_args}) \cr -object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} with settings for all the plots or named list of \code{ggplot2_args} -objects for plot-specific settings. List names should match the following:\cr \code{ c("default", "lsmeans", "diagnostic")}. -The argument is merged with option \code{teal.ggplot2_args} and with default module arguments -(hard coded in the module body).\cr For more details, see the help vignette:\cr -\code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} +\item{ggplot2_args}{(\code{ggplot2_args}) \cr optional, object created by \code{\link[teal.widgets:ggplot2_args]{teal.widgets::ggplot2_args()}} +with settings for all the plots or named list of \code{ggplot2_args} objects for plot-specific settings. +List names should match the following: \code{c("default", "lsmeans", "diagnostic")}. The argument is merged +with option \code{teal.ggplot2_args} and with default module arguments (hard coded in the module body). +For more details, see the help vignette: \code{vignette("custom-ggplot2-arguments", package = "teal.widgets")}.} +} +\value{ +a \code{teal_module} object. } \description{ -Teal Module: Teal module for Mixed Model Repeated Measurements (\code{MMRM}) analysis +This module produces analysis tables and plots for Mixed Model Repeated Measurements. } \note{ The ordering of the input data sets can lead to slightly different numerical results or @@ -157,3 +159,7 @@ if (interactive()) { } } +\seealso{ +The \href{https://insightsengineering.github.io/tlg-catalog/stable/}{TLG Catalog} where additional example +apps implementing this module can be found. +} From 5f9caa427a4b4dc717ca869fced3f53dce67483d Mon Sep 17 00:00:00 2001 From: ayogasekaram Date: Mon, 5 Feb 2024 16:58:53 +0000 Subject: [PATCH 071/126] [skip actions] Bump version to 0.8.16.9079 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 296296a2ff..b010099771 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9078 +Version: 0.8.16.9079 Date: 2024-02-05 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index c863fda4f6..78bb5ac718 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9078 +# teal.modules.clinical 0.8.16.9079 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 3d6b9e2289d303083ba83b46b40dff7307e092ab Mon Sep 17 00:00:00 2001 From: kartikeya kirar Date: Fri, 9 Feb 2024 16:31:40 +0530 Subject: [PATCH 072/126] using library(`[package]`) and getFromNamespace(...) calls. (#1048) this fixes: https://github.com/insightsengineering/teal.modules.clinical/issues/1013 - [x] Replaced :::: with a getFromNamespace() function call. - [x] Replaced package:: with a library() function call. - [x] Removed the \donotrun tag. --- R/arm_ref_comp.R | 20 ++++++---- R/dynamic_assertions.R | 6 +-- R/facet_grid_formula.R | 3 +- R/labels.R | 2 - R/string_ops.R | 3 +- R/substitute_names.R | 10 +++-- R/tm_a_gee.R | 7 ++-- R/tm_a_mmrm.R | 7 ++-- R/tm_g_barchart_simple.R | 14 ++++--- R/tm_g_ci.R | 2 +- R/tm_g_forest_rsp.R | 14 ++++--- R/tm_g_forest_tte.R | 5 ++- R/tm_g_ipp.R | 15 +++---- R/tm_g_km.R | 2 +- R/tm_g_lineplot.R | 8 ++-- R/tm_g_pp_adverse_events.R | 5 ++- R/tm_g_pp_patient_timeline.R | 14 ++++--- R/tm_g_pp_therapy.R | 5 ++- R/tm_t_abnormality.R | 10 +++-- R/tm_t_abnormality_by_worst_grade.R | 8 ++-- R/tm_t_binary_outcome.R | 19 +++++---- R/tm_t_coxreg.R | 5 ++- R/tm_t_events.R | 2 +- R/tm_t_events_by_grade.R | 9 +++-- R/tm_t_events_patyear.R | 13 ++++--- R/tm_t_events_summary.R | 13 ++++--- R/tm_t_exposure.R | 15 ++++--- R/tm_t_logistic.R | 8 ++-- R/tm_t_mult_events.R | 2 +- R/tm_t_pp_prior_medication.R | 6 ++- R/utils.R | 54 +++++++++++++------------- R/validate_standard_inputs.R | 12 +++--- man/add_expr.Rd | 13 ++++--- man/arm_ref_comp_observer.Rd | 20 ++++++---- man/as_num.Rd | 3 +- man/bracket_expr.Rd | 2 +- man/call_concatenate.Rd | 9 +++-- man/column_annotation_label.Rd | 2 - man/dyn_assertion.Rd | 6 +-- man/facet_grid_formula.Rd | 3 +- man/h_concat_expr.Rd | 13 ++++--- man/pipe_expr.Rd | 5 +-- man/prepare_arm.Rd | 6 +-- man/prepare_arm_levels.Rd | 6 +-- man/substitute_names.Rd | 7 ++-- man/substitute_q.Rd | 3 +- man/tm_a_gee.Rd | 7 ++-- man/tm_a_mmrm.Rd | 7 ++-- man/tm_g_barchart_simple.Rd | 14 ++++--- man/tm_g_ci.Rd | 2 +- man/tm_g_forest_rsp.Rd | 14 ++++--- man/tm_g_forest_tte.Rd | 5 ++- man/tm_g_ipp.Rd | 15 +++---- man/tm_g_km.Rd | 2 +- man/tm_g_lineplot.Rd | 8 ++-- man/tm_g_pp_adverse_events.Rd | 5 ++- man/tm_g_pp_patient_timeline.Rd | 14 ++++--- man/tm_g_pp_therapy.Rd | 5 ++- man/tm_t_abnormality.Rd | 10 +++-- man/tm_t_abnormality_by_worst_grade.Rd | 7 +++- man/tm_t_binary_outcome.Rd | 19 +++++---- man/tm_t_coxreg.Rd | 5 ++- man/tm_t_events.Rd | 2 +- man/tm_t_events_by_grade.Rd | 9 +++-- man/tm_t_events_patyear.Rd | 13 ++++--- man/tm_t_events_summary.Rd | 13 ++++--- man/tm_t_exposure.Rd | 15 ++++--- man/tm_t_logistic.Rd | 8 ++-- man/tm_t_mult_events.Rd | 2 +- man/tm_t_pp_prior_medication.Rd | 6 ++- man/validate_standard_inputs.Rd | 12 +++--- 71 files changed, 360 insertions(+), 275 deletions(-) diff --git a/R/arm_ref_comp.R b/R/arm_ref_comp.R index 092ddbf86e..b337bedb31 100644 --- a/R/arm_ref_comp.R +++ b/R/arm_ref_comp.R @@ -25,6 +25,10 @@ #' @keywords internal #' #' @examples +#' library(teal.widgets) +#' library(shinyvalidate) +#' +#' arm_ref_comp_observer <- getFromNamespace("arm_ref_comp_observer", "teal.modules.clinical") #' #' arm_ref_comp <- list(ARMCD = list(ref = "ARM A", comp = c("ARM B"))) #' arm_var <- choices_selected(c("ARM", "ARMCD"), "ARMCD") @@ -34,22 +38,22 @@ #' ui <- fluidPage( #' sidebarLayout( #' sidebarPanel( -#' teal.widgets::optionalSelectInput( +#' optionalSelectInput( #' "arm", #' "Treatment Variable", #' choices = arm_var$choices, #' selected = arm_var$selected #' ), -#' shiny::uiOutput("arms_buckets") +#' uiOutput("arms_buckets") #' ), #' mainPanel( -#' shiny::textOutput("result") +#' textOutput("result") #' ) #' ) #' ) #' #' server <- function(input, output, session) { -#' iv_arm_ref <- teal.modules.clinical:::arm_ref_comp_observer( +#' iv_arm_ref <- arm_ref_comp_observer( #' session, #' input, #' output, @@ -59,16 +63,16 @@ #' module = "example" #' ) #' -#' output$result <- shiny::renderText({ -#' iv <- shinyvalidate::InputValidator$new() +#' output$result <- renderText({ +#' iv <- InputValidator$new() #' iv$add_validator(iv_arm_ref) #' iv$enable() -#' teal::validate_inputs(iv) +#' validate_inputs(iv) #' "Valid selection has been made!" #' }) #' } #' if (interactive()) { -#' shiny::shinyApp(ui, server) +#' shinyApp(ui, server) #' } arm_ref_comp_observer <- function(session, input, diff --git a/R/dynamic_assertions.R b/R/dynamic_assertions.R index fc922e96bc..9552e994e4 100644 --- a/R/dynamic_assertions.R +++ b/R/dynamic_assertions.R @@ -17,7 +17,7 @@ NULL #' #' library(assertthat) #' library(testthat) -#' expect_error(assertthat::assert_that(teal_enough_rows(data = iris, min_nrow = 1500))) +#' expect_error(assert_that(teal_enough_rows(data = iris, min_nrow = 1500))) teal_enough_rows <- function(data, min_nrow) nrow(data) >= min_nrow assertthat::on_failure(teal_enough_rows) <- function(call, env) { call[[1]] <- validate_enough_rows @@ -43,9 +43,9 @@ validate_enough_rows <- function(data, min_nrow) { #' @export #' #' @examples -#' +#' library(assertthat) #' armcd <- NULL -#' expect_error(assertthat::assert_that(teal_has_element(str = armcd, "ARMCD"))) +#' expect_error(assert_that(teal_has_element(str = armcd, "ARMCD"))) teal_has_element <- function(str, ...) length(str) > 0 assertthat::on_failure(teal_has_element) <- function(call, env) { call[[1]] <- validate_has_elements diff --git a/R/facet_grid_formula.R b/R/facet_grid_formula.R index 7dc7a4127c..2936aa6561 100644 --- a/R/facet_grid_formula.R +++ b/R/facet_grid_formula.R @@ -16,7 +16,8 @@ #' @keywords internal #' #' @examples -#' teal.modules.clinical:::facet_grid_formula("x", "y") +#' facet_grid_formula <- getFromNamespace("facet_grid_formula", "teal.modules.clinical") +#' facet_grid_formula("x", "y") facet_grid_formula <- function(x_facet, y_facet) { if (length(x_facet) == 0) x_facet <- "." if (length(y_facet) == 0) y_facet <- "." diff --git a/R/labels.R b/R/labels.R index ee629e8305..1422de5ca9 100644 --- a/R/labels.R +++ b/R/labels.R @@ -12,9 +12,7 @@ #' attr(data[["cyl"]], "label") <- "Cylinder" #' column_annotation_label(data, "cyl") #' column_annotation_label(data, "cyl", omit_raw_name = TRUE) -#' \dontrun{ #' column_annotation_label(tmc_ex_adsl, "ACTARM") -#' } #' @export column_annotation_label <- function(dataset, column, omit_raw_name = FALSE) { checkmate::assert_data_frame(dataset) diff --git a/R/string_ops.R b/R/string_ops.R index aba71ff30e..8b30ada904 100644 --- a/R/string_ops.R +++ b/R/string_ops.R @@ -14,13 +14,14 @@ #' associated with an list item. #' #' @examples +#' as_num <- getFromNamespace("as_num", "teal.modules.clinical") #' dta <- list( #' character = c("text10,20.5letter30.!", "!-.40$$-50e5[", NA), #' factor = factor(c("]+60e-6, 7.7%%8L", "%90sep.100\"1L", NA_character_)), #' numeric = c(1, -5e+2, NA), #' logical = c(TRUE, FALSE, NA) #' ) -#' lapply(dta, teal.modules.clinical:::as_num) +#' lapply(dta, as_num) #' @keywords internal as_num <- function(str) { # nolint # nousage UseMethod("as_num") diff --git a/R/substitute_names.R b/R/substitute_names.R index 3a0f7fc441..a8a224e7c5 100644 --- a/R/substitute_names.R +++ b/R/substitute_names.R @@ -13,9 +13,10 @@ #' @seealso [substitute_names()] #' #' @examples +#' substitute_q <- getFromNamespace("substitute_q", "teal.modules.clinical") #' x <- quote(a + b) #' substitute(x, list(a = 1, b = 2)) -#' teal.modules.clinical:::substitute_q(x, list(a = 1, b = 2)) +#' substitute_q(x, list(a = 1, b = 2)) #' @keywords internal substitute_q <- function(qexpr, env) { stopifnot(is.language(qexpr)) @@ -39,15 +40,16 @@ substitute_q <- function(qexpr, env) { #' @seealso [substitute_q()] #' #' @examples -#' teal.modules.clinical:::substitute_names( +#' substitute_names <- getFromNamespace("substitute_names", "teal.modules.clinical") +#' substitute_names( #' mutate(a = a + b, b = c + d), #' names = list(a = as.name("d"), b = as.name("e")) #' ) -#' teal.modules.clinical:::substitute_names( +#' substitute_names( #' c(a = fun(a), b = 3), #' names = list(a = as.name("b"), b = as.name("c")) #' ) -#' teal.modules.clinical:::substitute_names( +#' substitute_names( #' c(a = fun(a), b = bla), #' names = list(a = as.name("b"), b = as.name("c")), #' others = list(bla = "foo") diff --git a/R/tm_a_gee.R b/R/tm_a_gee.R index 4b79cb98d1..9651a65ec3 100644 --- a/R/tm_a_gee.R +++ b/R/tm_a_gee.R @@ -137,12 +137,13 @@ template_a_gee <- function(output_table, #' @inherit module_arguments return seealso #' #' @examples +#' library(dplyr) #' data <- teal_data() #' data <- within(data, { #' ADSL <- tmc_ex_adsl #' ADQS <- tmc_ex_adqs %>% -#' dplyr::filter(ABLFL != "Y" & ABLFL2 != "Y") %>% -#' dplyr::mutate( +#' filter(ABLFL != "Y" & ABLFL2 != "Y") %>% +#' mutate( #' AVISIT = as.factor(AVISIT), #' AVISITN = rank(AVISITN) %>% #' as.factor() %>% @@ -175,7 +176,7 @@ template_a_gee <- function(output_table, #' ) #' ) #' if (interactive()) { -#' shiny::shinyApp(app$ui, app$server) +#' shinyApp(app$ui, app$server) #' } #' #' @export diff --git a/R/tm_a_mmrm.R b/R/tm_a_mmrm.R index d925547b82..ee8c43c9ca 100644 --- a/R/tm_a_mmrm.R +++ b/R/tm_a_mmrm.R @@ -462,6 +462,7 @@ template_mmrm_plots <- function(fit_name, #' @inherit module_arguments return seealso #' #' @examples +#' library(dplyr) #' arm_ref_comp <- list( #' ARMCD = list( #' ref = "ARM B", @@ -473,9 +474,9 @@ template_mmrm_plots <- function(fit_name, #' data <- within(data, { #' ADSL <- tmc_ex_adsl #' ADQS <- tmc_ex_adqs %>% -#' dplyr::filter(ABLFL != "Y" & ABLFL2 != "Y") %>% -#' dplyr::filter(AVISIT %in% c("WEEK 1 DAY 8", "WEEK 2 DAY 15", "WEEK 3 DAY 22")) %>% -#' dplyr::mutate( +#' filter(ABLFL != "Y" & ABLFL2 != "Y") %>% +#' filter(AVISIT %in% c("WEEK 1 DAY 8", "WEEK 2 DAY 15", "WEEK 3 DAY 22")) %>% +#' mutate( #' AVISIT = as.factor(AVISIT), #' AVISITN = rank(AVISITN) %>% #' as.factor() %>% diff --git a/R/tm_g_barchart_simple.R b/R/tm_g_barchart_simple.R index ee06fc42ef..2b44ef2d05 100644 --- a/R/tm_g_barchart_simple.R +++ b/R/tm_g_barchart_simple.R @@ -17,22 +17,24 @@ #' #' @examples #' library(nestcolor) +#' library(dplyr) +#' library(formatters) #' #' ADSL <- tmc_ex_adsl %>% -#' dplyr::mutate(ITTFL = factor("Y") %>% -#' formatters::with_label("Intent-To-Treat Population Flag")) +#' mutate(ITTFL = factor("Y") %>% +#' with_label("Intent-To-Treat Population Flag")) #' ADAE <- tmc_ex_adae %>% -#' dplyr::filter(!((AETOXGR == 1) & (AESEV == "MILD") & (ARM == "A: Drug X"))) +#' filter(!((AETOXGR == 1) & (AESEV == "MILD") & (ARM == "A: Drug X"))) #' #' app <- init( #' data = cdisc_data( #' ADSL = ADSL, #' ADAE = ADAE, #' code = "ADSL <- tmc_ex_adsl %>% -#' dplyr::mutate(ITTFL = factor(\"Y\") %>% -#' formatters::with_label(\"Intent-To-Treat Population Flag\")) +#' mutate(ITTFL = factor(\"Y\") %>% +#' with_label(\"Intent-To-Treat Population Flag\")) #' ADAE <- tmc_ex_adae %>% -#' dplyr::filter(!((AETOXGR == 1) & (AESEV == \"MILD\") & (ARM == \"A: Drug X\")))" +#' filter(!((AETOXGR == 1) & (AESEV == \"MILD\") & (ARM == \"A: Drug X\")))" #' ), #' modules = modules( #' tm_g_barchart_simple( diff --git a/R/tm_g_ci.R b/R/tm_g_ci.R index dc0d4da744..8fcd559317 100644 --- a/R/tm_g_ci.R +++ b/R/tm_g_ci.R @@ -255,7 +255,7 @@ template_g_ci <- function(dataname, #' ) #' ), #' header = "Example of Confidence Interval Plot", -#' footer = shiny::tags$p( +#' footer = tags$p( #' class = "text-muted", "Source: `teal.modules.clinical::tm_g_ci`" #' ) #' ) diff --git a/R/tm_g_forest_rsp.R b/R/tm_g_forest_rsp.R index 22fb258b89..8263f195af 100644 --- a/R/tm_g_forest_rsp.R +++ b/R/tm_g_forest_rsp.R @@ -202,12 +202,14 @@ template_forest_rsp <- function(dataname = "ANL", #' #' @examples #' library(nestcolor) +#' library(dplyr) +#' library(formatters) #' #' ADSL <- tmc_ex_adsl #' ADRS <- tmc_ex_adrs %>% -#' dplyr::mutate(AVALC = tern::d_onco_rsp_label(AVALC) %>% -#' formatters::with_label("Character Result/Finding")) %>% -#' dplyr::filter(PARAMCD != "OVRINV" | AVISIT == "FOLLOW UP") +#' mutate(AVALC = d_onco_rsp_label(AVALC) %>% +#' with_label("Character Result/Finding")) %>% +#' filter(PARAMCD != "OVRINV" | AVISIT == "FOLLOW UP") #' #' arm_ref_comp <- list( #' ARM = list( @@ -227,9 +229,9 @@ template_forest_rsp <- function(dataname = "ANL", #' code = " #' ADSL <- tmc_ex_adsl #' ADRS <- tmc_ex_adrs %>% -#' dplyr::mutate(AVALC = tern::d_onco_rsp_label(AVALC) %>% -#' formatters::with_label(\"Character Result/Finding\")) %>% -#' dplyr::filter(PARAMCD != \"OVRINV\" | AVISIT == \"FOLLOW UP\") +#' mutate(AVALC = d_onco_rsp_label(AVALC) %>% +#' with_label(\"Character Result/Finding\")) %>% +#' filter(PARAMCD != \"OVRINV\" | AVISIT == \"FOLLOW UP\") #' " #' ), #' modules = modules( diff --git a/R/tm_g_forest_tte.R b/R/tm_g_forest_tte.R index f3105204f4..8b8805ca2c 100644 --- a/R/tm_g_forest_tte.R +++ b/R/tm_g_forest_tte.R @@ -210,10 +210,11 @@ template_forest_tte <- function(dataname = "ANL", #' #' @examples #' library(nestcolor) +#' library(formatters) #' #' ADSL <- tmc_ex_adsl #' ADTTE <- tmc_ex_adtte -#' ADSL$RACE <- droplevels(ADSL$RACE) %>% formatters::with_label("Race") +#' ADSL$RACE <- droplevels(ADSL$RACE) %>% with_label("Race") #' #' arm_ref_comp <- list( #' ARM = list( @@ -233,7 +234,7 @@ template_forest_tte <- function(dataname = "ANL", #' code = " #' ADSL <- tmc_ex_adsl #' ADTTE <- tmc_ex_adtte -#' ADSL$RACE <- droplevels(ADSL$RACE) %>% formatters::with_label(\"Race\") +#' ADSL$RACE <- droplevels(ADSL$RACE) %>% with_label(\"Race\") #' " #' ), #' modules = modules( diff --git a/R/tm_g_ipp.R b/R/tm_g_ipp.R index ff7083e7f1..8e00ecba9f 100644 --- a/R/tm_g_ipp.R +++ b/R/tm_g_ipp.R @@ -183,23 +183,24 @@ template_g_ipp <- function(dataname = "ANL", #' #' @examples #' library(nestcolor) +#' library(dplyr) #' #' ADSL <- tmc_ex_adsl %>% -#' dplyr::slice(1:20) %>% +#' slice(1:20) %>% #' df_explicit_na() #' ADLB <- tmc_ex_adlb %>% -#' dplyr::filter(USUBJID %in% ADSL$USUBJID) %>% +#' filter(USUBJID %in% ADSL$USUBJID) %>% #' df_explicit_na() %>% -#' dplyr::filter(AVISIT != "SCREENING") +#' filter(AVISIT != "SCREENING") #' #' app <- init( #' data = cdisc_data( #' ADSL = ADSL, #' ADLB = ADLB, #' code = " -#' ADSL <- tmc_ex_adsl %>% dplyr::slice(1:20) %>% df_explicit_na() -#' ADLB <- tmc_ex_adlb %>% dplyr::filter(USUBJID %in% ADSL$USUBJID) %>% -#' df_explicit_na() %>% dplyr::filter(AVISIT != \"SCREENING\") +#' ADSL <- tmc_ex_adsl %>% slice(1:20) %>% df_explicit_na() +#' ADLB <- tmc_ex_adlb %>% filter(USUBJID %in% ADSL$USUBJID) %>% +#' df_explicit_na() %>% filter(AVISIT != \"SCREENING\") #' " #' ), #' modules = modules( @@ -243,7 +244,7 @@ template_g_ipp <- function(dataname = "ANL", #' ) #' ) #' if (interactive()) { -#' shinyApp(ui = app$ui, server = app$server) +#' shinyApp(app$ui, app$server) #' } #' #' @export diff --git a/R/tm_g_km.R b/R/tm_g_km.R index a0773aa28b..c2f7adab07 100644 --- a/R/tm_g_km.R +++ b/R/tm_g_km.R @@ -295,7 +295,7 @@ template_g_km <- function(dataname = "ANL", #' ) #' ) #' if (interactive()) { -#' shinyApp(ui = app$ui, server = app$server) +#' shinyApp(app$ui, app$server) #' } #' #' @export diff --git a/R/tm_g_lineplot.R b/R/tm_g_lineplot.R index 6c6ca9ccad..12fd1f5a7c 100644 --- a/R/tm_g_lineplot.R +++ b/R/tm_g_lineplot.R @@ -208,9 +208,11 @@ template_g_lineplot <- function(dataname = "ANL", #' #' @examples #' library(nestcolor) +#' library(dplyr) +#' library(forcats) #' #' ADSL <- tmc_ex_adsl -#' ADLB <- tmc_ex_adlb %>% dplyr::mutate(AVISIT == forcats::fct_reorder(AVISIT, AVISITN, min)) +#' ADLB <- tmc_ex_adlb %>% mutate(AVISIT == fct_reorder(AVISIT, AVISITN, min)) #' #' app <- init( #' data = cdisc_data( @@ -218,7 +220,7 @@ template_g_lineplot <- function(dataname = "ANL", #' ADLB = ADLB, #' code = " #' ADSL <- tmc_ex_adsl -#' ADLB <- tmc_ex_adlb %>% dplyr::mutate(AVISIT == forcats::fct_reorder(AVISIT, AVISITN, min)) +#' ADLB <- tmc_ex_adlb %>% mutate(AVISIT == fct_reorder(AVISIT, AVISITN, min)) #' " #' ), #' modules = modules( @@ -241,7 +243,7 @@ template_g_lineplot <- function(dataname = "ANL", #' ) #' ) #' if (interactive()) { -#' shinyApp(ui = app$ui, server = app$server) +#' shinyApp(app$ui, app$server) #' } #' #' @export diff --git a/R/tm_g_pp_adverse_events.R b/R/tm_g_pp_adverse_events.R index 728435b402..8a9f86684a 100644 --- a/R/tm_g_pp_adverse_events.R +++ b/R/tm_g_pp_adverse_events.R @@ -190,9 +190,10 @@ template_adverse_events <- function(dataname = "ANL", #' #' @examples #' library(nestcolor) +#' library(dplyr) #' #' ADAE <- tmc_ex_adae -#' ADSL <- tmc_ex_adsl %>% dplyr::filter(USUBJID %in% ADAE$USUBJID) +#' ADSL <- tmc_ex_adsl %>% filter(USUBJID %in% ADAE$USUBJID) #' #' app <- init( #' data = cdisc_data( @@ -200,7 +201,7 @@ template_adverse_events <- function(dataname = "ANL", #' ADAE = ADAE, #' code = " #' ADAE <- tmc_ex_adae -#' ADSL <- tmc_ex_adsl %>% dplyr::filter(USUBJID %in% ADAE$USUBJID) +#' ADSL <- tmc_ex_adsl %>% filter(USUBJID %in% ADAE$USUBJID) #' " #' ), #' modules = modules( diff --git a/R/tm_g_pp_patient_timeline.R b/R/tm_g_pp_patient_timeline.R index 7103eac218..e7e4ba83eb 100644 --- a/R/tm_g_pp_patient_timeline.R +++ b/R/tm_g_pp_patient_timeline.R @@ -350,22 +350,24 @@ template_patient_timeline <- function(dataname = "ANL", #' #' @examples #' library(nestcolor) +#' library(dplyr) +#' library(formatters) #' #' data <- teal_data() #' data <- within(data, { #' ADAE <- tmc_ex_adae -#' ADSL <- tmc_ex_adsl %>% dplyr::filter(USUBJID %in% ADAE$USUBJID) -#' ADCM <- tmc_ex_adcm %>% dplyr::mutate( -#' CMSTDY = dplyr::case_when( +#' ADSL <- tmc_ex_adsl %>% filter(USUBJID %in% ADAE$USUBJID) +#' ADCM <- tmc_ex_adcm %>% mutate( +#' CMSTDY = case_when( #' CMCAT == "medcl B" ~ 20, #' CMCAT == "medcl C" ~ 150, #' TRUE ~ 1 -#' ) %>% formatters::with_label("Study Day of Start of Medication"), -#' CMENDY = dplyr::case_when( +#' ) %>% with_label("Study Day of Start of Medication"), +#' CMENDY = case_when( #' CMCAT == "medcl B" ~ 700, #' CMCAT == "medcl C" ~ 1000, #' TRUE ~ 500 -#' ) %>% formatters::with_label("Study Day of End of Medication"), +#' ) %>% with_label("Study Day of End of Medication"), #' CMASTDTM = ASTDTM, #' CMAENDTM = AENDTM #' ) diff --git a/R/tm_g_pp_therapy.R b/R/tm_g_pp_therapy.R index 0fcf150a7b..224fa5a925 100644 --- a/R/tm_g_pp_therapy.R +++ b/R/tm_g_pp_therapy.R @@ -252,9 +252,10 @@ template_therapy <- function(dataname = "ANL", #' #' @examples #' library(nestcolor) +#' library(dplyr) #' #' ADCM <- tmc_ex_adcm -#' ADSL <- tmc_ex_adsl %>% dplyr::filter(USUBJID %in% ADCM$USUBJID) +#' ADSL <- tmc_ex_adsl %>% filter(USUBJID %in% ADCM$USUBJID) #' ADCM$CMASTDTM <- ADCM$ASTDTM #' ADCM$CMAENDTM <- ADCM$AENDTM #' adcm_keys <- c("STUDYID", "USUBJID", "ASTDTM", "CMSEQ", "ATC1", "ATC2", "ATC3", "ATC4") @@ -268,7 +269,7 @@ template_therapy <- function(dataname = "ANL", #' ADCM = ADCM, #' code = " #' ADCM <- tmc_ex_adcm -#' ADSL <- tmc_ex_adsl %>% dplyr::filter(USUBJID %in% ADCM$USUBJID) +#' ADSL <- tmc_ex_adsl %>% filter(USUBJID %in% ADCM$USUBJID) #' ADCM$CMASTDTM <- ADCM$ASTDTM #' ADCM$CMAENDTM <- ADCM$AENDTM #' ", diff --git a/R/tm_t_abnormality.R b/R/tm_t_abnormality.R index f06c0fd285..d551821d6c 100644 --- a/R/tm_t_abnormality.R +++ b/R/tm_t_abnormality.R @@ -244,15 +244,19 @@ template_abnormality <- function(parentname, #' excluded in accordance with GDSR specifications by using `exclude_base_abn`. #' #' @examples +#' #' data <- teal_data() #' data <- within(data, { +#' library(dplyr) +#' library(formatters) +#' #' ADSL <- tmc_ex_adsl #' ADLB <- tmc_ex_adlb %>% -#' dplyr::mutate( -#' ONTRTFL = dplyr::case_when( +#' mutate( +#' ONTRTFL = case_when( #' AVISIT %in% c("SCREENING", "BASELINE") ~ "", #' TRUE ~ "Y" -#' ) %>% formatters::with_label("On Treatment Record Flag") +#' ) %>% with_label("On Treatment Record Flag") #' ) #' }) #' datanames <- c("ADSL", "ADLB") diff --git a/R/tm_t_abnormality_by_worst_grade.R b/R/tm_t_abnormality_by_worst_grade.R index 33e2116319..73992de9fd 100644 --- a/R/tm_t_abnormality_by_worst_grade.R +++ b/R/tm_t_abnormality_by_worst_grade.R @@ -252,11 +252,13 @@ template_abnormality_by_worst_grade <- function(parentname, # nolint #' #' @export #' -#' #' @examples +#' library(dplyr) +#' library(formatters) +#' #' ADSL <- tmc_ex_adsl #' ADLB <- tmc_ex_adlb %>% -#' dplyr::filter(!AVISIT %in% c("SCREENING", "BASELINE")) +#' filter(!AVISIT %in% c("SCREENING", "BASELINE")) #' #' app <- init( #' data = cdisc_data( @@ -265,7 +267,7 @@ template_abnormality_by_worst_grade <- function(parentname, # nolint #' code = " #' ADSL <- tmc_ex_adsl #' ADLB <- tmc_ex_adlb %>% -#' dplyr::filter(!AVISIT %in% c(\"SCREENING\", \"BASELINE\")) +#' filter(!AVISIT %in% c(\"SCREENING\", \"BASELINE\")) #' " #' ), #' modules = modules( diff --git a/R/tm_t_binary_outcome.R b/R/tm_t_binary_outcome.R index 7266dcf56e..7b3fa75d29 100644 --- a/R/tm_t_binary_outcome.R +++ b/R/tm_t_binary_outcome.R @@ -345,13 +345,16 @@ template_binary_outcome <- function(dataname, #' @inherit module_arguments return seealso #' #' @examples +#' library(dplyr) +#' library(formatters) +#' #' ADSL <- tmc_ex_adsl #' ADRS <- tmc_ex_adrs %>% -#' dplyr::mutate( -#' AVALC = tern::d_onco_rsp_label(AVALC) %>% -#' formatters::with_label("Character Result/Finding") +#' mutate( +#' AVALC = d_onco_rsp_label(AVALC) %>% +#' with_label("Character Result/Finding") #' ) %>% -#' dplyr::filter(PARAMCD != "OVRINV" | AVISIT == "FOLLOW UP") +#' filter(PARAMCD != "OVRINV" | AVISIT == "FOLLOW UP") #' #' arm_ref_comp <- list( #' ARMCD = list(ref = "ARM B", comp = c("ARM A", "ARM C")), @@ -364,11 +367,11 @@ template_binary_outcome <- function(dataname, #' code = " #' ADSL <- tmc_ex_adsl #' ADRS <- tmc_ex_adrs %>% -#' dplyr::mutate( -#' AVALC = tern::d_onco_rsp_label(AVALC) %>% -#' formatters::with_label(\"Character Result/Finding\") +#' mutate( +#' AVALC = d_onco_rsp_label(AVALC) %>% +#' with_label(\"Character Result/Finding\") #' ) %>% -#' dplyr::filter(PARAMCD != \"OVRINV\" | AVISIT == \"FOLLOW UP\") +#' filter(PARAMCD != \"OVRINV\" | AVISIT == \"FOLLOW UP\") #' " #' ), #' modules = modules( diff --git a/R/tm_t_coxreg.R b/R/tm_t_coxreg.R index d06dd264a5..bf1184f481 100644 --- a/R/tm_t_coxreg.R +++ b/R/tm_t_coxreg.R @@ -422,6 +422,7 @@ template_coxreg_m <- function(dataname, #' #' data <- teal_data() #' data <- within(data, { +#' library(dplyr) #' ADTTE <- data.frame( #' STUDYID = "LUNG", #' AVAL = c(4, 3, 1, 1, 2, 2, 3, 1, 2), @@ -437,8 +438,8 @@ template_coxreg_m <- function(dataname, #' INST = factor(c("A", "A", "B", "B", "A", "B", "A", "B", "A")), #' stringsAsFactors = FALSE #' ) -#' ADTTE <- base::rbind(ADTTE, ADTTE, ADTTE, ADTTE) -#' ADTTE <- dplyr::as_tibble(ADTTE) +#' ADTTE <- rbind(ADTTE, ADTTE, ADTTE, ADTTE) +#' ADTTE <- as_tibble(ADTTE) #' set.seed(1) #' ADTTE$INST <- sample(ADTTE$INST) #' ADTTE$AGE <- sample(seq(5, 75, 5), size = nrow(ADTTE), replace = TRUE) diff --git a/R/tm_t_events.R b/R/tm_t_events.R index bf82ddda98..6653d18a43 100644 --- a/R/tm_t_events.R +++ b/R/tm_t_events.R @@ -467,7 +467,7 @@ template_events <- function(dataname, #' ADSL <- tmc_ex_adsl #' ADAE <- tmc_ex_adae #' -#' app <- teal::init( +#' app <- init( #' data = cdisc_data( #' ADSL = ADSL, #' ADAE = ADAE, diff --git a/R/tm_t_events_by_grade.R b/R/tm_t_events_by_grade.R index 2a3470d71e..1b2553b36d 100644 --- a/R/tm_t_events_by_grade.R +++ b/R/tm_t_events_by_grade.R @@ -802,11 +802,14 @@ template_events_col_by_grade <- function(dataname, #' @examples #' data <- teal_data() #' data <- within(data, { +#' library(formatters) +#' library(dplyr) +#' #' ADSL <- tmc_ex_adsl -#' lbls_adae <- formatters::var_labels(tmc_ex_adae) +#' lbls_adae <- var_labels(tmc_ex_adae) #' ADAE <- tmc_ex_adae %>% -#' dplyr::mutate_if(is.character, as.factor) #' be certain of having factors -#' formatters::var_labels(ADAE) <- lbls_adae +#' mutate_if(is.character, as.factor) #' be certain of having factors +#' var_labels(ADAE) <- lbls_adae #' }) #' #' datanames <- c("ADSL", "ADAE") diff --git a/R/tm_t_events_patyear.R b/R/tm_t_events_patyear.R index 9765a93034..1483eae7f2 100644 --- a/R/tm_t_events_patyear.R +++ b/R/tm_t_events_patyear.R @@ -158,11 +158,12 @@ template_events_patyear <- function(dataname, #' @inherit module_arguments return seealso #' #' @examples +#' library(dplyr) #' ADSL <- tmc_ex_adsl #' ADAETTE <- tmc_ex_adaette %>% -#' dplyr::filter(PARAMCD %in% c("AETTE1", "AETTE2", "AETTE3")) %>% -#' dplyr::mutate(is_event = CNSR == 0) %>% -#' dplyr::mutate(n_events = as.integer(is_event)) +#' filter(PARAMCD %in% c("AETTE1", "AETTE2", "AETTE3")) %>% +#' mutate(is_event = CNSR == 0) %>% +#' mutate(n_events = as.integer(is_event)) #' #' app <- init( #' data = cdisc_data( @@ -171,9 +172,9 @@ template_events_patyear <- function(dataname, #' code = " #' ADSL <- tmc_ex_adsl #' ADAETTE <- tmc_ex_adaette %>% -#' dplyr::filter(PARAMCD %in% c(\"AETTE1\", \"AETTE2\", \"AETTE3\")) %>% -#' dplyr::mutate(is_event = CNSR == 0) %>% -#' dplyr::mutate(n_events = as.integer(is_event)) +#' filter(PARAMCD %in% c(\"AETTE1\", \"AETTE2\", \"AETTE3\")) %>% +#' mutate(is_event = CNSR == 0) %>% +#' mutate(n_events = as.integer(is_event)) #' " #' ), #' modules = modules( diff --git a/R/tm_t_events_summary.R b/R/tm_t_events_summary.R index 1753bc3fae..4384c7f0c1 100644 --- a/R/tm_t_events_summary.R +++ b/R/tm_t_events_summary.R @@ -504,20 +504,23 @@ template_events_summary <- function(anl_name, #' @inherit module_arguments return seealso #' #' @examples +#' library(dplyr) +#' library(formatters) +#' #' data <- teal_data() #' data <- within(data, { #' ADSL <- tmc_ex_adsl %>% -#' dplyr::mutate( -#' DTHFL = dplyr::case_when( #' nolint +#' mutate( +#' DTHFL = case_when( #' nolint #' !is.na(DTHDT) ~ "Y", #' TRUE ~ "" -#' ) %>% formatters::with_label("Subject Death Flag") +#' ) %>% with_label("Subject Death Flag") #' ) #' ADAE <- tmc_ex_adae #' #' add_event_flags <- function(dat) { #' dat <- dat %>% -#' dplyr::mutate( +#' mutate( #' TMPFL_SER = AESER == "Y", #' TMPFL_REL = AEREL == "Y", #' TMPFL_GR5 = AETOXGR == "5", @@ -533,7 +536,7 @@ template_events_summary <- function(anl_name, #' TMP_SMQ02 = aesi_label("Y.9.9.9.9/Z.9.9.9.9 AESI"), #' TMP_CQ01 = aesi_label(dat[["CQ01NAM"]]) #' ) -#' formatters::var_labels(dat)[names(column_labels)] <- as.character(column_labels) +#' var_labels(dat)[names(column_labels)] <- as.character(column_labels) #' dat #' } #' diff --git a/R/tm_t_exposure.R b/R/tm_t_exposure.R index 88f48f694a..0fae335f74 100644 --- a/R/tm_t_exposure.R +++ b/R/tm_t_exposure.R @@ -230,23 +230,26 @@ template_exposure <- function(parentname, #' @inherit module_arguments return seealso #' #' @examples +#' library(dplyr) +#' library(formatters) +#' #' data <- teal_data() #' data <- within(data, { #' ADSL <- tmc_ex_adsl #' ADEX <- tmc_ex_adex #' #' set.seed(1, kind = "Mersenne-Twister") -#' labels <- formatters::var_labels(ADEX, fill = FALSE) +#' labels <- var_labels(ADEX, fill = FALSE) #' ADEX <- ADEX %>% -#' dplyr::distinct(USUBJID, .keep_all = TRUE) %>% -#' dplyr::mutate( +#' distinct(USUBJID, .keep_all = TRUE) %>% +#' mutate( #' PARAMCD = "TDURD", #' PARAM = "Overall duration (days)", -#' AVAL = sample(x = seq(1, 200), size = dplyr::n(), replace = TRUE), +#' AVAL = sample(x = seq(1, 200), size = n(), replace = TRUE), #' AVALU = "Days" #' ) %>% -#' dplyr::bind_rows(ADEX) -#' formatters::var_labels(ADEX) <- labels +#' bind_rows(ADEX) +#' var_labels(ADEX) <- labels #' }) #' #' datanames <- c("ADSL", "ADEX") diff --git a/R/tm_t_logistic.R b/R/tm_t_logistic.R index ffdbc0790b..1561c0a851 100644 --- a/R/tm_t_logistic.R +++ b/R/tm_t_logistic.R @@ -227,9 +227,11 @@ template_logistic <- function(dataname, #' @inherit module_arguments return seealso #' #' @examples +#' library(dplyr) +#' #' ADSL <- tmc_ex_adsl #' ADRS <- tmc_ex_adrs %>% -#' dplyr::filter(PARAMCD %in% c("BESRSPI", "INVET")) +#' filter(PARAMCD %in% c("BESRSPI", "INVET")) #' #' arm_ref_comp <- list( #' ACTARMCD = list( @@ -249,7 +251,7 @@ template_logistic <- function(dataname, #' code = " #' ADSL <- tmc_ex_adsl #' ADRS <- tmc_ex_adrs %>% -#' dplyr::filter(PARAMCD %in% c(\"BESRSPI\", \"INVET\")) +#' filter(PARAMCD %in% c(\"BESRSPI\", \"INVET\")) #' " #' ), #' modules = modules( @@ -273,7 +275,7 @@ template_logistic <- function(dataname, #' ) #' ) #' if (interactive()) { -#' shinyApp(ui = app$ui, server = app$server) +#' shinyApp(app$ui, app$server) #' } #' #' @export diff --git a/R/tm_t_mult_events.R b/R/tm_t_mult_events.R index 14573f9eb3..71a2613ce3 100644 --- a/R/tm_t_mult_events.R +++ b/R/tm_t_mult_events.R @@ -294,7 +294,7 @@ template_mult_events <- function(dataname, #' join_keys <- default_cdisc_join_keys[c("ADSL", "ADCM")] #' join_keys["ADCM", "ADCM"] <- adcm_keys #' -#' app <- teal::init( +#' app <- init( #' data = cdisc_data( #' ADSL = ADSL, #' ADCM = ADCM, diff --git a/R/tm_t_pp_prior_medication.R b/R/tm_t_pp_prior_medication.R index afcd36ced9..048933d087 100644 --- a/R/tm_t_pp_prior_medication.R +++ b/R/tm_t_pp_prior_medication.R @@ -64,8 +64,10 @@ template_prior_medication <- function(dataname = "ANL", #' @inherit module_arguments return #' #' @examples +#' library(dplyr) +#' #' ADCM <- tmc_ex_adcm -#' ADSL <- tmc_ex_adsl %>% dplyr::filter(USUBJID %in% ADCM$USUBJID) +#' ADSL <- tmc_ex_adsl %>% filter(USUBJID %in% ADCM$USUBJID) #' ADCM$CMASTDTM <- ADCM$ASTDTM #' ADCM$CMAENDTM <- ADCM$AENDTM #' adcm_keys <- c("STUDYID", "USUBJID", "ASTDTM", "CMSEQ", "ATC1", "ATC2", "ATC3", "ATC4") @@ -79,7 +81,7 @@ template_prior_medication <- function(dataname = "ANL", #' ADCM = ADCM, #' code = " #' ADCM <- tmc_ex_adcm -#' ADSL <- tmc_ex_adsl %>% dplyr::filter(USUBJID %in% ADCM$USUBJID) +#' ADSL <- tmc_ex_adsl %>% filter(USUBJID %in% ADCM$USUBJID) #' ADCM$CMASTDTM <- ADCM$ASTDTM #' ADCM$CMAENDTM <- ADCM$AENDTM #' ", diff --git a/R/utils.R b/R/utils.R index c49a7c5d38..8ae7a1d21d 100644 --- a/R/utils.R +++ b/R/utils.R @@ -8,7 +8,8 @@ #' @export #' #' @examples -#' \dontrun{ +#' library(ggplot2) +#' #' # What we want to achieve #' call("+", quote(f), quote(g)) #' call("+", quote(f), call("+", quote(g), quote(h))) # parentheses not wanted @@ -20,15 +21,15 @@ #' call_concatenate(list(quote(f))) #' call_concatenate(list()) #' call_concatenate( -#' list(quote(ggplot2::ggplot(mtcars)), quote(ggplot2::geom_point(ggplot2::aes(wt, mpg)))) +#' list(quote(ggplot(mtcars)), quote(geom_point(aes(wt, mpg)))) #' ) #' #' eval( #' call_concatenate( -#' list(quote(ggplot2::ggplot(mtcars)), quote(ggplot2::geom_point(ggplot2::aes(wt, mpg)))) +#' list(quote(ggplot(mtcars)), quote(geom_point(aes(wt, mpg)))) #' ) #' ) -#' } +#' call_concatenate <- function(args, bin_op = "+") { checkmate::assert_string(bin_op) checkmate::assert_list(args, types = c("symbol", "name", "call", "expression")) @@ -82,16 +83,17 @@ get_var_labels <- function(datasets, dataname, vars) { #' #' @export #' @examples -#' expr <- quote( -#' rtables::basic_table() %>% -#' rtables::split_cols_by(var = "ARMCD") %>% +#' expr <- quote({ +#' library(rtables) +#' basic_table() %>% +#' split_cols_by(var = "ARMCD") %>% #' test_proportion_diff( #' vars = "rsp", method = "cmh", variables = list(strata = "strat") #' ) %>% -#' rtables::build_table(df = dta) -#' ) +#' build_table(df = dta) +#' }) #' -#' teal.modules.clinical:::h_concat_expr(expr) +#' h_concat_expr(expr) h_concat_expr <- function(expr) { expr <- deparse(expr) paste(expr, collapse = " ") @@ -109,14 +111,13 @@ h_concat_expr <- function(expr) { #' @export #' #' @examples -#' -#' result <- teal.modules.clinical:::pipe_expr( +#' pipe_expr( #' list( #' expr1 = substitute(df), #' expr2 = substitute(head) #' ) #' ) -#' result +#' pipe_expr <- function(exprs, pipe_str = "%>%") { exprs <- lapply(exprs, h_concat_expr) exprs <- unlist(exprs) @@ -142,13 +143,14 @@ pipe_expr <- function(exprs, pipe_str = "%>%") { #' @export #' #' @examples +#' library(rtables) #' #' lyt <- list() -#' lyt <- teal.modules.clinical:::add_expr(lyt, substitute(rtables::basic_table())) -#' lyt <- teal.modules.clinical:::add_expr( -#' lyt, substitute(rtables::split_cols_by(var = arm), env = list(armcd = "ARMCD")) +#' lyt <- add_expr(lyt, substitute(basic_table())) +#' lyt <- add_expr( +#' lyt, substitute(split_cols_by(var = arm), env = list(armcd = "ARMCD")) #' ) -#' lyt <- teal.modules.clinical:::add_expr( +#' lyt <- add_expr( #' lyt, #' substitute( #' test_proportion_diff( @@ -156,8 +158,8 @@ pipe_expr <- function(exprs, pipe_str = "%>%") { #' ) #' ) #' ) -#' lyt <- teal.modules.clinical:::add_expr(lyt, quote(rtables::build_table(df = dta))) -#' teal.modules.clinical:::pipe_expr(lyt) +#' lyt <- add_expr(lyt, quote(build_table(df = dta))) +#' pipe_expr(lyt) add_expr <- function(expr_ls, new_expr) { assertthat::assert_that( is.list(expr_ls), @@ -197,7 +199,7 @@ add_expr <- function(expr_ls, new_expr) { #' expr = anl <- subset(df, PARAMCD == param), #' env = list(df = as.name("adrs"), param = "INVET") #' ) -#' expr2 <- substitute(expr = anl$rsp_lab <- tern::d_onco_rsp_label(anl$AVALC)) +#' expr2 <- substitute(expr = anl$rsp_lab <- d_onco_rsp_label(anl$AVALC)) #' expr3 <- substitute( #' expr = { #' anl$is_rsp <- anl$rsp_lab %in% @@ -505,21 +507,19 @@ split_interactions <- function(x, by = "\\*|:") { #' @export #' #' @examples -#' \dontrun{ -#' teal.modules.clinical::prepare_arm( +#' prepare_arm( #' dataname = "adrs", #' arm_var = "ARMCD", #' ref_arm = "ARM A", #' comp_arm = c("ARM B", "ARM C") #' ) #' -#' teal.modules.clinical::prepare_arm( +#' prepare_arm( #' dataname = "adsl", #' arm_var = "ARMCD", #' ref_arm = c("ARM B", "ARM C"), #' comp_arm = "ARM A" #' ) -#' } #' prepare_arm <- function(dataname, arm_var, @@ -609,21 +609,19 @@ prepare_arm <- function(dataname, #' #' @export #' @examples -#' \dontrun{ -#' teal.modules.clinical::prepare_arm_levels( +#' prepare_arm_levels( #' dataname = "adae", #' parentname = "adsl", #' arm_var = "ARMCD", #' drop_arm_levels = TRUE #' ) #' -#' teal.modules.clinical::prepare_arm_levels( +#' prepare_arm_levels( #' dataname = "adae", #' parentname = "adsl", #' arm_var = "ARMCD", #' drop_arm_levels = FALSE #' ) -#' } #' prepare_arm_levels <- function(dataname, parentname, diff --git a/R/validate_standard_inputs.R b/R/validate_standard_inputs.R index 558341378d..ef97f391ea 100644 --- a/R/validate_standard_inputs.R +++ b/R/validate_standard_inputs.R @@ -20,15 +20,15 @@ #' #' @examples #' # Internal function - validate_standard_inputs -#' +#' validate_standard_inputs <- getFromNamespace("validate_standard_inputs", "teal.modules.clinical") #' adsl <- tmc_ex_adsl #' adae <- tmc_ex_adae #' #' ui <- fluidPage( -#' shiny::sliderInput("obs", "Max Age", +#' sliderInput("obs", "Max Age", #' min = 0, max = 100, value = 100 #' ), -#' shiny::sliderInput("maxgr", "Max Grade", +#' sliderInput("maxgr", "Max Grade", #' min = 0, max = 5, value = 5 #' ), #' plotOutput("plot") @@ -42,7 +42,7 @@ #' adsl_f <- adsl[adsl$AGE <= input$obs, keep_adsl] #' adae_f <- adae[as.numeric(adae$AETOXGR) <= input$maxgr, keep_adae] #' -#' teal.modules.clinical:::validate_standard_inputs( +#' validate_standard_inputs( #' adsl = adsl_f, #' adslvars = keep_adsl, #' anl = adae_f, @@ -68,7 +68,7 @@ #' adsl_f <- adsl[adsl$AGE <= input$obs, keep_adsl] #' adae_f <- adae[as.numeric(adae$AETOXGR) <= input$maxgr, keep_adae] #' -#' teal.modules.clinical:::validate_standard_inputs( +#' validate_standard_inputs( #' adsl = adsl_f, #' adslvars = keep_adsl, #' anl = adae_f, @@ -94,7 +94,7 @@ #' adsl_f <- adsl[adsl$AGE <= input$obs, keep_adsl] #' adae_f <- adae[as.numeric(adae$AETOXGR) <= input$maxgr, keep_adae] #' -#' teal.modules.clinical:::validate_standard_inputs( +#' validate_standard_inputs( #' adsl = adsl_f, #' adslvars = keep_adsl, #' anl = adae_f, diff --git a/man/add_expr.Rd b/man/add_expr.Rd index 6d29d36c35..f6c3e3e462 100644 --- a/man/add_expr.Rd +++ b/man/add_expr.Rd @@ -24,13 +24,14 @@ list. The list of expressions can be later used to generate a pipeline, for instance with \code{pipe_expr}. } \examples{ +library(rtables) lyt <- list() -lyt <- teal.modules.clinical:::add_expr(lyt, substitute(rtables::basic_table())) -lyt <- teal.modules.clinical:::add_expr( - lyt, substitute(rtables::split_cols_by(var = arm), env = list(armcd = "ARMCD")) +lyt <- add_expr(lyt, substitute(basic_table())) +lyt <- add_expr( + lyt, substitute(split_cols_by(var = arm), env = list(armcd = "ARMCD")) ) -lyt <- teal.modules.clinical:::add_expr( +lyt <- add_expr( lyt, substitute( test_proportion_diff( @@ -38,6 +39,6 @@ lyt <- teal.modules.clinical:::add_expr( ) ) ) -lyt <- teal.modules.clinical:::add_expr(lyt, quote(rtables::build_table(df = dta))) -teal.modules.clinical:::pipe_expr(lyt) +lyt <- add_expr(lyt, quote(build_table(df = dta))) +pipe_expr(lyt) } diff --git a/man/arm_ref_comp_observer.Rd b/man/arm_ref_comp_observer.Rd index 7fe4e68fee..c2e49a34f4 100644 --- a/man/arm_ref_comp_observer.Rd +++ b/man/arm_ref_comp_observer.Rd @@ -58,6 +58,10 @@ and comparison arm Updates the reference and comparison Treatments when the selected Treatment variable changes } \examples{ +library(teal.widgets) +library(shinyvalidate) + +arm_ref_comp_observer <- getFromNamespace("arm_ref_comp_observer", "teal.modules.clinical") arm_ref_comp <- list(ARMCD = list(ref = "ARM A", comp = c("ARM B"))) arm_var <- choices_selected(c("ARM", "ARMCD"), "ARMCD") @@ -67,22 +71,22 @@ adsl <- data.frame(ARM = c("ARM 1", "ARM 2"), ARMCD = c("ARM A", "ARM B")) ui <- fluidPage( sidebarLayout( sidebarPanel( - teal.widgets::optionalSelectInput( + optionalSelectInput( "arm", "Treatment Variable", choices = arm_var$choices, selected = arm_var$selected ), - shiny::uiOutput("arms_buckets") + uiOutput("arms_buckets") ), mainPanel( - shiny::textOutput("result") + textOutput("result") ) ) ) server <- function(input, output, session) { - iv_arm_ref <- teal.modules.clinical:::arm_ref_comp_observer( + iv_arm_ref <- arm_ref_comp_observer( session, input, output, @@ -92,16 +96,16 @@ server <- function(input, output, session) { module = "example" ) - output$result <- shiny::renderText({ - iv <- shinyvalidate::InputValidator$new() + output$result <- renderText({ + iv <- InputValidator$new() iv$add_validator(iv_arm_ref) iv$enable() - teal::validate_inputs(iv) + validate_inputs(iv) "Valid selection has been made!" }) } if (interactive()) { - shiny::shinyApp(ui, server) + shinyApp(ui, server) } } \keyword{internal} diff --git a/man/as_num.Rd b/man/as_num.Rd index 69cb4e8fa3..f74d54fee8 100644 --- a/man/as_num.Rd +++ b/man/as_num.Rd @@ -38,12 +38,13 @@ The function is intended to extract any numeric from a character string, factor levels, boolean and return a vector of numeric. } \examples{ +as_num <- getFromNamespace("as_num", "teal.modules.clinical") dta <- list( character = c("text10,20.5letter30.!", "!-.40$$-50e5[", NA), factor = factor(c("]+60e-6, 7.7\%\%8L", "\%90sep.100\"1L", NA_character_)), numeric = c(1, -5e+2, NA), logical = c(TRUE, FALSE, NA) ) -lapply(dta, teal.modules.clinical:::as_num) +lapply(dta, as_num) } \keyword{internal} diff --git a/man/bracket_expr.Rd b/man/bracket_expr.Rd index 45140af384..6d242c273c 100644 --- a/man/bracket_expr.Rd +++ b/man/bracket_expr.Rd @@ -21,7 +21,7 @@ expr1 <- substitute( expr = anl <- subset(df, PARAMCD == param), env = list(df = as.name("adrs"), param = "INVET") ) -expr2 <- substitute(expr = anl$rsp_lab <- tern::d_onco_rsp_label(anl$AVALC)) +expr2 <- substitute(expr = anl$rsp_lab <- d_onco_rsp_label(anl$AVALC)) expr3 <- substitute( expr = { anl$is_rsp <- anl$rsp_lab \%in\% diff --git a/man/call_concatenate.Rd b/man/call_concatenate.Rd index ba4322e6a1..d085a6bf0e 100644 --- a/man/call_concatenate.Rd +++ b/man/call_concatenate.Rd @@ -15,7 +15,8 @@ call_concatenate(args, bin_op = "+") e.g. combine with \code{+} for \code{ggplot} without introducing parentheses due to associativity } \examples{ -\dontrun{ +library(ggplot2) + # What we want to achieve call("+", quote(f), quote(g)) call("+", quote(f), call("+", quote(g), quote(h))) # parentheses not wanted @@ -27,13 +28,13 @@ call_concatenate(list(quote(f), quote(g), quote(h))) call_concatenate(list(quote(f))) call_concatenate(list()) call_concatenate( - list(quote(ggplot2::ggplot(mtcars)), quote(ggplot2::geom_point(ggplot2::aes(wt, mpg)))) + list(quote(ggplot(mtcars)), quote(geom_point(aes(wt, mpg)))) ) eval( call_concatenate( - list(quote(ggplot2::ggplot(mtcars)), quote(ggplot2::geom_point(ggplot2::aes(wt, mpg)))) + list(quote(ggplot(mtcars)), quote(geom_point(aes(wt, mpg)))) ) ) -} + } diff --git a/man/column_annotation_label.Rd b/man/column_annotation_label.Rd index 8ade5c5139..c3da327788 100644 --- a/man/column_annotation_label.Rd +++ b/man/column_annotation_label.Rd @@ -25,7 +25,5 @@ column_annotation_label(data, "cyl") attr(data[["cyl"]], "label") <- "Cylinder" column_annotation_label(data, "cyl") column_annotation_label(data, "cyl", omit_raw_name = TRUE) -\dontrun{ column_annotation_label(tmc_ex_adsl, "ACTARM") } -} diff --git a/man/dyn_assertion.Rd b/man/dyn_assertion.Rd index 9b9881a0b6..2b81889c25 100644 --- a/man/dyn_assertion.Rd +++ b/man/dyn_assertion.Rd @@ -33,9 +33,9 @@ Verifies assertions for dynamic outputs. library(assertthat) library(testthat) -expect_error(assertthat::assert_that(teal_enough_rows(data = iris, min_nrow = 1500))) - +expect_error(assert_that(teal_enough_rows(data = iris, min_nrow = 1500))) +library(assertthat) armcd <- NULL -expect_error(assertthat::assert_that(teal_has_element(str = armcd, "ARMCD"))) +expect_error(assert_that(teal_has_element(str = armcd, "ARMCD"))) } \keyword{internal} diff --git a/man/facet_grid_formula.Rd b/man/facet_grid_formula.Rd index c72d2c2c48..ad3d59b879 100644 --- a/man/facet_grid_formula.Rd +++ b/man/facet_grid_formula.Rd @@ -21,6 +21,7 @@ facet grid formula \code{formula(x_facet ~ y_facet)} Replaces \code{x_facet} or \code{y_facet} by . when empty character } \examples{ -teal.modules.clinical:::facet_grid_formula("x", "y") +facet_grid_formula <- getFromNamespace("facet_grid_formula", "teal.modules.clinical") +facet_grid_formula("x", "y") } \keyword{internal} diff --git a/man/h_concat_expr.Rd b/man/h_concat_expr.Rd index dea097465b..ec12d0d8f1 100644 --- a/man/h_concat_expr.Rd +++ b/man/h_concat_expr.Rd @@ -16,14 +16,15 @@ a \code{string}. Deparse an expression into a \code{string}. } \examples{ -expr <- quote( - rtables::basic_table() \%>\% - rtables::split_cols_by(var = "ARMCD") \%>\% +expr <- quote({ + library(rtables) + basic_table() \%>\% + split_cols_by(var = "ARMCD") \%>\% test_proportion_diff( vars = "rsp", method = "cmh", variables = list(strata = "strat") ) \%>\% - rtables::build_table(df = dta) -) + build_table(df = dta) +}) -teal.modules.clinical:::h_concat_expr(expr) +h_concat_expr(expr) } diff --git a/man/pipe_expr.Rd b/man/pipe_expr.Rd index 05427db8ec..13ad7d36b5 100644 --- a/man/pipe_expr.Rd +++ b/man/pipe_expr.Rd @@ -16,12 +16,11 @@ pipeline (\verb{\%>\%}).} Concatenate expressions in a single pipeline-flavor expression. } \examples{ - -result <- teal.modules.clinical:::pipe_expr( +pipe_expr( list( expr1 = substitute(df), expr2 = substitute(head) ) ) -result + } diff --git a/man/prepare_arm.Rd b/man/prepare_arm.Rd index e5df0f7ecc..373fed6611 100644 --- a/man/prepare_arm.Rd +++ b/man/prepare_arm.Rd @@ -55,20 +55,18 @@ arm are dropped. } } \examples{ -\dontrun{ -teal.modules.clinical::prepare_arm( +prepare_arm( dataname = "adrs", arm_var = "ARMCD", ref_arm = "ARM A", comp_arm = c("ARM B", "ARM C") ) -teal.modules.clinical::prepare_arm( +prepare_arm( dataname = "adsl", arm_var = "ARMCD", ref_arm = c("ARM B", "ARM C"), comp_arm = "ARM A" ) -} } diff --git a/man/prepare_arm_levels.Rd b/man/prepare_arm_levels.Rd index bf3872e3d3..e05df620c6 100644 --- a/man/prepare_arm_levels.Rd +++ b/man/prepare_arm_levels.Rd @@ -23,20 +23,18 @@ This function generates the standard expression for pre-processing of dataset arm levels in and is used to apply the same steps in safety teal modules. } \examples{ -\dontrun{ -teal.modules.clinical::prepare_arm_levels( +prepare_arm_levels( dataname = "adae", parentname = "adsl", arm_var = "ARMCD", drop_arm_levels = TRUE ) -teal.modules.clinical::prepare_arm_levels( +prepare_arm_levels( dataname = "adae", parentname = "adsl", arm_var = "ARMCD", drop_arm_levels = FALSE ) -} } diff --git a/man/substitute_names.Rd b/man/substitute_names.Rd index 56a66ad008..8a50ea6478 100644 --- a/man/substitute_names.Rd +++ b/man/substitute_names.Rd @@ -46,15 +46,16 @@ Note that this is just a synonym for \code{\link[=substitute_q]{substitute_q()}} }} \examples{ -teal.modules.clinical:::substitute_names( +substitute_names <- getFromNamespace("substitute_names", "teal.modules.clinical") +substitute_names( mutate(a = a + b, b = c + d), names = list(a = as.name("d"), b = as.name("e")) ) -teal.modules.clinical:::substitute_names( +substitute_names( c(a = fun(a), b = 3), names = list(a = as.name("b"), b = as.name("c")) ) -teal.modules.clinical:::substitute_names( +substitute_names( c(a = fun(a), b = bla), names = list(a = as.name("b"), b = as.name("c")), others = list(bla = "foo") diff --git a/man/substitute_q.Rd b/man/substitute_q.Rd index d95848e2cb..a5217aaadb 100644 --- a/man/substitute_q.Rd +++ b/man/substitute_q.Rd @@ -23,9 +23,10 @@ a quoted expression. This is simplified from the package \code{pryr} to avoid another dependency. } \examples{ +substitute_q <- getFromNamespace("substitute_q", "teal.modules.clinical") x <- quote(a + b) substitute(x, list(a = 1, b = 2)) -teal.modules.clinical:::substitute_q(x, list(a = 1, b = 2)) +substitute_q(x, list(a = 1, b = 2)) } \seealso{ \code{\link[=substitute_names]{substitute_names()}} diff --git a/man/tm_a_gee.Rd b/man/tm_a_gee.Rd index 10d2d2ad33..d69fd99c5c 100644 --- a/man/tm_a_gee.Rd +++ b/man/tm_a_gee.Rd @@ -79,12 +79,13 @@ a \code{teal_module} object. This module produces an analysis table using Generalized Estimating Equations (GEE). } \examples{ +library(dplyr) data <- teal_data() data <- within(data, { ADSL <- tmc_ex_adsl ADQS <- tmc_ex_adqs \%>\% - dplyr::filter(ABLFL != "Y" & ABLFL2 != "Y") \%>\% - dplyr::mutate( + filter(ABLFL != "Y" & ABLFL2 != "Y") \%>\% + mutate( AVISIT = as.factor(AVISIT), AVISITN = rank(AVISITN) \%>\% as.factor() \%>\% @@ -117,7 +118,7 @@ app <- init( ) ) if (interactive()) { - shiny::shinyApp(app$ui, app$server) + shinyApp(app$ui, app$server) } } diff --git a/man/tm_a_mmrm.Rd b/man/tm_a_mmrm.Rd index 1e9176fcfa..bd5fcca7f1 100644 --- a/man/tm_a_mmrm.Rd +++ b/man/tm_a_mmrm.Rd @@ -110,6 +110,7 @@ different convergence behavior. This is a known observation with the used packag numerical precision. } \examples{ +library(dplyr) arm_ref_comp <- list( ARMCD = list( ref = "ARM B", @@ -121,9 +122,9 @@ data <- teal_data() data <- within(data, { ADSL <- tmc_ex_adsl ADQS <- tmc_ex_adqs \%>\% - dplyr::filter(ABLFL != "Y" & ABLFL2 != "Y") \%>\% - dplyr::filter(AVISIT \%in\% c("WEEK 1 DAY 8", "WEEK 2 DAY 15", "WEEK 3 DAY 22")) \%>\% - dplyr::mutate( + filter(ABLFL != "Y" & ABLFL2 != "Y") \%>\% + filter(AVISIT \%in\% c("WEEK 1 DAY 8", "WEEK 2 DAY 15", "WEEK 3 DAY 22")) \%>\% + mutate( AVISIT = as.factor(AVISIT), AVISITN = rank(AVISITN) \%>\% as.factor() \%>\% diff --git a/man/tm_g_barchart_simple.Rd b/man/tm_g_barchart_simple.Rd index ae6b2756d7..61a9ffbd00 100644 --- a/man/tm_g_barchart_simple.Rd +++ b/man/tm_g_barchart_simple.Rd @@ -60,22 +60,24 @@ Categories can be defined up to four levels deep and are defined through the \co } \examples{ library(nestcolor) +library(dplyr) +library(formatters) ADSL <- tmc_ex_adsl \%>\% - dplyr::mutate(ITTFL = factor("Y") \%>\% - formatters::with_label("Intent-To-Treat Population Flag")) + mutate(ITTFL = factor("Y") \%>\% + with_label("Intent-To-Treat Population Flag")) ADAE <- tmc_ex_adae \%>\% - dplyr::filter(!((AETOXGR == 1) & (AESEV == "MILD") & (ARM == "A: Drug X"))) + filter(!((AETOXGR == 1) & (AESEV == "MILD") & (ARM == "A: Drug X"))) app <- init( data = cdisc_data( ADSL = ADSL, ADAE = ADAE, code = "ADSL <- tmc_ex_adsl \%>\% - dplyr::mutate(ITTFL = factor(\"Y\") \%>\% - formatters::with_label(\"Intent-To-Treat Population Flag\")) + mutate(ITTFL = factor(\"Y\") \%>\% + with_label(\"Intent-To-Treat Population Flag\")) ADAE <- tmc_ex_adae \%>\% - dplyr::filter(!((AETOXGR == 1) & (AESEV == \"MILD\") & (ARM == \"A: Drug X\")))" + filter(!((AETOXGR == 1) & (AESEV == \"MILD\") & (ARM == \"A: Drug X\")))" ), modules = modules( tm_g_barchart_simple( diff --git a/man/tm_g_ci.Rd b/man/tm_g_ci.Rd index 1f1175f634..624fc3a0ad 100644 --- a/man/tm_g_ci.Rd +++ b/man/tm_g_ci.Rd @@ -123,7 +123,7 @@ app <- init( ) ), header = "Example of Confidence Interval Plot", - footer = shiny::tags$p( + footer = tags$p( class = "text-muted", "Source: `teal.modules.clinical::tm_g_ci`" ) ) diff --git a/man/tm_g_forest_rsp.Rd b/man/tm_g_forest_rsp.Rd index ff064677f4..c9e6ac0626 100644 --- a/man/tm_g_forest_rsp.Rd +++ b/man/tm_g_forest_rsp.Rd @@ -99,12 +99,14 @@ This module produces a grid-style forest plot for response data with ADaM struct } \examples{ library(nestcolor) +library(dplyr) +library(formatters) ADSL <- tmc_ex_adsl ADRS <- tmc_ex_adrs \%>\% - dplyr::mutate(AVALC = tern::d_onco_rsp_label(AVALC) \%>\% - formatters::with_label("Character Result/Finding")) \%>\% - dplyr::filter(PARAMCD != "OVRINV" | AVISIT == "FOLLOW UP") + mutate(AVALC = d_onco_rsp_label(AVALC) \%>\% + with_label("Character Result/Finding")) \%>\% + filter(PARAMCD != "OVRINV" | AVISIT == "FOLLOW UP") arm_ref_comp <- list( ARM = list( @@ -124,9 +126,9 @@ app <- init( code = " ADSL <- tmc_ex_adsl ADRS <- tmc_ex_adrs \%>\% - dplyr::mutate(AVALC = tern::d_onco_rsp_label(AVALC) \%>\% - formatters::with_label(\"Character Result/Finding\")) \%>\% - dplyr::filter(PARAMCD != \"OVRINV\" | AVISIT == \"FOLLOW UP\") + mutate(AVALC = d_onco_rsp_label(AVALC) \%>\% + with_label(\"Character Result/Finding\")) \%>\% + filter(PARAMCD != \"OVRINV\" | AVISIT == \"FOLLOW UP\") " ), modules = modules( diff --git a/man/tm_g_forest_tte.Rd b/man/tm_g_forest_tte.Rd index da5b525f31..4b12451ec8 100644 --- a/man/tm_g_forest_tte.Rd +++ b/man/tm_g_forest_tte.Rd @@ -99,10 +99,11 @@ This module produces a grid-style forest plot for time-to-event data with ADaM s } \examples{ library(nestcolor) +library(formatters) ADSL <- tmc_ex_adsl ADTTE <- tmc_ex_adtte -ADSL$RACE <- droplevels(ADSL$RACE) \%>\% formatters::with_label("Race") +ADSL$RACE <- droplevels(ADSL$RACE) \%>\% with_label("Race") arm_ref_comp <- list( ARM = list( @@ -122,7 +123,7 @@ app <- init( code = " ADSL <- tmc_ex_adsl ADTTE <- tmc_ex_adtte - ADSL$RACE <- droplevels(ADSL$RACE) \%>\% formatters::with_label(\"Race\") + ADSL$RACE <- droplevels(ADSL$RACE) \%>\% with_label(\"Race\") " ), modules = modules( diff --git a/man/tm_g_ipp.Rd b/man/tm_g_ipp.Rd index 76bb75ee8f..302b658c20 100644 --- a/man/tm_g_ipp.Rd +++ b/man/tm_g_ipp.Rd @@ -102,23 +102,24 @@ values over time for each patient, using data with ADaM structure. } \examples{ library(nestcolor) +library(dplyr) ADSL <- tmc_ex_adsl \%>\% - dplyr::slice(1:20) \%>\% + slice(1:20) \%>\% df_explicit_na() ADLB <- tmc_ex_adlb \%>\% - dplyr::filter(USUBJID \%in\% ADSL$USUBJID) \%>\% + filter(USUBJID \%in\% ADSL$USUBJID) \%>\% df_explicit_na() \%>\% - dplyr::filter(AVISIT != "SCREENING") + filter(AVISIT != "SCREENING") app <- init( data = cdisc_data( ADSL = ADSL, ADLB = ADLB, code = " - ADSL <- tmc_ex_adsl \%>\% dplyr::slice(1:20) \%>\% df_explicit_na() - ADLB <- tmc_ex_adlb \%>\% dplyr::filter(USUBJID \%in\% ADSL$USUBJID) \%>\% - df_explicit_na() \%>\% dplyr::filter(AVISIT != \"SCREENING\") + ADSL <- tmc_ex_adsl \%>\% slice(1:20) \%>\% df_explicit_na() + ADLB <- tmc_ex_adlb \%>\% filter(USUBJID \%in\% ADSL$USUBJID) \%>\% + df_explicit_na() \%>\% filter(AVISIT != \"SCREENING\") " ), modules = modules( @@ -162,7 +163,7 @@ app <- init( ) ) if (interactive()) { - shinyApp(ui = app$ui, server = app$server) + shinyApp(app$ui, app$server) } } diff --git a/man/tm_g_km.Rd b/man/tm_g_km.Rd index 8a3df74a27..b63f761c33 100644 --- a/man/tm_g_km.Rd +++ b/man/tm_g_km.Rd @@ -138,7 +138,7 @@ app <- init( ) ) if (interactive()) { - shinyApp(ui = app$ui, server = app$server) + shinyApp(app$ui, app$server) } } diff --git a/man/tm_g_lineplot.Rd b/man/tm_g_lineplot.Rd index 43a286d5a4..456da73514 100644 --- a/man/tm_g_lineplot.Rd +++ b/man/tm_g_lineplot.Rd @@ -112,9 +112,11 @@ This module produces a \code{\link[ggplot2:ggplot]{ggplot2::ggplot()}} type line } \examples{ library(nestcolor) +library(dplyr) +library(forcats) ADSL <- tmc_ex_adsl -ADLB <- tmc_ex_adlb \%>\% dplyr::mutate(AVISIT == forcats::fct_reorder(AVISIT, AVISITN, min)) +ADLB <- tmc_ex_adlb \%>\% mutate(AVISIT == fct_reorder(AVISIT, AVISITN, min)) app <- init( data = cdisc_data( @@ -122,7 +124,7 @@ app <- init( ADLB = ADLB, code = " ADSL <- tmc_ex_adsl - ADLB <- tmc_ex_adlb \%>\% dplyr::mutate(AVISIT == forcats::fct_reorder(AVISIT, AVISITN, min)) + ADLB <- tmc_ex_adlb \%>\% mutate(AVISIT == fct_reorder(AVISIT, AVISITN, min)) " ), modules = modules( @@ -145,7 +147,7 @@ app <- init( ) ) if (interactive()) { - shinyApp(ui = app$ui, server = app$server) + shinyApp(app$ui, app$server) } } diff --git a/man/tm_g_pp_adverse_events.Rd b/man/tm_g_pp_adverse_events.Rd index d4224ef100..dc1fcc4573 100644 --- a/man/tm_g_pp_adverse_events.Rd +++ b/man/tm_g_pp_adverse_events.Rd @@ -81,9 +81,10 @@ This module produces an adverse events table and \code{\link[ggplot2:ggplot]{ggp } \examples{ library(nestcolor) +library(dplyr) ADAE <- tmc_ex_adae -ADSL <- tmc_ex_adsl \%>\% dplyr::filter(USUBJID \%in\% ADAE$USUBJID) +ADSL <- tmc_ex_adsl \%>\% filter(USUBJID \%in\% ADAE$USUBJID) app <- init( data = cdisc_data( @@ -91,7 +92,7 @@ app <- init( ADAE = ADAE, code = " ADAE <- tmc_ex_adae - ADSL <- tmc_ex_adsl \%>\% dplyr::filter(USUBJID \%in\% ADAE$USUBJID) + ADSL <- tmc_ex_adsl \%>\% filter(USUBJID \%in\% ADAE$USUBJID) " ), modules = modules( diff --git a/man/tm_g_pp_patient_timeline.Rd b/man/tm_g_pp_patient_timeline.Rd index 9dbf7c6982..1656f61da1 100644 --- a/man/tm_g_pp_patient_timeline.Rd +++ b/man/tm_g_pp_patient_timeline.Rd @@ -96,22 +96,24 @@ This module produces a patient profile timeline \code{\link[ggplot2:ggplot]{ggpl } \examples{ library(nestcolor) +library(dplyr) +library(formatters) data <- teal_data() data <- within(data, { ADAE <- tmc_ex_adae - ADSL <- tmc_ex_adsl \%>\% dplyr::filter(USUBJID \%in\% ADAE$USUBJID) - ADCM <- tmc_ex_adcm \%>\% dplyr::mutate( - CMSTDY = dplyr::case_when( + ADSL <- tmc_ex_adsl \%>\% filter(USUBJID \%in\% ADAE$USUBJID) + ADCM <- tmc_ex_adcm \%>\% mutate( + CMSTDY = case_when( CMCAT == "medcl B" ~ 20, CMCAT == "medcl C" ~ 150, TRUE ~ 1 - ) \%>\% formatters::with_label("Study Day of Start of Medication"), - CMENDY = dplyr::case_when( + ) \%>\% with_label("Study Day of Start of Medication"), + CMENDY = case_when( CMCAT == "medcl B" ~ 700, CMCAT == "medcl C" ~ 1000, TRUE ~ 500 - ) \%>\% formatters::with_label("Study Day of End of Medication"), + ) \%>\% with_label("Study Day of End of Medication"), CMASTDTM = ASTDTM, CMAENDTM = AENDTM ) diff --git a/man/tm_g_pp_therapy.Rd b/man/tm_g_pp_therapy.Rd index fcd4cdca3d..9a8fc132fc 100644 --- a/man/tm_g_pp_therapy.Rd +++ b/man/tm_g_pp_therapy.Rd @@ -93,9 +93,10 @@ This module produces a patient profile therapy table and \code{\link[ggplot2:ggp } \examples{ library(nestcolor) +library(dplyr) ADCM <- tmc_ex_adcm -ADSL <- tmc_ex_adsl \%>\% dplyr::filter(USUBJID \%in\% ADCM$USUBJID) +ADSL <- tmc_ex_adsl \%>\% filter(USUBJID \%in\% ADCM$USUBJID) ADCM$CMASTDTM <- ADCM$ASTDTM ADCM$CMAENDTM <- ADCM$AENDTM adcm_keys <- c("STUDYID", "USUBJID", "ASTDTM", "CMSEQ", "ATC1", "ATC2", "ATC3", "ATC4") @@ -109,7 +110,7 @@ app <- init( ADCM = ADCM, code = " ADCM <- tmc_ex_adcm - ADSL <- tmc_ex_adsl \%>\% dplyr::filter(USUBJID \%in\% ADCM$USUBJID) + ADSL <- tmc_ex_adsl \%>\% filter(USUBJID \%in\% ADCM$USUBJID) ADCM$CMASTDTM <- ADCM$ASTDTM ADCM$CMAENDTM <- ADCM$AENDTM ", diff --git a/man/tm_t_abnormality.Rd b/man/tm_t_abnormality.Rd index 8abbfea7cb..46b77bb17a 100644 --- a/man/tm_t_abnormality.Rd +++ b/man/tm_t_abnormality.Rd @@ -103,15 +103,19 @@ Patients with the same abnormality at baseline as on the treatment visit can be excluded in accordance with GDSR specifications by using \code{exclude_base_abn}. } \examples{ + data <- teal_data() data <- within(data, { + library(dplyr) + library(formatters) + ADSL <- tmc_ex_adsl ADLB <- tmc_ex_adlb \%>\% - dplyr::mutate( - ONTRTFL = dplyr::case_when( + mutate( + ONTRTFL = case_when( AVISIT \%in\% c("SCREENING", "BASELINE") ~ "", TRUE ~ "Y" - ) \%>\% formatters::with_label("On Treatment Record Flag") + ) \%>\% with_label("On Treatment Record Flag") ) }) datanames <- c("ADSL", "ADLB") diff --git a/man/tm_t_abnormality_by_worst_grade.Rd b/man/tm_t_abnormality_by_worst_grade.Rd index 6693b454c9..3c5e85cc83 100644 --- a/man/tm_t_abnormality_by_worst_grade.Rd +++ b/man/tm_t_abnormality_by_worst_grade.Rd @@ -93,9 +93,12 @@ a \code{teal_module} object. This module produces a table to summarize laboratory test results with highest grade post-baseline } \examples{ +library(dplyr) +library(formatters) + ADSL <- tmc_ex_adsl ADLB <- tmc_ex_adlb \%>\% - dplyr::filter(!AVISIT \%in\% c("SCREENING", "BASELINE")) + filter(!AVISIT \%in\% c("SCREENING", "BASELINE")) app <- init( data = cdisc_data( @@ -104,7 +107,7 @@ app <- init( code = " ADSL <- tmc_ex_adsl ADLB <- tmc_ex_adlb \%>\% - dplyr::filter(!AVISIT \%in\% c(\"SCREENING\", \"BASELINE\")) + filter(!AVISIT \%in\% c(\"SCREENING\", \"BASELINE\")) " ), modules = modules( diff --git a/man/tm_t_binary_outcome.Rd b/man/tm_t_binary_outcome.Rd index 1f4118d740..c0afebd84c 100644 --- a/man/tm_t_binary_outcome.Rd +++ b/man/tm_t_binary_outcome.Rd @@ -107,13 +107,16 @@ or re-categorize response categories and arrange the display order. If response } } \examples{ +library(dplyr) +library(formatters) + ADSL <- tmc_ex_adsl ADRS <- tmc_ex_adrs \%>\% - dplyr::mutate( - AVALC = tern::d_onco_rsp_label(AVALC) \%>\% - formatters::with_label("Character Result/Finding") + mutate( + AVALC = d_onco_rsp_label(AVALC) \%>\% + with_label("Character Result/Finding") ) \%>\% - dplyr::filter(PARAMCD != "OVRINV" | AVISIT == "FOLLOW UP") + filter(PARAMCD != "OVRINV" | AVISIT == "FOLLOW UP") arm_ref_comp <- list( ARMCD = list(ref = "ARM B", comp = c("ARM A", "ARM C")), @@ -126,11 +129,11 @@ app <- init( code = " ADSL <- tmc_ex_adsl ADRS <- tmc_ex_adrs \%>\% - dplyr::mutate( - AVALC = tern::d_onco_rsp_label(AVALC) \%>\% - formatters::with_label(\"Character Result/Finding\") + mutate( + AVALC = d_onco_rsp_label(AVALC) \%>\% + with_label(\"Character Result/Finding\") ) \%>\% - dplyr::filter(PARAMCD != \"OVRINV\" | AVISIT == \"FOLLOW UP\") + filter(PARAMCD != \"OVRINV\" | AVISIT == \"FOLLOW UP\") " ), modules = modules( diff --git a/man/tm_t_coxreg.Rd b/man/tm_t_coxreg.Rd index dd5fec239f..3b892fe52f 100644 --- a/man/tm_t_coxreg.Rd +++ b/man/tm_t_coxreg.Rd @@ -176,6 +176,7 @@ if (interactive()) { data <- teal_data() data <- within(data, { + library(dplyr) ADTTE <- data.frame( STUDYID = "LUNG", AVAL = c(4, 3, 1, 1, 2, 2, 3, 1, 2), @@ -191,8 +192,8 @@ data <- within(data, { INST = factor(c("A", "A", "B", "B", "A", "B", "A", "B", "A")), stringsAsFactors = FALSE ) - ADTTE <- base::rbind(ADTTE, ADTTE, ADTTE, ADTTE) - ADTTE <- dplyr::as_tibble(ADTTE) + ADTTE <- rbind(ADTTE, ADTTE, ADTTE, ADTTE) + ADTTE <- as_tibble(ADTTE) set.seed(1) ADTTE$INST <- sample(ADTTE$INST) ADTTE$AGE <- sample(seq(5, 75, 5), size = nrow(ADTTE), replace = TRUE) diff --git a/man/tm_t_events.Rd b/man/tm_t_events.Rd index 5ba3cfc485..3d452f3703 100644 --- a/man/tm_t_events.Rd +++ b/man/tm_t_events.Rd @@ -99,7 +99,7 @@ This module produces a table of events by term. ADSL <- tmc_ex_adsl ADAE <- tmc_ex_adae -app <- teal::init( +app <- init( data = cdisc_data( ADSL = ADSL, ADAE = ADAE, diff --git a/man/tm_t_events_by_grade.Rd b/man/tm_t_events_by_grade.Rd index 872c6a70fe..6cf03dde44 100644 --- a/man/tm_t_events_by_grade.Rd +++ b/man/tm_t_events_by_grade.Rd @@ -92,11 +92,14 @@ This module produces a table to summarize events by grade. \examples{ data <- teal_data() data <- within(data, { + library(formatters) + library(dplyr) + ADSL <- tmc_ex_adsl - lbls_adae <- formatters::var_labels(tmc_ex_adae) + lbls_adae <- var_labels(tmc_ex_adae) ADAE <- tmc_ex_adae \%>\% - dplyr::mutate_if(is.character, as.factor) #' be certain of having factors - formatters::var_labels(ADAE) <- lbls_adae + mutate_if(is.character, as.factor) #' be certain of having factors + var_labels(ADAE) <- lbls_adae }) datanames <- c("ADSL", "ADAE") diff --git a/man/tm_t_events_patyear.Rd b/man/tm_t_events_patyear.Rd index b7e6fd6765..cfedf5482c 100644 --- a/man/tm_t_events_patyear.Rd +++ b/man/tm_t_events_patyear.Rd @@ -88,11 +88,12 @@ a \code{teal_module} object. This module produces a table of event rates adjusted for patient-years. } \examples{ +library(dplyr) ADSL <- tmc_ex_adsl ADAETTE <- tmc_ex_adaette \%>\% - dplyr::filter(PARAMCD \%in\% c("AETTE1", "AETTE2", "AETTE3")) \%>\% - dplyr::mutate(is_event = CNSR == 0) \%>\% - dplyr::mutate(n_events = as.integer(is_event)) + filter(PARAMCD \%in\% c("AETTE1", "AETTE2", "AETTE3")) \%>\% + mutate(is_event = CNSR == 0) \%>\% + mutate(n_events = as.integer(is_event)) app <- init( data = cdisc_data( @@ -101,9 +102,9 @@ app <- init( code = " ADSL <- tmc_ex_adsl ADAETTE <- tmc_ex_adaette \%>\% - dplyr::filter(PARAMCD \%in\% c(\"AETTE1\", \"AETTE2\", \"AETTE3\")) \%>\% - dplyr::mutate(is_event = CNSR == 0) \%>\% - dplyr::mutate(n_events = as.integer(is_event)) + filter(PARAMCD \%in\% c(\"AETTE1\", \"AETTE2\", \"AETTE3\")) \%>\% + mutate(is_event = CNSR == 0) \%>\% + mutate(n_events = as.integer(is_event)) " ), modules = modules( diff --git a/man/tm_t_events_summary.Rd b/man/tm_t_events_summary.Rd index 4de65b7f93..4cb8f36482 100644 --- a/man/tm_t_events_summary.Rd +++ b/man/tm_t_events_summary.Rd @@ -106,20 +106,23 @@ a \code{teal_module} object. This module produces an adverse events summary table. } \examples{ +library(dplyr) +library(formatters) + data <- teal_data() data <- within(data, { ADSL <- tmc_ex_adsl \%>\% - dplyr::mutate( - DTHFL = dplyr::case_when( #' nolint + mutate( + DTHFL = case_when( #' nolint !is.na(DTHDT) ~ "Y", TRUE ~ "" - ) \%>\% formatters::with_label("Subject Death Flag") + ) \%>\% with_label("Subject Death Flag") ) ADAE <- tmc_ex_adae add_event_flags <- function(dat) { dat <- dat \%>\% - dplyr::mutate( + mutate( TMPFL_SER = AESER == "Y", TMPFL_REL = AEREL == "Y", TMPFL_GR5 = AETOXGR == "5", @@ -135,7 +138,7 @@ data <- within(data, { TMP_SMQ02 = aesi_label("Y.9.9.9.9/Z.9.9.9.9 AESI"), TMP_CQ01 = aesi_label(dat[["CQ01NAM"]]) ) - formatters::var_labels(dat)[names(column_labels)] <- as.character(column_labels) + var_labels(dat)[names(column_labels)] <- as.character(column_labels) dat } diff --git a/man/tm_t_exposure.Rd b/man/tm_t_exposure.Rd index e2132ea861..269ff014d0 100644 --- a/man/tm_t_exposure.Rd +++ b/man/tm_t_exposure.Rd @@ -99,23 +99,26 @@ a \code{teal_module} object. The module produces an exposure table for risk management plan. } \examples{ +library(dplyr) +library(formatters) + data <- teal_data() data <- within(data, { ADSL <- tmc_ex_adsl ADEX <- tmc_ex_adex set.seed(1, kind = "Mersenne-Twister") - labels <- formatters::var_labels(ADEX, fill = FALSE) + labels <- var_labels(ADEX, fill = FALSE) ADEX <- ADEX \%>\% - dplyr::distinct(USUBJID, .keep_all = TRUE) \%>\% - dplyr::mutate( + distinct(USUBJID, .keep_all = TRUE) \%>\% + mutate( PARAMCD = "TDURD", PARAM = "Overall duration (days)", - AVAL = sample(x = seq(1, 200), size = dplyr::n(), replace = TRUE), + AVAL = sample(x = seq(1, 200), size = n(), replace = TRUE), AVALU = "Days" ) \%>\% - dplyr::bind_rows(ADEX) - formatters::var_labels(ADEX) <- labels + bind_rows(ADEX) + var_labels(ADEX) <- labels }) datanames <- c("ADSL", "ADEX") diff --git a/man/tm_t_logistic.Rd b/man/tm_t_logistic.Rd index 14ec045331..4c095bbccd 100644 --- a/man/tm_t_logistic.Rd +++ b/man/tm_t_logistic.Rd @@ -72,9 +72,11 @@ This module produces a multi-variable logistic regression table consistent with \code{LGRT02} available \href{https://insightsengineering.github.io/tlg-catalog/stable/tables/efficacy/lgrt02.html}{here}. } \examples{ +library(dplyr) + ADSL <- tmc_ex_adsl ADRS <- tmc_ex_adrs \%>\% - dplyr::filter(PARAMCD \%in\% c("BESRSPI", "INVET")) + filter(PARAMCD \%in\% c("BESRSPI", "INVET")) arm_ref_comp <- list( ACTARMCD = list( @@ -94,7 +96,7 @@ app <- init( code = " ADSL <- tmc_ex_adsl ADRS <- tmc_ex_adrs \%>\% - dplyr::filter(PARAMCD \%in\% c(\"BESRSPI\", \"INVET\")) + filter(PARAMCD \%in\% c(\"BESRSPI\", \"INVET\")) " ), modules = modules( @@ -118,7 +120,7 @@ app <- init( ) ) if (interactive()) { - shinyApp(ui = app$ui, server = app$server) + shinyApp(app$ui, app$server) } } diff --git a/man/tm_t_mult_events.Rd b/man/tm_t_mult_events.Rd index c16bb7a3d7..a494044599 100644 --- a/man/tm_t_mult_events.Rd +++ b/man/tm_t_mult_events.Rd @@ -89,7 +89,7 @@ adcm_keys <- c("STUDYID", "USUBJID", "ASTDTM", "CMSEQ", "ATC1", "ATC2", "ATC3", join_keys <- default_cdisc_join_keys[c("ADSL", "ADCM")] join_keys["ADCM", "ADCM"] <- adcm_keys -app <- teal::init( +app <- init( data = cdisc_data( ADSL = ADSL, ADCM = ADCM, diff --git a/man/tm_t_pp_prior_medication.Rd b/man/tm_t_pp_prior_medication.Rd index 83adabd3f8..1220c9a8f4 100644 --- a/man/tm_t_pp_prior_medication.Rd +++ b/man/tm_t_pp_prior_medication.Rd @@ -51,8 +51,10 @@ a \code{teal_module} object. This module produces a patient profile prior medication report using ADaM datasets. } \examples{ +library(dplyr) + ADCM <- tmc_ex_adcm -ADSL <- tmc_ex_adsl \%>\% dplyr::filter(USUBJID \%in\% ADCM$USUBJID) +ADSL <- tmc_ex_adsl \%>\% filter(USUBJID \%in\% ADCM$USUBJID) ADCM$CMASTDTM <- ADCM$ASTDTM ADCM$CMAENDTM <- ADCM$AENDTM adcm_keys <- c("STUDYID", "USUBJID", "ASTDTM", "CMSEQ", "ATC1", "ATC2", "ATC3", "ATC4") @@ -66,7 +68,7 @@ app <- init( ADCM = ADCM, code = " ADCM <- tmc_ex_adcm - ADSL <- tmc_ex_adsl \%>\% dplyr::filter(USUBJID \%in\% ADCM$USUBJID) + ADSL <- tmc_ex_adsl \%>\% filter(USUBJID \%in\% ADCM$USUBJID) ADCM$CMASTDTM <- ADCM$ASTDTM ADCM$CMAENDTM <- ADCM$AENDTM ", diff --git a/man/validate_standard_inputs.Rd b/man/validate_standard_inputs.Rd index 8ae1e33e1b..1775527bc8 100644 --- a/man/validate_standard_inputs.Rd +++ b/man/validate_standard_inputs.Rd @@ -49,15 +49,15 @@ Use \code{NULL} for no maximum.} } \examples{ # Internal function - validate_standard_inputs - +validate_standard_inputs <- getFromNamespace("validate_standard_inputs", "teal.modules.clinical") adsl <- tmc_ex_adsl adae <- tmc_ex_adae ui <- fluidPage( - shiny::sliderInput("obs", "Max Age", + sliderInput("obs", "Max Age", min = 0, max = 100, value = 100 ), - shiny::sliderInput("maxgr", "Max Grade", + sliderInput("maxgr", "Max Grade", min = 0, max = 5, value = 5 ), plotOutput("plot") @@ -71,7 +71,7 @@ server <- function(input, output) { adsl_f <- adsl[adsl$AGE <= input$obs, keep_adsl] adae_f <- adae[as.numeric(adae$AETOXGR) <= input$maxgr, keep_adae] - teal.modules.clinical:::validate_standard_inputs( + validate_standard_inputs( adsl = adsl_f, adslvars = keep_adsl, anl = adae_f, @@ -97,7 +97,7 @@ server2 <- function(input, output) { adsl_f <- adsl[adsl$AGE <= input$obs, keep_adsl] adae_f <- adae[as.numeric(adae$AETOXGR) <= input$maxgr, keep_adae] - teal.modules.clinical:::validate_standard_inputs( + validate_standard_inputs( adsl = adsl_f, adslvars = keep_adsl, anl = adae_f, @@ -123,7 +123,7 @@ server3 <- function(input, output) { adsl_f <- adsl[adsl$AGE <= input$obs, keep_adsl] adae_f <- adae[as.numeric(adae$AETOXGR) <= input$maxgr, keep_adae] - teal.modules.clinical:::validate_standard_inputs( + validate_standard_inputs( adsl = adsl_f, adslvars = keep_adsl, anl = adae_f, From 2fa8a4a13bad16edd38de04d8b0528634416aa5e Mon Sep 17 00:00:00 2001 From: kartikeyakirar Date: Fri, 9 Feb 2024 11:02:42 +0000 Subject: [PATCH 073/126] [skip actions] Bump version to 0.8.16.9080 --- DESCRIPTION | 4 ++-- NEWS.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index b010099771..945e6c0d3b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9079 -Date: 2024-02-05 +Version: 0.8.16.9080 +Date: 2024-02-09 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), person("Jana", "Stoilova", , "jana.stoilova@roche.com", role = "aut"), diff --git a/NEWS.md b/NEWS.md index 78bb5ac718..6b3e6b9591 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9079 +# teal.modules.clinical 0.8.16.9080 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 55fa7c6a1f3ebf836fabae1c5d9eab8c71af814f Mon Sep 17 00:00:00 2001 From: Marcin <133694481+m7pr@users.noreply.github.com> Date: Fri, 9 Feb 2024 13:02:02 +0100 Subject: [PATCH 074/126] 1012 substitute `{assertthat}` with `{checkmate}` in a couple of functions (#1046) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Part of #1012 Removed `{assertthat}` package and substituted with `{checkmate}` equivalents. Removed `R/dynamic_assertions.R` since functions are not used in this package, and not in any other place in pharmaverse. image --------- Signed-off-by: Marcin <133694481+m7pr@users.noreply.github.com> Co-authored-by: 27856297+dependabot-preview[bot]@users.noreply.github.com <27856297+dependabot-preview[bot]@users.noreply.github.com> Co-authored-by: André Veríssimo <211358+averissimo@users.noreply.github.com> --- .pre-commit-config.yaml | 1 - DESCRIPTION | 3 +- NAMESPACE | 3 -- R/dynamic_assertions.R | 62 -------------------------- R/facet_grid_formula.R | 2 +- R/tm_g_forest_rsp.R | 19 +++----- R/tm_g_forest_tte.R | 10 ++--- R/tm_g_ipp.R | 26 +++++------ R/tm_g_km.R | 20 ++++----- R/tm_g_lineplot.R | 19 ++++---- R/tm_g_pp_adverse_events.R | 22 +++++----- R/tm_g_pp_patient_timeline.R | 58 ++++++++++++++---------- R/tm_g_pp_therapy.R | 28 ++++++------ R/tm_g_pp_vitals.R | 14 +++--- R/tm_t_abnormality.R | 32 +++++++------- R/tm_t_abnormality_by_worst_grade.R | 26 +++++------ R/tm_t_ancova.R | 22 +++++----- R/tm_t_binary_outcome.R | 22 +++++----- R/tm_t_events.R | 28 ++++++------ R/tm_t_events_by_grade.R | 68 ++++++++++++++--------------- R/tm_t_events_summary.R | 32 +++++++------- R/tm_t_exposure.R | 30 ++++++------- R/tm_t_logistic.R | 20 ++++----- R/tm_t_mult_events.R | 25 +++++------ R/tm_t_pp_laboratory.R | 18 ++++---- R/tm_t_pp_medical_history.R | 10 ++--- R/tm_t_pp_prior_medication.R | 12 +++-- R/tm_t_shift_by_arm.R | 28 ++++++------ R/tm_t_shift_by_arm_by_worst.R | 28 ++++++------ R/tm_t_shift_by_grade.R | 30 ++++++------- R/tm_t_smq.R | 24 +++++----- R/tm_t_summary.R | 21 +++++---- R/tm_t_summary_by.R | 33 +++++++------- R/tm_t_tte.R | 24 +++++----- R/utils.R | 33 ++++++-------- man/dyn_assertion.Rd | 41 ----------------- 36 files changed, 367 insertions(+), 527 deletions(-) delete mode 100644 R/dynamic_assertions.R delete mode 100644 man/dyn_assertion.Rd diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 35c7cbd95d..710d0e6c68 100755 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,7 +21,6 @@ repos: - insightsengineering/teal - insightsengineering/teal.transform - tern - - assertthat - broom - checkmate - dplyr diff --git a/DESCRIPTION b/DESCRIPTION index 945e6c0d3b..a79e83f306 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -30,7 +30,6 @@ Depends: teal.transform (>= 0.4.0.9011), tern (>= 0.9.3) Imports: - assertthat, broom (>= 0.7.10), checkmate (>= 2.1.0), dplyr (>= 1.0.5), @@ -71,7 +70,7 @@ VignetteBuilder: knitr Config/Needs/verdepcheck: insightsengineering/teal, insightsengineering/teal.transform, insightsengineering/tern, - cran/assertthat, tidymodels/broom, mllg/checkmate, tidyverse/dplyr, + tidymodels/broom, mllg/checkmate, tidyverse/dplyr, rstudio/DT, insightsengineering/formatters, tidyverse/ggplot2, slowkow/ggrepel, r-lib/lifecycle, daroczig/logger, tidyverse/magrittr, r-lib/rlang, insightsengineering/rlistings, rstudio/rmarkdown, diff --git a/NAMESPACE b/NAMESPACE index 10e6611848..ed4503098c 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -27,8 +27,6 @@ export(set_default_total_label) export(split_choices) export(split_col_expr) export(split_interactions) -export(teal_enough_rows) -export(teal_has_element) export(tm_a_gee) export(tm_a_mmrm) export(tm_g_barchart_simple) @@ -65,7 +63,6 @@ export(tm_t_smq) export(tm_t_summary) export(tm_t_summary_by) export(tm_t_tte) -import(assertthat) import(teal) import(teal.transform) import(tern) diff --git a/R/dynamic_assertions.R b/R/dynamic_assertions.R deleted file mode 100644 index 9552e994e4..0000000000 --- a/R/dynamic_assertions.R +++ /dev/null @@ -1,62 +0,0 @@ -#' Dynamic assertion -#' -#' Verifies assertions for dynamic outputs. -#' -#' @name dyn_assertion -#' @keywords internal -NULL - -#' @describeIn dyn_assertion the dataset is large enough. -#' -#' @param data (`dataframe`). -#' @param min_nrow (`number`)\cr minimum number of rows for a valid analysis. -#' -#' @export -#' -#' @examples -#' -#' library(assertthat) -#' library(testthat) -#' expect_error(assert_that(teal_enough_rows(data = iris, min_nrow = 1500))) -teal_enough_rows <- function(data, min_nrow) nrow(data) >= min_nrow -assertthat::on_failure(teal_enough_rows) <- function(call, env) { - call[[1]] <- validate_enough_rows - eval(call, envir = env) -} -validate_enough_rows <- function(data, min_nrow) { - shiny::validate( - shiny::need( - FALSE, - label = paste0( - substitute(data), - ": Minimum number of records not met: >= ", min_nrow, - " records required." - ) - ) - ) -} - -#' @describeIn dyn_assertion the element exist. -#' @param str (`name`)\cr the name of the object which must _exist_. -#' @param ... (`character`)\cr the label to be displayed. -#' -#' @export -#' -#' @examples -#' library(assertthat) -#' armcd <- NULL -#' expect_error(assert_that(teal_has_element(str = armcd, "ARMCD"))) -teal_has_element <- function(str, ...) length(str) > 0 -assertthat::on_failure(teal_has_element) <- function(call, env) { - call[[1]] <- validate_has_elements - eval(call, envir = env) -} - -validate_has_elements <- function(str, label = str) { - shiny::validate( - shiny::need( - FALSE, - message = paste0(label, ": required variable not assigned.") - ) - ) -} diff --git a/R/facet_grid_formula.R b/R/facet_grid_formula.R index 2936aa6561..a5cf4d1748 100644 --- a/R/facet_grid_formula.R +++ b/R/facet_grid_formula.R @@ -23,6 +23,6 @@ facet_grid_formula <- function(x_facet, y_facet) { if (length(y_facet) == 0) y_facet <- "." checkmate::assert_string(x_facet) checkmate::assert_string(y_facet) - stopifnot(x_facet != y_facet) + if (x_facet == y_facet) stop("'x_facet' and 'y_facet' must not be equal.") stats::as.formula(paste0(y_facet, " ~ ", x_facet)) # must invert it } diff --git a/R/tm_g_forest_rsp.R b/R/tm_g_forest_rsp.R index 8263f195af..0df97cf596 100644 --- a/R/tm_g_forest_rsp.R +++ b/R/tm_g_forest_rsp.R @@ -34,14 +34,12 @@ template_forest_rsp <- function(dataname = "ANL", conf_level = 0.95, col_symbol_size = NULL, ggplot2_args = teal.widgets::ggplot2_args()) { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(parentname), - assertthat::is.string(arm_var), - assertthat::is.string(aval_var), - assertthat::is.string(obj_var_name), - is.null(subgroup_var) || is.character(subgroup_var) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(parentname) + checkmate::assert_string(arm_var) + checkmate::assert_string(aval_var) + checkmate::assert_string(obj_var_name) + checkmate::assert_character(subgroup_var, null.ok = TRUE) y <- list() ref_arm_val <- paste(ref_arm, collapse = "/") @@ -314,10 +312,7 @@ tm_g_forest_rsp <- function(label, checkmate::assert_string(parentname) checkmate::assert_flag(fixed_symbol_size) checkmate::assert_class(conf_level, "choices_selected") - assertthat::assert_that( - inherits(default_responses, c("list", "character", "numeric", "NULL")), - msg = "`default_responses` must be a named list or an array." - ) + checkmate::assert_multi_class(default_responses, c("list", "character", "numeric"), null.ok = TRUE) 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) diff --git a/R/tm_g_forest_tte.R b/R/tm_g_forest_tte.R index 8b8805ca2c..475e036323 100644 --- a/R/tm_g_forest_tte.R +++ b/R/tm_g_forest_tte.R @@ -24,12 +24,10 @@ template_forest_tte <- function(dataname = "ANL", col_symbol_size = NULL, time_unit_var = "AVALU", ggplot2_args = teal.widgets::ggplot2_args()) { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(arm_var), - assertthat::is.string(obj_var_name), - is.character(subgroup_var) || is.null(subgroup_var) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(arm_var) + checkmate::assert_string(obj_var_name) + checkmate::assert_character(subgroup_var, null.ok = TRUE) y <- list() ref_arm_val <- paste(ref_arm, collapse = "/") diff --git a/R/tm_g_ipp.R b/R/tm_g_ipp.R index 8e00ecba9f..cc5b8f6376 100644 --- a/R/tm_g_ipp.R +++ b/R/tm_g_ipp.R @@ -51,20 +51,18 @@ template_g_ipp <- function(dataname = "ANL", ) } - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(paramcd), - assertthat::is.string(arm_var), - assertthat::is.string(aval_var), - assertthat::is.string(avalu_var), - assertthat::is.string(id_var), - assertthat::is.string(visit_var), - assertthat::is.string(baseline_var), - assertthat::is.flag(add_baseline_hline), - assertthat::is.flag(separate_by_obs), - assertthat::is.flag(suppress_legend), - assertthat::is.flag(add_avalu) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(paramcd) + checkmate::assert_string(arm_var) + checkmate::assert_string(aval_var) + checkmate::assert_string(avalu_var) + checkmate::assert_string(id_var) + checkmate::assert_string(visit_var) + checkmate::assert_string(baseline_var) + checkmate::assert_flag(add_baseline_hline) + checkmate::assert_flag(separate_by_obs) + checkmate::assert_flag(suppress_legend) + checkmate::assert_flag(add_avalu) y <- list() # Data preprocessing diff --git a/R/tm_g_km.R b/R/tm_g_km.R index c2f7adab07..02adc71d38 100644 --- a/R/tm_g_km.R +++ b/R/tm_g_km.R @@ -37,17 +37,15 @@ template_g_km <- function(dataname = "ANL", width_annots = list(surv_med = grid::unit(0.45, "npc"), coxph = grid::unit(0.6, "npc")), ci_ribbon = FALSE, title = "KM Plot") { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(arm_var), - assertthat::is.string(aval_var), - assertthat::is.string(cnsr_var), - assertthat::is.string(time_unit_var), - assertthat::is.flag(compare_arm), - assertthat::is.flag(combine_comp_arms), - is.null(xticks) | is.numeric(xticks), - assertthat::is.string(title) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(arm_var) + checkmate::assert_string(aval_var) + checkmate::assert_string(cnsr_var) + checkmate::assert_string(time_unit_var) + checkmate::assert_flag(compare_arm) + checkmate::assert_flag(combine_comp_arms) + checkmate::assert_numeric(xticks, null.ok = TRUE) + checkmate::assert_string(title) ref_arm_val <- paste(ref_arm, collapse = "/") y <- list() diff --git a/R/tm_g_lineplot.R b/R/tm_g_lineplot.R index 12fd1f5a7c..7b814638dd 100644 --- a/R/tm_g_lineplot.R +++ b/R/tm_g_lineplot.R @@ -39,16 +39,15 @@ template_g_lineplot <- function(dataname = "ANL", title = "Line Plot", y_lab = "", ggplot2_args = teal.widgets::ggplot2_args()) { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(strata), - assertthat::is.string(x), - assertthat::is.string(y), - assertthat::is.string(y_unit), - assertthat::is.string(paramcd), - assertthat::is.string(title), - assertthat::is.string(y_lab) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(strata) + checkmate::assert_string(x) + checkmate::assert_string(y) + checkmate::assert_string(y_unit) + checkmate::assert_string(paramcd) + checkmate::assert_string(title) + checkmate::assert_string(y_lab) + z <- list() data_list <- list() diff --git a/R/tm_g_pp_adverse_events.R b/R/tm_g_pp_adverse_events.R index 8a9f86684a..a709d15d1b 100644 --- a/R/tm_g_pp_adverse_events.R +++ b/R/tm_g_pp_adverse_events.R @@ -27,18 +27,16 @@ template_adverse_events <- function(dataname = "ANL", patient_id, font_size = 12L, ggplot2_args = teal.widgets::ggplot2_args()) { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(aeterm), - assertthat::is.string(tox_grade), - assertthat::is.string(causality), - assertthat::is.string(outcome), - assertthat::is.string(action), - assertthat::is.string(time) || is.null(time), - assertthat::is.string(decod) || is.null(decod), - assertthat::is.string(patient_id), - is.numeric(font_size) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(aeterm) + checkmate::assert_string(tox_grade) + checkmate::assert_string(causality) + checkmate::assert_string(outcome) + checkmate::assert_string(action) + checkmate::assert_string(time, null.ok = TRUE) + checkmate::assert_string(decod, null.ok = TRUE) + checkmate::assert_string(patient_id) + checkmate::assert_number(font_size) y <- list() diff --git a/R/tm_g_pp_patient_timeline.R b/R/tm_g_pp_patient_timeline.R index e7e4ba83eb..741e746547 100644 --- a/R/tm_g_pp_patient_timeline.R +++ b/R/tm_g_pp_patient_timeline.R @@ -36,20 +36,19 @@ template_patient_timeline <- function(dataname = "ANL", ggplot2_args = teal.widgets::ggplot2_args()) { # Note: The variables used for aetime_start, aetime_end, dstime_start and dstime_end are to be # updated after random.cdisc.data updates. - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(aeterm) || is.null(aeterm), - assertthat::is.string(aetime_start) || is.null(aetime_start), - assertthat::is.string(aetime_end) || is.null(aetime_end), - assertthat::is.string(dstime_start) || is.null(dstime_start), - assertthat::is.string(dstime_end) || is.null(dstime_end), - assertthat::is.string(cmdecod) || is.null(cmdecod), - assertthat::is.string(aerelday_start) || is.null(aerelday_start), - assertthat::is.string(dsrelday_start) || is.null(dsrelday_start), - is.numeric(font_size), - is.logical(relative_day), - assertthat::is.string(patient_id) - ) + + checkmate::assert_string(dataname) + checkmate::assert_string(aeterm, null.ok = TRUE) + checkmate::assert_string(aetime_start, null.ok = TRUE) + checkmate::assert_string(aetime_end, null.ok = TRUE) + checkmate::assert_string(dstime_start, null.ok = TRUE) + checkmate::assert_string(dstime_end, null.ok = TRUE) + checkmate::assert_string(cmdecod, null.ok = TRUE) + checkmate::assert_string(aerelday_start, null.ok = TRUE) + checkmate::assert_string(dsrelday_start, null.ok = TRUE) + checkmate::assert_number(font_size) + checkmate::assert_flag(relative_day) + checkmate::assert_string(patient_id) chart_list <- list() if (!relative_day) { @@ -473,14 +472,29 @@ tm_g_pp_patient_timeline <- function(label, plot_width[1], lower = plot_width[2], upper = plot_width[3], null.ok = TRUE, .var.name = "plot_width" ) - assertthat::assert_that(!xor(is.null(aetime_start), is.null(aetime_end))) - assertthat::assert_that(!xor(is.null(dstime_start), is.null(dstime_end))) - assertthat::assert_that(!xor(is.null(aerelday_start), is.null(aerelday_end))) - assertthat::assert_that(!xor(is.null(dsrelday_start), is.null(dsrelday_end))) - assertthat::assert_that( - (!is.null(aeterm) && (!is.null(aetime_start) || !is.null(aerelday_start))) || - (!is.null(cmdecod) && (!is.null(dstime_start) || !is.null(dsrelday_start))) - ) + + xor_error_string <- function(x, y) { + paste( + "Assertion on `", x, "` and `", y, "` failed:", + "Both `", x, "` and `", y, "` needs to be provided or both need to be `NULL`." + ) + } + + if (xor(is.null(aetime_start), is.null(aetime_end))) stop(xor_error_string("aetime_start", "aetime_end")) + if (xor(is.null(dstime_start), is.null(dstime_end))) stop(xor_error_string("dstime_start", "dstime_end")) + if (xor(is.null(aerelday_start), is.null(aerelday_end))) stop(xor_error_string("aerelday_start", "aerelday_end")) + if (xor(is.null(dsrelday_start), is.null(dsrelday_end))) stop(xor_error_string("dsrelday_start", "dsrelday_end")) + + if (is.null(aeterm) && is.null(cmdecod)) { + stop("At least one of 'aeterm' or 'cmdecod' needs to be provided.") + } + if (!is.null(aeterm) && (is.null(aetime_start) || is.null(aerelday_start))) { + stop("If 'aeterm' is provided, then one of 'aetime_start' and 'aerelday_start' must not be empty.") + } + if (!is.null(cmdecod) && (is.null(dstime_start) || is.null(dsrelday_start))) { + stop("If 'cmdecod' is provided, then one of 'dstime_start' and 'dsrelday_start' must not be empty.") + } + checkmate::assert_class(pre_output, classes = "shiny.tag", null.ok = TRUE) checkmate::assert_class(post_output, classes = "shiny.tag", null.ok = TRUE) checkmate::assert_class(ggplot2_args, "ggplot2_args") diff --git a/R/tm_g_pp_therapy.R b/R/tm_g_pp_therapy.R index 224fa5a925..6bbff227e8 100644 --- a/R/tm_g_pp_therapy.R +++ b/R/tm_g_pp_therapy.R @@ -30,21 +30,19 @@ template_therapy <- function(dataname = "ANL", patient_id, font_size = 12L, ggplot2_args = teal.widgets::ggplot2_args()) { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(atirel), - assertthat::is.string(cmdecod), - assertthat::is.string(cmindc), - assertthat::is.string(cmdose), - assertthat::is.string(cmtrt), - assertthat::is.string(cmdosu), - assertthat::is.string(cmroute), - assertthat::is.string(cmdosfrq), - assertthat::is.string(cmstdy), - assertthat::is.string(cmendy), - assertthat::is.string(patient_id), - is.numeric(font_size) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(atirel) + checkmate::assert_string(cmdecod) + checkmate::assert_string(cmindc) + checkmate::assert_string(cmdose) + checkmate::assert_string(cmtrt) + checkmate::assert_string(cmdosu) + checkmate::assert_string(cmroute) + checkmate::assert_string(cmdosfrq) + checkmate::assert_string(cmstdy) + checkmate::assert_string(cmendy) + checkmate::assert_string(patient_id) + checkmate::assert_number(font_size) y <- list() y$table_list <- list() diff --git a/R/tm_g_pp_vitals.R b/R/tm_g_pp_vitals.R index 16311f304b..4ce788c8e3 100644 --- a/R/tm_g_pp_vitals.R +++ b/R/tm_g_pp_vitals.R @@ -29,14 +29,12 @@ template_vitals <- function(dataname = "ANL", ) } - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(paramcd), - assertthat::is.string(xaxis), - assertthat::is.string(aval_var), - assertthat::is.string(patient_id), - is.numeric(font_size) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(paramcd) + checkmate::assert_string(xaxis) + checkmate::assert_string(aval_var) + checkmate::assert_string(patient_id) + checkmate::assert_number(font_size) # Note: VSDY (study day of vital signs) was replaced with ADY (analysis day) y <- list() diff --git a/R/tm_t_abnormality.R b/R/tm_t_abnormality.R index d551821d6c..c48c9961f9 100644 --- a/R/tm_t_abnormality.R +++ b/R/tm_t_abnormality.R @@ -34,23 +34,21 @@ template_abnormality <- function(parentname, na_level = default_na_str(), basic_table_args = teal.widgets::basic_table_args(), tbl_title) { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(id_var), - assertthat::is.string(parentname), - assertthat::is.string(arm_var), - is.character(by_vars), - is.list(abnormal), - assertthat::is.string(grade), - assertthat::is.string(baseline_var), - assertthat::is.string(treatment_flag_var), - assertthat::is.string(treatment_flag), - assertthat::is.flag(add_total), - assertthat::is.string(total_label), - assertthat::is.flag(exclude_base_abn), - assertthat::is.flag(drop_arm_levels), - assertthat::is.string(tbl_title) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(id_var) + checkmate::assert_string(parentname) + checkmate::assert_string(arm_var) + checkmate::check_character(by_vars) + checkmate::check_list(abnormal) + checkmate::assert_string(grade) + checkmate::assert_string(baseline_var) + checkmate::assert_string(treatment_flag_var) + checkmate::assert_string(treatment_flag) + checkmate::assert_flag(add_total) + checkmate::assert_string(total_label) + checkmate::assert_flag(exclude_base_abn) + checkmate::assert_flag(drop_arm_levels) + checkmate::assert_string(tbl_title) y <- list() diff --git a/R/tm_t_abnormality_by_worst_grade.R b/R/tm_t_abnormality_by_worst_grade.R index 73992de9fd..065237b9c7 100644 --- a/R/tm_t_abnormality_by_worst_grade.R +++ b/R/tm_t_abnormality_by_worst_grade.R @@ -28,20 +28,18 @@ template_abnormality_by_worst_grade <- function(parentname, # nolint total_label = default_total_label(), drop_arm_levels = TRUE, basic_table_args = teal.widgets::basic_table_args()) { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(parentname), - assertthat::is.string(arm_var), - assertthat::is.string(id_var), - assertthat::is.string(paramcd), - assertthat::is.string(atoxgr_var), - assertthat::is.string(worst_high_flag_var), - assertthat::is.string(worst_low_flag_var), - assertthat::is.string(worst_flag_indicator), - assertthat::is.flag(add_total), - assertthat::is.string(total_label), - assertthat::is.flag(drop_arm_levels) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(parentname) + checkmate::assert_string(arm_var) + checkmate::assert_string(id_var) + checkmate::assert_string(paramcd) + checkmate::assert_string(atoxgr_var) + checkmate::assert_string(worst_high_flag_var) + checkmate::assert_string(worst_low_flag_var) + checkmate::assert_string(worst_flag_indicator) + checkmate::assert_flag(add_total) + checkmate::assert_string(total_label) + checkmate::assert_flag(drop_arm_levels) y <- list() diff --git a/R/tm_t_ancova.R b/R/tm_t_ancova.R index d7d31550a7..b5338c6c7a 100644 --- a/R/tm_t_ancova.R +++ b/R/tm_t_ancova.R @@ -42,18 +42,16 @@ template_ancova <- function(dataname = "ANL", visit_var = "AVISIT", conf_level = 0.95, basic_table_args = teal.widgets::basic_table_args()) { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(parentname), - assertthat::is.string(arm_var), - assertthat::is.string(label_aval) || is.null(label_aval), - assertthat::is.flag(combine_comp_arms), - assertthat::is.string(aval_var), - is.character(cov_var), - assertthat::is.flag(include_interact), - all(sapply(interact_y, assertthat::is.string)) || isFALSE(interact_y), - assertthat::is.string(interact_var) || is.null(interact_var) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(parentname) + checkmate::assert_string(arm_var) + checkmate::assert_string(label_aval, null.ok = TRUE) + checkmate::assert_flag(combine_comp_arms) + checkmate::assert_string(aval_var) + checkmate::assert_character(cov_var) + checkmate::assert_flag(include_interact) + if (!isFALSE(interact_y)) checkmate::assert_character(interact_y) + checkmate::assert_string(interact_var, null.ok = TRUE) y <- list() diff --git a/R/tm_t_binary_outcome.R b/R/tm_t_binary_outcome.R index 7b3fa75d29..e0a9907d98 100644 --- a/R/tm_t_binary_outcome.R +++ b/R/tm_t_binary_outcome.R @@ -36,18 +36,16 @@ template_binary_outcome <- function(dataname, total_label = default_total_label(), na_level = default_na_str(), basic_table_args = teal.widgets::basic_table_args()) { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(parentname), - assertthat::is.string(arm_var), - assertthat::is.string(aval_var), - assertthat::is.flag(compare_arm), - assertthat::is.flag(combine_comp_arms), - assertthat::is.flag(show_rsp_cat), - assertthat::is.flag(add_total), - assertthat::is.string(na_level), - assertthat::is.string(total_label) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(parentname) + checkmate::assert_string(arm_var) + checkmate::assert_string(aval_var) + checkmate::assert_flag(compare_arm) + checkmate::assert_flag(combine_comp_arms) + checkmate::assert_flag(show_rsp_cat) + checkmate::assert_flag(add_total) + checkmate::assert_string(na_level) + checkmate::assert_string(total_label) ref_arm_val <- paste(ref_arm, collapse = "/") y <- list() diff --git a/R/tm_t_events.R b/R/tm_t_events.R index 6653d18a43..a7f3a6ebd7 100644 --- a/R/tm_t_events.R +++ b/R/tm_t_events.R @@ -30,21 +30,19 @@ template_events <- function(dataname, drop_arm_levels = TRUE, incl_overall_sum = TRUE, basic_table_args = teal.widgets::basic_table_args()) { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(parentname), - is.character(arm_var) && length(arm_var) %in% c(1, 2), - assertthat::is.string(hlt) || is.null(hlt), - assertthat::is.string(llt) || is.null(llt), - assertthat::is.string(label_hlt) || is.null(label_hlt), - assertthat::is.string(label_llt) || is.null(label_llt), - is.character(c(llt, hlt)), - assertthat::is.flag(add_total), - assertthat::is.string(total_label), - assertthat::is.string(na_level), - assertthat::is.string(event_type), - assertthat::is.flag(drop_arm_levels) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(parentname) + checkmate::assert_character(arm_var, min.len = 1, max.len = 2) + checkmate::assert_string(hlt, null.ok = TRUE) + checkmate::assert_string(llt, null.ok = TRUE) + checkmate::assert_string(label_hlt, null.ok = TRUE) + checkmate::assert_string(label_llt, null.ok = TRUE) + checkmate::assert_character(c(llt, hlt)) + checkmate::assert_flag(add_total) + checkmate::assert_string(total_label) + checkmate::assert_string(na_level) + checkmate::assert_string(event_type) + checkmate::assert_flag(drop_arm_levels) checkmate::assert_scalar(prune_freq) checkmate::assert_scalar(prune_diff) diff --git a/R/tm_t_events_by_grade.R b/R/tm_t_events_by_grade.R index 1b2553b36d..760d1c5bf8 100644 --- a/R/tm_t_events_by_grade.R +++ b/R/tm_t_events_by_grade.R @@ -30,22 +30,20 @@ template_events_by_grade <- function(dataname, na_level = default_na_str(), drop_arm_levels = TRUE, basic_table_args = teal.widgets::basic_table_args()) { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(parentname), - assertthat::is.string(arm_var), - assertthat::is.string(hlt) || is.null(hlt), - assertthat::is.string(llt) || is.null(llt), - !is.null(hlt) || !is.null(llt), - assertthat::is.string(label_hlt) || is.null(label_hlt), - assertthat::is.string(label_llt) || is.null(label_llt), - assertthat::is.string(grade), - assertthat::is.string(label_grade) || is.null(label_grade), - assertthat::is.flag(add_total), - assertthat::is.string(total_label), - assertthat::is.string(na_level), - assertthat::is.flag(drop_arm_levels) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(parentname) + checkmate::assert_string(arm_var) + checkmate::assert_string(hlt, null.ok = TRUE) + checkmate::assert_string(llt, null.ok = TRUE) + if (is.null(hlt) && is.null(llt)) stop("At least one of 'hlt' or 'llt' can not be empty.") + checkmate::assert_string(label_hlt, null.ok = TRUE) + checkmate::assert_string(label_llt, null.ok = TRUE) + checkmate::assert_string(grade) + checkmate::assert_string(label_grade, null.ok = TRUE) + checkmate::assert_flag(add_total) + checkmate::assert_string(total_label) + checkmate::assert_string(na_level) + checkmate::assert_flag(drop_arm_levels) checkmate::assert_scalar(prune_freq) checkmate::assert_scalar(prune_diff) @@ -409,27 +407,24 @@ template_events_col_by_grade <- function(dataname, na_level = default_na_str(), drop_arm_levels = TRUE, basic_table_args = teal.widgets::basic_table_args()) { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(parentname), - assertthat::is.string(arm_var), - is.list(grading_groups), - assertthat::is.flag(add_total), - assertthat::is.string(total_label), - assertthat::is.string(id), - assertthat::is.string(hlt) || is.null(hlt), - assertthat::is.string(llt), - assertthat::is.string(grade), - assertthat::is.string(label_hlt) || is.null(label_hlt), - assertthat::is.string(label_llt) || is.null(label_llt), - assertthat::is.string(label_grade) || is.null(label_grade), - assertthat::is.string(na_level), - assertthat::is.flag(drop_arm_levels) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(parentname) + checkmate::assert_string(arm_var) + checkmate::assert_list(grading_groups) + checkmate::assert_flag(add_total) + checkmate::assert_string(total_label) + checkmate::assert_string(id) + checkmate::assert_string(hlt, null.ok = TRUE) + checkmate::assert_string(llt) + checkmate::assert_string(grade) + checkmate::assert_string(label_hlt, null.ok = TRUE) + checkmate::assert_string(label_llt, null.ok = TRUE) + checkmate::assert_string(label_grade, null.ok = TRUE) + checkmate::assert_string(na_level) + checkmate::assert_flag(drop_arm_levels) checkmate::assert_scalar(prune_freq) checkmate::assert_scalar(prune_diff) - y <- list() # Start data steps. @@ -1099,7 +1094,10 @@ srv_t_events_by_grade <- function(id, anl_filtered <- merged$anl_q()[[dataname]] adsl_keys <- merged$adsl_input_r()$keys - assertthat::assert_that("USUBJID" %in% adsl_keys) + checkmate::assert( + .var.name = "adsl_keys", + if ("USUBJID" %in% adsl_keys) TRUE else "Must contain \"USUBJID\"" + ) input_arm_var <- as.vector(merged$anl_input_r()$columns_source$arm_var) input_level_term <- c( diff --git a/R/tm_t_events_summary.R b/R/tm_t_events_summary.R index 4384c7f0c1..f5998a1735 100644 --- a/R/tm_t_events_summary.R +++ b/R/tm_t_events_summary.R @@ -42,23 +42,21 @@ template_events_summary <- function(anl_name, count_subj = TRUE, count_pt = TRUE, count_events = TRUE) { - assertthat::assert_that( - assertthat::is.string(anl_name), - assertthat::is.string(parentname), - is.character(arm_var) && length(arm_var) %in% c(1, 2), - assertthat::is.string(dthfl_var), - assertthat::is.string(dcsreas_var), - assertthat::is.flag(add_total), - assertthat::is.string(total_label), - assertthat::is.string(na_level), - is.character(flag_var_anl) || is.null(NULL), - is.character(flag_var_aesi) || is.null(NULL), - assertthat::is.string(aeseq_var), - assertthat::is.string(llt), - assertthat::is.flag(count_subj), - assertthat::is.flag(count_pt), - assertthat::is.flag(count_events) - ) + checkmate::assert_string(anl_name) + checkmate::assert_string(parentname) + checkmate::assert_character(arm_var, min.len = 1, max.len = 2) + checkmate::assert_string(dthfl_var) + checkmate::assert_string(dcsreas_var) + checkmate::assert_flag(add_total) + checkmate::assert_string(total_label) + checkmate::assert_string(na_level) + checkmate::assert_character(flag_var_anl, null.ok = TRUE) + checkmate::assert_character(flag_var_aesi, null.ok = TRUE) + checkmate::assert_string(aeseq_var) + checkmate::assert_string(llt) + checkmate::assert_flag(count_subj) + checkmate::assert_flag(count_pt) + checkmate::assert_flag(count_events) y <- list() diff --git a/R/tm_t_exposure.R b/R/tm_t_exposure.R index 0fae335f74..42fee6bbee 100644 --- a/R/tm_t_exposure.R +++ b/R/tm_t_exposure.R @@ -34,22 +34,20 @@ template_exposure <- function(parentname, aval_var, avalu_var, basic_table_args = teal.widgets::basic_table_args()) { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(parentname), - assertthat::is.string(row_by_var), - assertthat::is.string(col_by_var) || length(col_by_var) == 0, - assertthat::is.string(paramcd), - assertthat::is.string(id_var), - assertthat::is.flag(add_total), - assertthat::is.string(total_label), - assertthat::is.flag(add_total_row), - assertthat::is.string(total_row_label), - assertthat::is.string(na_level), - assertthat::is.string(aval_var), - assertthat::is.string(avalu_var) || length(avalu_var) == 0, - assertthat::is.flag(drop_levels) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(parentname) + checkmate::assert_string(row_by_var) + checkmate::assert_string(col_by_var, null.ok = TRUE) + checkmate::assert_string(paramcd) + checkmate::assert_string(id_var) + checkmate::assert_flag(add_total) + checkmate::assert_string(total_label) + checkmate::assert_flag(add_total_row) + checkmate::assert_string(total_row_label) + checkmate::assert_string(na_level) + checkmate::assert_string(aval_var) + checkmate::assert_string(avalu_var, null.ok = TRUE) + checkmate::assert_flag(drop_levels) y <- list() data_list <- list() diff --git a/R/tm_t_logistic.R b/R/tm_t_logistic.R index 1561c0a851..385b40e633 100644 --- a/R/tm_t_logistic.R +++ b/R/tm_t_logistic.R @@ -37,14 +37,12 @@ template_logistic <- function(dataname, } # Common assertion no matter if arm_var is NULL or not. - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(aval_var), - assertthat::is.string(label_paramcd) || is.null(label_paramcd), - assertthat::is.string(topleft) || is.null(topleft), - is.character(cov_var) || is.null(cov_var), - assertthat::is.string(interaction_var) || is.null(interaction_var) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(aval_var) + checkmate::assert_string(label_paramcd, null.ok = TRUE) + checkmate::assert_string(topleft, null.ok = TRUE) + checkmate::assert_character(cov_var, null.ok = TRUE) + checkmate::assert_string(interaction_var, null.ok = TRUE) y <- list() @@ -53,10 +51,8 @@ template_logistic <- function(dataname, # Conditional assertion depends on if arm_var isn't NULL. if (!is.null(arm_var)) { - assertthat::assert_that( - assertthat::is.string(arm_var), - assertthat::is.flag(combine_comp_arms) - ) + checkmate::assert_string(arm_var) + checkmate::assert_flag(combine_comp_arms) ref_arm_val <- paste(ref_arm, collapse = "/") diff --git a/R/tm_t_mult_events.R b/R/tm_t_mult_events.R index 71a2613ce3..e4a8f60638 100644 --- a/R/tm_t_mult_events.R +++ b/R/tm_t_mult_events.R @@ -23,20 +23,17 @@ template_mult_events <- function(dataname, event_type = "event", drop_arm_levels = TRUE, basic_table_args = teal.widgets::basic_table_args()) { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(parentname), - assertthat::is.string(arm_var), - assertthat::is.string(seq_var), - !is.null(llt), - is.null(hlt) || is.character(hlt), - assertthat::is.string(llt), - assertthat::is.flag(add_total), - assertthat::is.string(total_label), - assertthat::is.string(na_level), - assertthat::is.string(event_type), - assertthat::is.flag(drop_arm_levels) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(parentname) + checkmate::assert_string(arm_var) + checkmate::assert_string(seq_var) + checkmate::assert_character(hlt, null.ok = TRUE) + checkmate::assert_string(llt, null.ok = FALSE) + checkmate::assert_flag(add_total) + checkmate::assert_string(total_label) + checkmate::assert_string(na_level) + checkmate::assert_string(event_type) + checkmate::assert_flag(drop_arm_levels) y <- list() diff --git a/R/tm_t_pp_laboratory.R b/R/tm_t_pp_laboratory.R index 55be709978..694c516d4f 100644 --- a/R/tm_t_pp_laboratory.R +++ b/R/tm_t_pp_laboratory.R @@ -43,16 +43,14 @@ template_laboratory <- function(dataname = "ANL", ) } - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(paramcd), - assertthat::is.string(param), - assertthat::is.string(anrind), - assertthat::is.string(timepoints), - assertthat::is.string(aval_var), - assertthat::is.string(avalu_var), - is.integer(round_value) && round_value >= 0 - ) + checkmate::assert_string(dataname) + checkmate::assert_string(paramcd) + checkmate::assert_string(param) + checkmate::assert_string(anrind) + checkmate::assert_string(timepoints) + checkmate::assert_string(aval_var) + checkmate::assert_string(avalu_var) + checkmate::assert_integer(round_value, lower = 0) y <- list() y$table <- list() diff --git a/R/tm_t_pp_medical_history.R b/R/tm_t_pp_medical_history.R index 9ec5309fbb..7213c2c0e8 100644 --- a/R/tm_t_pp_medical_history.R +++ b/R/tm_t_pp_medical_history.R @@ -17,12 +17,10 @@ template_medical_history <- function(dataname = "ANL", mhbodsys = "MHBODSYS", mhdistat = "MHDISTAT", patient_id = NULL) { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(mhterm), - assertthat::is.string(mhbodsys), - assertthat::is.string(mhdistat) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(mhterm) + checkmate::assert_string(mhbodsys) + checkmate::assert_string(mhdistat) y <- list() y$table <- list() diff --git a/R/tm_t_pp_prior_medication.R b/R/tm_t_pp_prior_medication.R index 048933d087..3497a021af 100644 --- a/R/tm_t_pp_prior_medication.R +++ b/R/tm_t_pp_prior_medication.R @@ -14,13 +14,11 @@ template_prior_medication <- function(dataname = "ANL", cmdecod = "CMDECOD", cmindc = "CMINDC", cmstdy = "CMSTDY") { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(atirel), - assertthat::is.string(cmdecod), - assertthat::is.string(cmindc), - assertthat::is.string(cmstdy) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(atirel) + checkmate::assert_string(cmdecod) + checkmate::assert_string(cmindc) + checkmate::assert_string(cmstdy) y <- list() y$table <- list() diff --git a/R/tm_t_shift_by_arm.R b/R/tm_t_shift_by_arm.R index 674039ab3e..df985069cf 100644 --- a/R/tm_t_shift_by_arm.R +++ b/R/tm_t_shift_by_arm.R @@ -36,21 +36,19 @@ template_shift_by_arm <- function(dataname, ) } - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(parentname), - assertthat::is.string(arm_var), - assertthat::is.string(visit_var), - assertthat::is.string(paramcd), - assertthat::is.string(aval_var), - assertthat::is.string(baseline_var), - assertthat::is.flag(na.rm), - assertthat::is.string(na_level), - assertthat::is.string(treatment_flag_var), - assertthat::is.string(treatment_flag), - assertthat::is.flag(add_total), - assertthat::is.string(total_label) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(parentname) + checkmate::assert_string(arm_var) + checkmate::assert_string(visit_var) + checkmate::assert_string(paramcd) + checkmate::assert_string(aval_var) + checkmate::assert_string(baseline_var) + checkmate::assert_flag(na.rm) + checkmate::assert_string(na_level) + checkmate::assert_string(treatment_flag_var) + checkmate::assert_string(treatment_flag) + checkmate::assert_flag(add_total) + checkmate::assert_string(total_label) y <- list() diff --git a/R/tm_t_shift_by_arm_by_worst.R b/R/tm_t_shift_by_arm_by_worst.R index d9175cf072..b46d71b70d 100644 --- a/R/tm_t_shift_by_arm_by_worst.R +++ b/R/tm_t_shift_by_arm_by_worst.R @@ -37,21 +37,19 @@ template_shift_by_arm_by_worst <- function(dataname, ) } - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(parentname), - assertthat::is.string(arm_var), - is.null(worst_flag_var) || is.character(worst_flag_var), - assertthat::is.string(paramcd), - assertthat::is.string(aval_var), - assertthat::is.string(baseline_var), - assertthat::is.flag(na.rm), - assertthat::is.string(na_level), - assertthat::is.string(treatment_flag_var), - assertthat::is.string(treatment_flag), - assertthat::is.flag(add_total), - assertthat::is.string(total_label) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(parentname) + checkmate::assert_string(arm_var) + checkmate::assert_character(worst_flag_var, null.ok = TRUE) + checkmate::assert_string(paramcd) + checkmate::assert_string(aval_var) + checkmate::assert_string(baseline_var) + checkmate::assert_flag(na.rm) + checkmate::assert_string(na_level) + checkmate::assert_string(treatment_flag_var) + checkmate::assert_string(treatment_flag) + checkmate::assert_flag(add_total) + checkmate::assert_string(total_label) y <- list() diff --git a/R/tm_t_shift_by_grade.R b/R/tm_t_shift_by_grade.R index ffceeec190..26e892cce3 100644 --- a/R/tm_t_shift_by_grade.R +++ b/R/tm_t_shift_by_grade.R @@ -28,22 +28,20 @@ template_shift_by_grade <- function(parentname, na_level = default_na_str(), code_missing_baseline = FALSE, basic_table_args = teal.widgets::basic_table_args()) { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(parentname), - assertthat::is.string(arm_var), - assertthat::is.string(id_var), - assertthat::is.string(visit_var), - assertthat::is.string(worst_flag_indicator), - is.character(worst_flag_var), - assertthat::is.string(anl_toxgrade_var), - assertthat::is.string(base_toxgrade_var), - assertthat::is.string(paramcd), - assertthat::is.flag(drop_arm_levels), - assertthat::is.flag(add_total), - assertthat::is.string(total_label), - assertthat::is.string(na_level) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(parentname) + checkmate::assert_string(arm_var) + checkmate::assert_string(id_var) + checkmate::assert_string(visit_var) + checkmate::assert_string(worst_flag_indicator) + checkmate::assert_character(worst_flag_var) + checkmate::assert_string(anl_toxgrade_var) + checkmate::assert_string(base_toxgrade_var) + checkmate::assert_string(paramcd) + checkmate::assert_flag(drop_arm_levels) + checkmate::assert_flag(add_total) + checkmate::assert_string(total_label) + checkmate::assert_string(na_level) worst_flag_var <- match.arg(worst_flag_var) diff --git a/R/tm_t_smq.R b/R/tm_t_smq.R index 98bdf7f132..9b2d65ec2f 100644 --- a/R/tm_t_smq.R +++ b/R/tm_t_smq.R @@ -24,19 +24,17 @@ template_smq <- function(dataname, baskets = c("SMQ01NAM", "SMQ02NAM", "CQ01NAM"), id_var = "USUBJID", basic_table_args = teal.widgets::basic_table_args()) { - assertthat::assert_that( - assertthat::is.string(parentname), - assertthat::is.string(dataname), - is.character(arm_var) && length(arm_var) %in% c(1, 2), - assertthat::is.string(id_var), - assertthat::is.string(llt), - assertthat::is.flag(add_total), - assertthat::is.string(total_label), - assertthat::is.flag(drop_arm_levels), - assertthat::is.string(na_level), - assertthat::is.string(smq_varlabel), - is.character(baskets) - ) + checkmate::assert_string(parentname) + checkmate::assert_string(dataname) + checkmate::assert_character(arm_var, min.len = 1, max.len = 2) + checkmate::assert_string(id_var) + checkmate::assert_string(llt) + checkmate::assert_flag(add_total) + checkmate::assert_string(total_label) + checkmate::assert_flag(drop_arm_levels) + checkmate::assert_string(na_level) + checkmate::assert_string(smq_varlabel) + checkmate::assert_character(baskets) sort_criteria <- match.arg(sort_criteria) diff --git a/R/tm_t_summary.R b/R/tm_t_summary.R index 4998fb0815..881416c022 100644 --- a/R/tm_t_summary.R +++ b/R/tm_t_summary.R @@ -27,23 +27,22 @@ template_summary <- function(dataname, denominator = c("N", "n", "omit"), drop_arm_levels = TRUE, basic_table_args = teal.widgets::basic_table_args()) { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(parentname), - is.character(sum_vars), - assertthat::is.flag(add_total), - assertthat::is.string(total_label), - is.character(var_labels), - assertthat::is.flag(na.rm), - assertthat::is.string(na_level), - assertthat::is.flag(drop_arm_levels) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(parentname) + checkmate::assert_character(sum_vars) + checkmate::assert_flag(add_total) + checkmate::assert_string(total_label) + checkmate::assert_character(var_labels) + checkmate::assert_flag(na.rm) + checkmate::assert_string(na_level) + checkmate::assert_flag(drop_arm_levels) checkmate::assert_character(arm_var, min.len = 1, max.len = 2) checkmate::assert_character(numeric_stats, min.len = 1) checkmate::assert_subset( numeric_stats, c("n", "mean_sd", "mean_ci", "median", "median_ci", "quantiles", "range", "geom_mean") ) + denominator <- match.arg(denominator) show_labels <- match.arg(show_labels) diff --git a/R/tm_t_summary_by.R b/R/tm_t_summary_by.R index 84e0fceda9..15830d3cf0 100644 --- a/R/tm_t_summary_by.R +++ b/R/tm_t_summary_by.R @@ -33,24 +33,23 @@ template_summary_by <- function(parentname, drop_arm_levels = TRUE, drop_zero_levels = TRUE, basic_table_args = teal.widgets::basic_table_args()) { - assertthat::assert_that( - assertthat::is.string(parentname), - assertthat::is.string(dataname), - assertthat::is.string(id_var), - is.character(sum_vars), - is.character(by_vars), - is.character(var_labels), - assertthat::is.flag(add_total), - assertthat::is.string(total_label), - assertthat::is.flag(parallel_vars), - assertthat::is.flag(row_groups), - assertthat::is.flag(na.rm), - assertthat::is.string(na_level), - assertthat::is.flag(drop_arm_levels), - is.character(numeric_stats), - assertthat::is.flag(drop_zero_levels) - ) + checkmate::assert_string(parentname) + checkmate::assert_string(dataname) + checkmate::assert_string(id_var) + checkmate::assert_character(sum_vars) + checkmate::assert_character(by_vars) + checkmate::assert_character(var_labels) + checkmate::assert_flag(add_total) + checkmate::assert_string(total_label) + checkmate::assert_flag(parallel_vars) + checkmate::assert_flag(row_groups) + checkmate::assert_flag(na.rm) + checkmate::assert_string(na_level) + checkmate::assert_flag(drop_arm_levels) + checkmate::assert_character(numeric_stats) + checkmate::assert_flag(drop_zero_levels) checkmate::assert_character(arm_var, min.len = 1, max.len = 2) + denominator <- match.arg(denominator) y <- list() diff --git a/R/tm_t_tte.R b/R/tm_t_tte.R index 86275e2e42..02789dfcc5 100644 --- a/R/tm_t_tte.R +++ b/R/tm_t_tte.R @@ -65,19 +65,17 @@ template_tte <- function(dataname = "ANL", total_label = default_total_label(), na_level = default_na_str(), basic_table_args = teal.widgets::basic_table_args()) { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(parentname), - assertthat::is.string(arm_var), - assertthat::is.string(aval_var), - assertthat::is.string(cnsr_var), - assertthat::is.string(time_unit_var), - assertthat::is.string(event_desc_var), - assertthat::is.flag(compare_arm), - assertthat::is.flag(combine_comp_arms), - assertthat::is.string(total_label), - assertthat::is.string(na_level) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(parentname) + checkmate::assert_string(arm_var) + checkmate::assert_string(aval_var) + checkmate::assert_string(cnsr_var) + checkmate::assert_string(time_unit_var) + checkmate::assert_string(event_desc_var) + checkmate::assert_flag(compare_arm) + checkmate::assert_flag(combine_comp_arms) + checkmate::assert_string(total_label) + checkmate::assert_string(na_level) ref_arm_val <- paste(ref_arm, collapse = "/") y <- list() diff --git a/R/utils.R b/R/utils.R index 8ae7a1d21d..5fb6096462 100644 --- a/R/utils.R +++ b/R/utils.R @@ -139,7 +139,6 @@ pipe_expr <- function(exprs, pipe_str = "%>%") { #' list. The list of expressions can be later used to generate a pipeline, #' for instance with `pipe_expr`. #' -#' @import assertthat #' @export #' #' @examples @@ -161,10 +160,8 @@ pipe_expr <- function(exprs, pipe_str = "%>%") { #' lyt <- add_expr(lyt, quote(build_table(df = dta))) #' pipe_expr(lyt) add_expr <- function(expr_ls, new_expr) { - assertthat::assert_that( - is.list(expr_ls), - is.call(new_expr) || is.name(new_expr) - ) + checkmate::assert_list(expr_ls) + checkmate::assert(is.call(new_expr) || is.name(new_expr)) # support nested expressions such as expr({a <- 1; b <- 2}) if (inherits(new_expr, "{")) { @@ -528,15 +525,13 @@ prepare_arm <- function(dataname, compare_arm = !is.null(ref_arm), ref_arm_val = paste(ref_arm, collapse = "/"), drop = TRUE) { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(arm_var), - is.null(ref_arm) || is.character(ref_arm), - is.character(comp_arm) || is.null(comp_arm), - assertthat::is.flag(compare_arm), - assertthat::is.string(ref_arm_val), - assertthat::is.flag(drop) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(arm_var) + checkmate::assert_character(ref_arm, null.ok = TRUE) + checkmate::assert_character(comp_arm, null.ok = TRUE) + checkmate::assert_flag(compare_arm) + checkmate::assert_string(ref_arm_val) + checkmate::assert_flag(drop) data_list <- list() @@ -627,12 +622,10 @@ prepare_arm_levels <- function(dataname, parentname, arm_var, drop_arm_levels = TRUE) { - assertthat::assert_that( - assertthat::is.string(dataname), - assertthat::is.string(parentname), - assertthat::is.string(arm_var), - assertthat::is.flag(drop_arm_levels) - ) + checkmate::assert_string(dataname) + checkmate::assert_string(parentname) + checkmate::assert_string(arm_var) + checkmate::assert_flag(drop_arm_levels) data_list <- list() diff --git a/man/dyn_assertion.Rd b/man/dyn_assertion.Rd deleted file mode 100644 index 2b81889c25..0000000000 --- a/man/dyn_assertion.Rd +++ /dev/null @@ -1,41 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/dynamic_assertions.R -\name{dyn_assertion} -\alias{dyn_assertion} -\alias{teal_enough_rows} -\alias{teal_has_element} -\title{Dynamic assertion} -\usage{ -teal_enough_rows(data, min_nrow) - -teal_has_element(str, ...) -} -\arguments{ -\item{data}{(\code{dataframe}).} - -\item{min_nrow}{(\code{number})\cr minimum number of rows for a valid analysis.} - -\item{str}{(\code{name})\cr the name of the object which must \emph{exist}.} - -\item{...}{(\code{character})\cr the label to be displayed.} -} -\description{ -Verifies assertions for dynamic outputs. -} -\section{Functions}{ -\itemize{ -\item \code{teal_enough_rows()}: the dataset is large enough. - -\item \code{teal_has_element()}: the element exist. - -}} -\examples{ - -library(assertthat) -library(testthat) -expect_error(assert_that(teal_enough_rows(data = iris, min_nrow = 1500))) -library(assertthat) -armcd <- NULL -expect_error(assert_that(teal_has_element(str = armcd, "ARMCD"))) -} -\keyword{internal} From c02fec5a172f8aca4a158f4637d4b31d662aec85 Mon Sep 17 00:00:00 2001 From: m7pr Date: Fri, 9 Feb 2024 12:02:59 +0000 Subject: [PATCH 075/126] [skip actions] Bump version to 0.8.16.9081 --- DESCRIPTION | 10 +++++----- NEWS.md | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index a79e83f306..756154fbee 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9080 +Version: 0.8.16.9081 Date: 2024-02-09 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), @@ -70,10 +70,10 @@ VignetteBuilder: knitr Config/Needs/verdepcheck: insightsengineering/teal, insightsengineering/teal.transform, insightsengineering/tern, - tidymodels/broom, mllg/checkmate, tidyverse/dplyr, - rstudio/DT, insightsengineering/formatters, tidyverse/ggplot2, - slowkow/ggrepel, r-lib/lifecycle, daroczig/logger, tidyverse/magrittr, - r-lib/rlang, insightsengineering/rlistings, rstudio/rmarkdown, + tidymodels/broom, mllg/checkmate, tidyverse/dplyr, rstudio/DT, + insightsengineering/formatters, tidyverse/ggplot2, slowkow/ggrepel, + r-lib/lifecycle, daroczig/logger, tidyverse/magrittr, r-lib/rlang, + insightsengineering/rlistings, rstudio/rmarkdown, insightsengineering/rtables, r-lib/scales, rstudio/shiny, daattali/shinyjs, rstudio/shinyvalidate, dreamRs/shinyWidgets, r-lib/styler, insightsengineering/teal.code, diff --git a/NEWS.md b/NEWS.md index 6b3e6b9591..f535ac0525 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9080 +# teal.modules.clinical 0.8.16.9081 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 97754d1529591be1ec4958f64284530ed672acd2 Mon Sep 17 00:00:00 2001 From: Vedha Viyash <49812166+vedhav@users.noreply.github.com> Date: Fri, 9 Feb 2024 18:13:57 +0530 Subject: [PATCH 076/126] Fix pkgdown redirect (#1049) Part of https://github.com/insightsengineering/coredev-tasks/issues/506 --- DESCRIPTION | 6 +++--- man/teal.modules.clinical.Rd | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 756154fbee..108b37416b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -21,9 +21,9 @@ Description: Provides teal modules for the standard clinical trials outputs. The teal modules add an encoding panel to interactively change the encodings within teal. License: Apache License 2.0 | file LICENSE -URL: https://github.com/insightsengineering/teal.modules.clinical -BugReports: - https://github.com/insightsengineering/teal.modules.clinical/issues +URL: https://insightsengineering.github.io/modules.clinical/, + https://github.com/insightsengineering/modules.clinical/ +BugReports: https://github.com/insightsengineering/modules.clinical/issues Depends: R (>= 4.0), teal (>= 0.14.0.9027), diff --git a/man/teal.modules.clinical.Rd b/man/teal.modules.clinical.Rd index 8f563d4bfb..227c3167a6 100644 --- a/man/teal.modules.clinical.Rd +++ b/man/teal.modules.clinical.Rd @@ -12,8 +12,9 @@ The teal modules add an encoding panel to interactively change the encodings wit \seealso{ Useful links: \itemize{ - \item \url{https://github.com/insightsengineering/teal.modules.clinical} - \item Report bugs at \url{https://github.com/insightsengineering/teal.modules.clinical/issues} + \item \url{https://insightsengineering.github.io/modules.clinical/} + \item \url{https://github.com/insightsengineering/modules.clinical/} + \item Report bugs at \url{https://github.com/insightsengineering/modules.clinical/issues} } } From f2a43805853fd662a3b8b195f6d4d810a2038fd7 Mon Sep 17 00:00:00 2001 From: vedhav Date: Fri, 9 Feb 2024 12:44:49 +0000 Subject: [PATCH 077/126] [skip actions] Bump version to 0.8.16.9082 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 108b37416b..f85022f47d 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9081 +Version: 0.8.16.9082 Date: 2024-02-09 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index f535ac0525..a6e6b5e107 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9081 +# teal.modules.clinical 0.8.16.9082 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 7dc01e038dd3c225eec7ed305b1e34390cd35e60 Mon Sep 17 00:00:00 2001 From: Insights Engineering Bot <68416928+insights-engineering-bot@users.noreply.github.com> Date: Fri, 9 Feb 2024 15:55:51 +0100 Subject: [PATCH 078/126] Propagate files from insightsengineering/.github (#1052) This PR has been automatically generated by the file propagation workflow from insightsengineering/.github. Please review the changes. Co-authored-by: walkowif --- .github/ISSUE_TEMPLATE/cran-release.yml | 121 ++++++++++++++++++++++++ .github/ISSUE_TEMPLATE/release.yml | 120 +++++++++++++++++++++++ 2 files changed, 241 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/cran-release.yml create mode 100644 .github/ISSUE_TEMPLATE/release.yml diff --git a/.github/ISSUE_TEMPLATE/cran-release.yml b/.github/ISSUE_TEMPLATE/cran-release.yml new file mode 100644 index 0000000000..ae49a1990f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/cran-release.yml @@ -0,0 +1,121 @@ +--- +name: 🎉 CRAN Release +description: Template for release to CRAN +title: "[CRAN Release]: " +labels: ["release"] +assignees: + - KlaudiaBB + - cicdguy +body: + - type: markdown + attributes: + value: | + ⚠️ Please do not link or mention any internal references in this issue. This includes internal URLs, intellectual property and references. + - type: textarea + id: blocked-by + attributes: + label: Blocked by + description: Any PRs or issues that this release is blocked by. + placeholder: Add a list of blocking PRs or issues here. + value: | + #### PRs + - [ ] PR 1 + + #### Issues + - [ ] Issue 1 + validations: + required: true + - type: textarea + id: pre-release + attributes: + label: Pre-release + description: Pre-requisites that must be fulfilled before initiating the release process. + placeholder: Add your list of pre-requisites here. + value: | + - [ ] Make sure you adhere to CRAN submission policy: + * https://cran.r-project.org/web/packages/submission_checklist.html + * https://cran.r-project.org/web/packages/policies.html. + - [ ] Make sure that high priority bugs (label "priority" + "bug") have been resolved before going into the release. + - [ ] Review old/hanging PRs before going into the release (Optional). + - [ ] Revisit R-package's lifecycle badges (Optional). + - [ ] Make sure that all upstream dependencies of this package that need to be submitted to CRAN were accepted before going into release activities. + - [ ] Make sure integration tests are green 2-3 days before the release. Look carefully through logs (check for warnings and notes). + - [ ] Decide what gets merged in before starting release activities. + - type: textarea + id: release + attributes: + label: Release + description: The steps to be taken in order to create a release. + placeholder: Steps to create a release. + value: | + #### Prepare the release + - [ ] Create a new release candidate branch + `git checkout -b release-candidate-vX.Y.Z` + - [ ] Update NEWS.md file: make sure it reflects a holistic summary of what has changed in the package. + - [ ] Remove the additional fields (`Remotes`) from the DESCRIPTION file where applicable. + - [ ] Make sure that the minimum dependency versions are updated in the DESCRIPTION file for the package and its reverse dependencies (Optional). + - [ ] Increase versioned dependency on {package name} to >=X.Y.Z (Optional). + - [ ] Commit your changes and create the PR on GitHub (add "[skip vbump]" in the PR title). Add all updates, commit, and push changes: + ```r + # Make the necessary modifications to your files + # Stage the changes + git add + # Commit the changes + git commit -m "[skip vbump] " + git push origin release-candidate-vX.Y.Z` + ``` + + #### Test the release + - [ ] Execute the manual tests on Shiny apps that are deployed on various hosting providers (Posit connect and shinyapps.io) - track the results in GitHub issue (Applicable only for frameworks that use Shiny). + - [ ] Monitor integration tests, if integration fails, create priority issues on the board. + - [ ] Execute UAT tests (Optional). + + #### CRAN submission + - [ ] Tag the update(s) as a release candidate vX.Y.Z-rc (e.g. v0.5.3-rc1) on the release candidate branch (release-candidate-vX.Y.Z). + ```r + # Create rc tag for submission for internal validation + git tag vX.Y.Z-rc + git push origin vX.Y.Z-rc + ``` + - [ ] Build the package locally using the command:`R CMD build .` which will generate a .tar.gz file necessary for the CRAN submission. + - [ ] Submit the package to https://win-builder.r-project.org/upload.aspx for testing, for more details please see "Building and checking R source packages for Windows": https://win-builder.r-project.org/. + - [ ] Once tested, send the package that was built in the previous steps to CRAN via this form: https://cran.r-project.org/submit.html. + - [ ] Address CRAN feedback, tag the package vX.Y.Z-rc(n+1) and repeat the submission to CRAN whenever necessary. + - [ ] Get the package accepted and published on CRAN. + + #### Tag the release + - [ ] If the additional fields were removed, add them back in a separate PR, and then merge the PR back to main (add "[skip vbump]" in the PR title). If nothing was removed just merge the PR you created in the "Prepare the release" section to 'main'. Note the commit hash of the merged commit. **Note:** additional commits might be added to the `main` branch by a bot or an automation - we do **NOT** want to tag this commit. + + ##### Make sure of the following before continuing + - [ ] CI checks are passing in GH before releasing the package. + - [ ] Shiny apps are deployable and there are no errors/warnings (Applicable only for frameworks that use Shiny). + + - [ ] Create a git tag with the final version set to vX.Y.Z on the main branch. In order to do this: + 1. Checkout the commit hash. + `git checkout ` + 2. Tag the hash with the release version (vX.Y.Z). + `git tag vX.Y.Z` + 3. Push the tag to make the final release. + `git push origin vX.Y.Z` + - [ ] Update downstream package dependencies to (>=X.Y.Z) in {package name}. + **Note:** Once the release tag is created, the package is automatically published to internal repositories. + - type: textarea + id: post-release + attributes: + label: Post-release + description: The list of activities to be completed after the release. + placeholder: The steps that must be taken after the release. + value: | + - [ ] Ensure that CRAN checks are passing for the package. + - [ ] Make sure that the package is published to internal repositories. + - [ ] Make sure internal documentation is up to date. + - [ ] Review and update installation instructions for the package wherever needed (Optional). + - [ ] Announce the release on ________. + - type: textarea + id: decision-tree + attributes: + label: Decision tree + description: Any decision tree(s) that would aid release management + placeholder: Any decision tree(s) that would aid release management. + value: | + Click [here](https://github.com/insightsengineering/.github/blob/main/.github/ISSUE_TEMPLATE/RELEASE_DECISION_TREE.md) to see the release decision tree. diff --git a/.github/ISSUE_TEMPLATE/release.yml b/.github/ISSUE_TEMPLATE/release.yml new file mode 100644 index 0000000000..f54d69e13e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/release.yml @@ -0,0 +1,120 @@ +--- +name: 🚀 Release +description: Template for package release +title: "[Release]: " +labels: ["release"] +assignees: + - KlaudiaBB + - cicdguy +body: + - type: markdown + attributes: + value: | + ⚠️ Please do not link or mention any internal references in this issue. This includes internal URLs, intellectual property and references. + - type: textarea + id: blocked-by + attributes: + label: Blocked by + description: Any PRs or issues that this release is blocked by. + placeholder: Add a list of blocking PRs or issues here. + value: | + #### PRs + - [ ] PR 1 + + #### Issues + - [ ] Issue 1 + validations: + required: true + - type: textarea + id: pre-release + attributes: + label: Pre-release + description: Pre-requisites that must be fulfilled before initiating the release process. + placeholder: Add your list of pre-requisites here. + value: | + - [ ] Make sure that high priority bugs (label "priority" + "bug") have been resolved before going into the release. + - [ ] Review old/hanging PRs before going into the release. + - [ ] Revisit R-package's lifecycle badges (Optional). + - [ ] Release Manager: Discuss package dependencies, create a plan to sequentially close release activities and submit groups of packages for internal validation (Applicable only for regulatory release). + - [ ] Check Validation Pipeline dry-run results for the package. + - [ ] Make sure all relevant integration tests are green 2-3 days before the release. Look carefully through logs (check for warnings and notes). + - [ ] Inform about the soft code freeze, decide what gets merged in before starting release activities. + - type: textarea + id: release + attributes: + label: Release + description: The steps to be taken in order to create a release. + placeholder: Steps to create a release. + value: | + #### Prepare the release + - [ ] Create a new release candidate branch + `git checkout -b release-candidate-vX.Y.Z` + - [ ] Update NEWS.md file: make sure it reflects a holistic summary of what has changed in the package, check README. + - [ ] Remove the additional fields (`Remotes`) from the DESCRIPTION file where applicable. + - [ ] Make sure that the minimum dependency versions are updated in the DESCRIPTION file for the package. + - [ ] Increase versioned dependency on {package name} to >=X.Y.Z. + - [ ] Commit your changes and create the PR on GitHub (add "[skip vbump]" in the PR title). Add all updates, commit, and push changes: + ```r + # Make the necessary modifications to your files + # Stage the changes + git add + # Commit the changes + git commit -m "[skip vbump] " + git push origin release-candidate-vX.Y.Z + ``` + + #### Test the release + - [ ] Execute the manual tests on Shiny apps that are deployed on various hosting providers (Posit connect and shinyapps.io) - track the results in GitHub issue (Applicable only for frameworks that use Shiny). + - [ ] Monitor integration tests, if integration fails, create priority issues on the board. + - [ ] Execute UAT tests (Optional). + + #### Validation loop + + **Note:** This section is applicable only for regulatory packages. + + - [ ] Tag the update(s) as a release candidate vX.Y.Z-rc (e.g. v0.5.3-rc1) on the release candidate branch (release-candidate-vX.Y.Z). + ```r + # Create rc tag for submission for internal validation + git tag vX.Y.Z-rc + git push origin vX.Y.Z-rc + ``` + - [ ] Submit the package for internal validation. + - [ ] Address any feedback (internal validation/user testing), retag the package as a release candidate vX.Y.Z-rc(n+1). Repeat the submission for internal validation if necessary. + - [ ] Get the package validated. + + #### Tag the release + - [ ] If the additional fields were removed, add them back in a separate PR, and then merge the PR back to main (add "[skip vbump]" in the PR title). If nothing was removed just merge the PR you created in the "Prepare the release" section to `main`. Note the commit hash of the merged commit. **Note:** additional commits might be added to the `main` branch by a bot or an automation - we do **NOT** want to tag this commit. + + ##### Make sure of the following before continuing with the release: + - [ ] CI checks are passing in GH. + - [ ] Shiny apps are deployable and there are no errors/warnings (Applicable only for frameworks that use Shiny). + + - [ ] Create a git tag with the final version set to vX.Y.Z on the main branch. In order to do this: + 1. Checkout the commit hash. + `git checkout ` + 2. Tag the hash with the release version (vX.Y.Z). + `git tag vX.Y.Z` + 3. Push the tag to make the final release. + `git push origin vX.Y.Z` + - [ ] Update downstream package dependencies to (>=X.Y.Z) in {package name}. + **Note:** Once the release tag is created, the package is automatically published to internal repositories. + - type: textarea + id: post-release + attributes: + label: Post-release + description: The list of activities to be completed after the release. + placeholder: The steps that must be taken after the release. + value: | + - [ ] Make sure that the package is published to internal repositories (Validated and/or Non-Validated repository). + - [ ] Review and update installation instructions for the package if needed. + - [ ] Make sure internal documentation/documentation catalogs are up to date. + - [ ] Notify the IDR team to start post-release/clean-up activities. + - [ ] Announce the release on ________. + - type: textarea + id: decision-tree + attributes: + label: Decision tree + description: Any decision tree(s) that would aid release management + placeholder: Any decision tree(s) that would aid release management. + value: | + Click [here](https://github.com/insightsengineering/.github/blob/main/.github/ISSUE_TEMPLATE/RELEASE_DECISION_TREE.md) to see the release decision tree. From b443bbe8875adae12f5226a989f7c4875a74c108 Mon Sep 17 00:00:00 2001 From: insights-engineering-bot Date: Fri, 9 Feb 2024 14:56:59 +0000 Subject: [PATCH 079/126] [skip actions] Bump version to 0.8.16.9083 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index f85022f47d..d96d0289ca 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9082 +Version: 0.8.16.9083 Date: 2024-02-09 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index a6e6b5e107..ea26b49215 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9082 +# teal.modules.clinical 0.8.16.9083 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From a0cb84b9c8cadd504aa2da7c242bad9dfd2cd21e Mon Sep 17 00:00:00 2001 From: Insights Engineering Bot <68416928+insights-engineering-bot@users.noreply.github.com> Date: Fri, 9 Feb 2024 17:38:37 +0100 Subject: [PATCH 080/126] [skip actions] Propagate files from insightsengineering/.github (#1053) This PR has been automatically generated by the file propagation workflow from insightsengineering/.github. Co-authored-by: walkowif --- .github/ISSUE_TEMPLATE/cran-release.yaml | 124 ----------------------- .github/ISSUE_TEMPLATE/cran-release.yml | 1 + .github/ISSUE_TEMPLATE/release.yaml | 122 ---------------------- .github/ISSUE_TEMPLATE/release.yml | 2 + 4 files changed, 3 insertions(+), 246 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/cran-release.yaml delete mode 100644 .github/ISSUE_TEMPLATE/release.yaml diff --git a/.github/ISSUE_TEMPLATE/cran-release.yaml b/.github/ISSUE_TEMPLATE/cran-release.yaml deleted file mode 100644 index bab34fcff5..0000000000 --- a/.github/ISSUE_TEMPLATE/cran-release.yaml +++ /dev/null @@ -1,124 +0,0 @@ ---- -name: 🎉 CRAN Release -description: Template for release to CRAN -title: "[Release]: " -labels: ["release"] -assignees: - - KlaudiaBB - - cicdguy - - shajoezhu -body: - - type: markdown - attributes: - value: | - ⚠️ Please do not link or mention any internal references in this issue. This includes internal URLs, intellectual property and references. - - type: textarea - id: blocked-by - attributes: - label: Blocked by - description: Any PRs or issues that this release is blocked by. - placeholder: Add a list of blocking PRs or issues here. - value: | - ### PRs - - - [ ] PR 1 - - ### Issues - - - [ ] Issue 1 - validations: - required: true - - type: textarea - id: pre-release - attributes: - label: Pre-release - description: Pre-requisites that must be fulfilled before initiating the release process. - placeholder: Add your list of pre-requisites here. - value: | - - [ ] Make sure you adhere to CRAN submission policy: https://cran.r-project.org/web/packages/submission_checklist.html; https://cran.r-project.org/web/packages/policies.html. - - [ ] Make sure that high priority bugs (label "priority" + "bug") have been resolved before going into the release. - - [ ] Review old/hanging PRs before going into the release (Optional). - - [ ] Revisit R-package's lifecycle badges (Optional). - - [ ] Make sure that all upstream dependencies of this package that need to be submitted to CRAN were accepted before going into release activities. - - [ ] Make sure integration tests are green 2-3 days before the release. Look carefully through logs (check for warnings and notes). - - [ ] Decide what gets merged in before starting release activities. - - type: textarea - id: release - attributes: - label: Release - description: The steps to be taken in order to create a release. - placeholder: Steps to create a release. - value: | - ### Prepare the release - - - [ ] Create a new release candidate branch - `git checkout -b release-candidate-vX.Y.Z` - - [ ] Update NEWS.md file: make sure it reflects a holistic summary of what has changed in the package. - - [ ] Remove the additional fields (`Remotes`) from the DESCRIPTION file where applicable. - - [ ] Make sure that the minimum dependency versions are updated in the DESCRIPTION file for the package and its reverse dependencies (Optional). - - [ ] Increase versioned dependency on {package name} to >=X.Y.Z (Optional). - - [ ] Commit your changes and create the PR on GitHub (add "[skip vbump]" in the PR title). Add all updates, commit, and push changes: - `# Make the necessary modifications to your files - # Stage the changes - git add - # Commit the changes - git commit -m "[skip vbump] " - git push origin release-candidate-vX.Y.Z` - - ### Test the release - - - [ ] Execute the manual tests on Shiny apps that are deployed on various hosting providers (Posit connect and shinyapps.io) - track the results in GitHub issue (Applicable only for frameworks that use Shiny). - - [ ] Monitor integration tests, if integration fails, create priority issues on the board. - - [ ] Execute UAT tests (Optional). - - ### CRAN submission - - - [ ] Tag the update(s) as a release candidate vX.Y.Z-rc (e.g. v0.5.3-rc1) on the release candidate branch (release-candidate-vX.Y.Z). - `# Create rc tag for submission for internal validation - git tag vX.Y.Z-rc - git push origin vX.Y.Z-rc` - - [ ] Build the package locally using the command:`R CMD build .` which will generate a .tar.gz file necessary for the CRAN submission. - - [ ] Submit the package to https://win-builder.r-project.org/upload.aspx for testing, for more details please see "Building and checking R source packages for Windows": https://win-builder.r-project.org/. - - [ ] Once tested, send the package that was built in the previous steps to CRAN via this form: https://cran.r-project.org/submit.html. - - [ ] Address CRAN feedback, tag the package vX.Y.Z-rc(n+1) and repeat the submission to CRAN whenever necessary. - - [ ] Get the package accepted and published on CRAN. - - ### Tag the release - - - [ ] If the additional fields were removed, add them back in a separate PR, and then merge the PR back to main (add "[skip vbump]" in the PR title). If nothing was removed just merge the PR you created in the "Prepare the release" section to 'main'. Note the commit hash of the merged commit. **Note:** additional commits might be added to the `main` branch by a bot or an automation - we do **NOT** want to tag this commit. - - ### Make sure of the following before continuing - - - [ ] CI checks are passing in GH before releasing the package. - - [ ] Shiny apps are deployable and there are no errors/warnings (Applicable only for frameworks that use Shiny). - - - [ ] Create a git tag with the final version set to vX.Y.Z on the main branch. In order to do this: - 1. Checkout the commit hash. - `git checkout ` - 2. Tag the hash with the release version (vX.Y.Z). - `git tag vX.Y.Z` - 3. Push the tag to make the final release. - `git push origin vX.Y.Z` - - [ ] Update downstream package dependencies to (>=X.Y.Z) in {package name}. - Note: Once the release tag is created, the package is automatically published to internal repositories. - - type: textarea - id: post-release - attributes: - label: Post-release - description: The list of activities to be completed after the release. - placeholder: The steps that must be taken after the release. - value: | - - [ ] Ensure that CRAN checks are passing for the package. - - [ ] Make sure that the package is published to internal repositories. - - [ ] Make sure internal documentation is up to date. - - [ ] Review and update installation instructions for the package wherever needed (Optional). - - [ ] Update all integration tests to reference the new release. - - [ ] Announce the release on ________. - - type: textarea - id: decision-tree - attributes: - label: Decision tree - description: Any decision tree(s) that would aid release management - placeholder: Any decision tree(s) that would aid release management. - value: | - Click [here](https://github.com/insightsengineering/.github/blob/main/.github/ISSUE_TEMPLATE/RELEASE_DECISION_TREE.md) to see the release decision tree. diff --git a/.github/ISSUE_TEMPLATE/cran-release.yml b/.github/ISSUE_TEMPLATE/cran-release.yml index ae49a1990f..b914490349 100644 --- a/.github/ISSUE_TEMPLATE/cran-release.yml +++ b/.github/ISSUE_TEMPLATE/cran-release.yml @@ -65,6 +65,7 @@ body: git push origin release-candidate-vX.Y.Z` ``` + #### Test the release - [ ] Execute the manual tests on Shiny apps that are deployed on various hosting providers (Posit connect and shinyapps.io) - track the results in GitHub issue (Applicable only for frameworks that use Shiny). - [ ] Monitor integration tests, if integration fails, create priority issues on the board. diff --git a/.github/ISSUE_TEMPLATE/release.yaml b/.github/ISSUE_TEMPLATE/release.yaml deleted file mode 100644 index 73bb11dc88..0000000000 --- a/.github/ISSUE_TEMPLATE/release.yaml +++ /dev/null @@ -1,122 +0,0 @@ ---- -name: 🚀 Release -description: Template for package release -title: "[Release]: " -labels: ["release"] -assignees: - - KlaudiaBB - - cicdguy -body: - - type: markdown - attributes: - value: | - ⚠️ Please do not link or mention any internal references in this issue. This includes internal URLs, intellectual property and references. - - type: textarea - id: blocked-by - attributes: - label: Blocked by - description: Any PRs or issues that this release is blocked by. - placeholder: Add a list of blocking PRs or issues here. - value: | - ### PRs - - - [ ] PR 1 - - ### Issues - - - [ ] Issue 1 - validations: - required: true - - type: textarea - id: pre-release - attributes: - label: Pre-release - description: Pre-requisites that must be fulfilled before initiating the release process. - placeholder: Add your list of pre-requisites here. - value: | - - [ ] Make sure that high priority bugs (label "priority" + "bug") have been resolved before going into the release. - - [ ] Review old/hanging PRs before going into the release. - - [ ] Revisit R-package's lifecycle badges (Optional). - - [ ] Release Manager: Discuss package dependencies, create a plan to sequentially close release activities and submit groups of packages for internal validation (Applicable only for regulatory release). - - [ ] Check Validation Pipeline dry-run results for the package. - - [ ] Make sure all relevant integration tests are green 2-3 days before the release. Look carefully through logs (check for warnings and notes). - - [ ] Inform about the soft code freeze, decide what gets merged in before starting release activities. - - type: textarea - id: release - attributes: - label: Release - description: The steps to be taken in order to create a release. - placeholder: Steps to create a release. - value: | - ### Prepare the release - - - [ ] Create a new release candidate branch - `git checkout -b release-candidate-vX.Y.Z` - - [ ] Update NEWS.md file: make sure it reflects a holistic summary of what has changed in the package, check README. - - [ ] Remove the additional fields (`Remotes`) from the DESCRIPTION file where applicable. - - [ ] Make sure that the minimum dependency versions are updated in the DESCRIPTION file for the package. - - [ ] Increase versioned dependency on {package name} to >=X.Y.Z. - - [ ] Commit your changes and create the PR on GitHub (add "[skip vbump]" in the PR title). Add all updates, commit, and push changes: - `# Make the necessary modifications to your files - # Stage the changes - git add - # Commit the changes - git commit -m "[skip vbump] " - git push origin release-candidate-vX.Y.Z` - - ### Test the release - - - [ ] Execute the manual tests on Shiny apps that are deployed on various hosting providers (Posit connect and shinyapps.io) - track the results in GitHub issue (Applicable only for frameworks that use Shiny). - - [ ] Monitor integration tests, if integration fails, create priority issues on the board. - - [ ] Execute UAT tests (Optional). - - ### Validation loop - - Note: This section is applicable only for regulatory packages. - - - [ ] Tag the update(s) as a release candidate vX.Y.Z-rc (e.g. v0.5.3-rc1) on the release candidate branch (release-candidate-vX.Y.Z). - `# Create rc tag for submission for internal validation - git tag vX.Y.Z-rc - git push origin vX.Y.Z-rc` - - [ ] Submit the package for internal validation. - - [ ] Address any feedback (internal validation/user testing), retag the package as a release candidate vX.Y.Z-rc(n+1). Repeat the submission for internal validation if necessary. - - [ ] Get the package validated. - - ### Tag the release - - - [ ] If the additional fields were removed, add them back in a separate PR, and then merge the PR back to main (add "[skip vbump]" in the PR title). If nothing was removed just merge the PR you created in the "Prepare the release" section to `main`. Note the commit hash of the merged commit. **Note:** additional commits might be added to the `main` branch by a bot or an automation - we do **NOT** want to tag this commit. - - #### Make sure of the following before continuing with the release: - - - [ ] CI checks are passing in GH. - - [ ] Shiny apps are deployable and there are no errors/warnings (Applicable only for frameworks that use Shiny). - - - [ ] Create a git tag with the final version set to vX.Y.Z on the main branch. In order to do this: - 1. Checkout the commit hash. - `git checkout ` - 2. Tag the hash with the release version (vX.Y.Z). - `git tag vX.Y.Z` - 3. Push the tag to make the final release. - `git push origin vX.Y.Z` - - [ ] Update downstream package dependencies to (>=X.Y.Z) in {package name}. - Note: Once the release tag is created, the package is automatically published to internal repositories. - - type: textarea - id: post-release - attributes: - label: Post-release - description: The list of activities to be completed after the release. - placeholder: The steps that must be taken after the release. - value: | - - [ ] Make sure that the package is published to internal repositories (Validated and/or Non-Validated repository). - - [ ] Review and update installation instructions for the package if needed. - - [ ] Make sure internal documentation/documentation catalogs are up to date. - - [ ] Notify the IDR team to start post-release/clean-up activities. - - [ ] Announce the release on ________. - - type: textarea - id: decision-tree - attributes: - label: Decision tree - description: Any decision tree(s) that would aid release management - placeholder: Any decision tree(s) that would aid release management. - value: | - Click [here](https://github.com/insightsengineering/.github/blob/main/.github/ISSUE_TEMPLATE/RELEASE_DECISION_TREE.md) to see the release decision tree. diff --git a/.github/ISSUE_TEMPLATE/release.yml b/.github/ISSUE_TEMPLATE/release.yml index f54d69e13e..665688e410 100644 --- a/.github/ISSUE_TEMPLATE/release.yml +++ b/.github/ISSUE_TEMPLATE/release.yml @@ -63,11 +63,13 @@ body: git push origin release-candidate-vX.Y.Z ``` + #### Test the release - [ ] Execute the manual tests on Shiny apps that are deployed on various hosting providers (Posit connect and shinyapps.io) - track the results in GitHub issue (Applicable only for frameworks that use Shiny). - [ ] Monitor integration tests, if integration fails, create priority issues on the board. - [ ] Execute UAT tests (Optional). + #### Validation loop **Note:** This section is applicable only for regulatory packages. From 39e2bc55a6d5aad4edee2b08e6e4c85ebf96dbdb Mon Sep 17 00:00:00 2001 From: Joe Zhu Date: Mon, 12 Feb 2024 15:53:19 +0800 Subject: [PATCH 081/126] Update DESCRIPTION teal 0.15.0 (#1054) part of https://github.com/insightsengineering/teal.modules.clinical/issues/919 # Pull Request Fixes #nnn Signed-off-by: Joe Zhu --- DESCRIPTION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index d96d0289ca..b2d079b991 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -26,7 +26,7 @@ URL: https://insightsengineering.github.io/modules.clinical/, BugReports: https://github.com/insightsengineering/modules.clinical/issues Depends: R (>= 4.0), - teal (>= 0.14.0.9027), + teal (>= 0.15.0), teal.transform (>= 0.4.0.9011), tern (>= 0.9.3) Imports: @@ -50,7 +50,7 @@ Imports: shinyvalidate, shinyWidgets (>= 0.5.1), stats, - teal.code (>= 0.4.1.9009), + teal.code (>= 0.5.0), teal.data (>= 0.4.0), teal.logger (>= 0.1.1), teal.reporter (>= 0.2.1), From bd513f0c33b81b5c98c0b366c564823068b1737c Mon Sep 17 00:00:00 2001 From: shajoezhu Date: Mon, 12 Feb 2024 07:54:14 +0000 Subject: [PATCH 082/126] [skip actions] Bump version to 0.8.16.9084 --- DESCRIPTION | 4 ++-- NEWS.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index b2d079b991..7a281d83da 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9083 -Date: 2024-02-09 +Version: 0.8.16.9084 +Date: 2024-02-12 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), person("Jana", "Stoilova", , "jana.stoilova@roche.com", role = "aut"), diff --git a/NEWS.md b/NEWS.md index ea26b49215..926ffcf99c 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9083 +# teal.modules.clinical 0.8.16.9084 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 8adcd6455cc95c90212469f8f80e0b5556d71ab3 Mon Sep 17 00:00:00 2001 From: walkowif <59475134+walkowif@users.noreply.github.com> Date: Mon, 12 Feb 2024 13:22:09 +0100 Subject: [PATCH 083/126] Change r.pkg.template branch to main (#1055) --- .github/workflows/check.yaml | 4 ++-- .github/workflows/docs.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index 60df82d00d..cc21eb858a 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -21,7 +21,7 @@ jobs: uses: insightsengineering/r.pkg.template/.github/workflows/audit.yaml@main r-cmd: name: R CMD Check 🧬 - uses: insightsengineering/r.pkg.template/.github/workflows/build-check-install.yaml@install-tern-from-cran + uses: insightsengineering/r.pkg.template/.github/workflows/build-check-install.yaml@main secrets: REPO_GITHUB_TOKEN: ${{ secrets.REPO_GITHUB_TOKEN }} with: @@ -51,7 +51,7 @@ jobs: uses: insightsengineering/r.pkg.template/.github/workflows/linter.yaml@main roxygen: name: Roxygen 🅾 - uses: insightsengineering/r.pkg.template/.github/workflows/roxygen.yaml@install-tern-from-cran + uses: insightsengineering/r.pkg.template/.github/workflows/roxygen.yaml@main secrets: REPO_GITHUB_TOKEN: ${{ secrets.REPO_GITHUB_TOKEN }} with: diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 1b2e49ef7a..9b7a7e54ec 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -36,7 +36,7 @@ on: jobs: docs: name: Pkgdown Docs 📚 - uses: insightsengineering/r.pkg.template/.github/workflows/pkgdown.yaml@install-tern-from-cran + uses: insightsengineering/r.pkg.template/.github/workflows/pkgdown.yaml@main secrets: REPO_GITHUB_TOKEN: ${{ secrets.REPO_GITHUB_TOKEN }} with: From a405eeb9af8a55d5978dbe784da00156b286f75c Mon Sep 17 00:00:00 2001 From: walkowif Date: Mon, 12 Feb 2024 12:23:04 +0000 Subject: [PATCH 084/126] [skip actions] Bump version to 0.8.16.9085 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 7a281d83da..ca5d2b5ec1 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9084 +Version: 0.8.16.9085 Date: 2024-02-12 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 926ffcf99c..efbd81ce5b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9084 +# teal.modules.clinical 0.8.16.9085 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 4b4849d2f50b550447ff95e8b439f5003499eb46 Mon Sep 17 00:00:00 2001 From: kartikeya kirar Date: Wed, 14 Feb 2024 10:02:22 +0530 Subject: [PATCH 085/126] removing internal functions example. (#1051) fixes: https://github.com/insightsengineering/teal.modules.clinical/issues/1050 --------- Co-authored-by: Marcin <133694481+m7pr@users.noreply.github.com> --- NAMESPACE | 1 + R/arm_ref_comp.R | 50 ----------------- R/facet_grid_formula.R | 3 -- R/string_ops.R | 3 +- R/substitute_names.R | 22 +------- R/validate_standard_inputs.R | 94 -------------------------------- _pkgdown.yml | 1 + man/arm_ref_comp_observer.Rd | 51 ------------------ man/as_num.Rd | 2 - man/facet_grid_formula.Rd | 4 -- man/substitute_names.Rd | 16 ------ man/substitute_q.Rd | 6 --- man/validate_standard_inputs.Rd | 95 --------------------------------- 13 files changed, 5 insertions(+), 343 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index ed4503098c..563d643c72 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -6,6 +6,7 @@ S3method(as_num,factor) S3method(as_num,logical) S3method(as_num,numeric) export(add_expr) +export(as_num) export(bracket_expr) export(call_concatenate) export(clean_description) diff --git a/R/arm_ref_comp.R b/R/arm_ref_comp.R index b337bedb31..e61363967f 100644 --- a/R/arm_ref_comp.R +++ b/R/arm_ref_comp.R @@ -24,56 +24,6 @@ #' and comparison arm #' @keywords internal #' -#' @examples -#' library(teal.widgets) -#' library(shinyvalidate) -#' -#' arm_ref_comp_observer <- getFromNamespace("arm_ref_comp_observer", "teal.modules.clinical") -#' -#' arm_ref_comp <- list(ARMCD = list(ref = "ARM A", comp = c("ARM B"))) -#' arm_var <- choices_selected(c("ARM", "ARMCD"), "ARMCD") -#' -#' adsl <- data.frame(ARM = c("ARM 1", "ARM 2"), ARMCD = c("ARM A", "ARM B")) -#' -#' ui <- fluidPage( -#' sidebarLayout( -#' sidebarPanel( -#' optionalSelectInput( -#' "arm", -#' "Treatment Variable", -#' choices = arm_var$choices, -#' selected = arm_var$selected -#' ), -#' uiOutput("arms_buckets") -#' ), -#' mainPanel( -#' textOutput("result") -#' ) -#' ) -#' ) -#' -#' server <- function(input, output, session) { -#' iv_arm_ref <- arm_ref_comp_observer( -#' session, -#' input, -#' output, -#' id_arm_var = "arm", -#' data = adsl, -#' arm_ref_comp = arm_ref_comp, -#' module = "example" -#' ) -#' -#' output$result <- renderText({ -#' iv <- InputValidator$new() -#' iv$add_validator(iv_arm_ref) -#' iv$enable() -#' validate_inputs(iv) -#' "Valid selection has been made!" -#' }) -#' } -#' if (interactive()) { -#' shinyApp(ui, server) -#' } arm_ref_comp_observer <- function(session, input, output, diff --git a/R/facet_grid_formula.R b/R/facet_grid_formula.R index a5cf4d1748..c9e04df973 100644 --- a/R/facet_grid_formula.R +++ b/R/facet_grid_formula.R @@ -15,9 +15,6 @@ #' #' @keywords internal #' -#' @examples -#' facet_grid_formula <- getFromNamespace("facet_grid_formula", "teal.modules.clinical") -#' facet_grid_formula("x", "y") facet_grid_formula <- function(x_facet, y_facet) { if (length(x_facet) == 0) x_facet <- "." if (length(y_facet) == 0) y_facet <- "." diff --git a/R/string_ops.R b/R/string_ops.R index 8b30ada904..f503c21809 100644 --- a/R/string_ops.R +++ b/R/string_ops.R @@ -14,7 +14,6 @@ #' associated with an list item. #' #' @examples -#' as_num <- getFromNamespace("as_num", "teal.modules.clinical") #' dta <- list( #' character = c("text10,20.5letter30.!", "!-.40$$-50e5[", NA), #' factor = factor(c("]+60e-6, 7.7%%8L", "%90sep.100\"1L", NA_character_)), @@ -22,7 +21,7 @@ #' logical = c(TRUE, FALSE, NA) #' ) #' lapply(dta, as_num) -#' @keywords internal +#' @export as_num <- function(str) { # nolint # nousage UseMethod("as_num") } diff --git a/R/substitute_names.R b/R/substitute_names.R index a8a224e7c5..24f4eeb956 100644 --- a/R/substitute_names.R +++ b/R/substitute_names.R @@ -12,12 +12,8 @@ #' @note This is simplified from the package `pryr` to avoid another dependency. #' @seealso [substitute_names()] #' -#' @examples -#' substitute_q <- getFromNamespace("substitute_q", "teal.modules.clinical") -#' x <- quote(a + b) -#' substitute(x, list(a = 1, b = 2)) -#' substitute_q(x, list(a = 1, b = 2)) #' @keywords internal +#' substitute_q <- function(qexpr, env) { stopifnot(is.language(qexpr)) call <- substitute(substitute(qexpr, env), list(qexpr = qexpr)) @@ -39,22 +35,8 @@ substitute_q <- function(qexpr, env) { #' @return The modified expression. #' @seealso [substitute_q()] #' -#' @examples -#' substitute_names <- getFromNamespace("substitute_names", "teal.modules.clinical") -#' substitute_names( -#' mutate(a = a + b, b = c + d), -#' names = list(a = as.name("d"), b = as.name("e")) -#' ) -#' substitute_names( -#' c(a = fun(a), b = 3), -#' names = list(a = as.name("b"), b = as.name("c")) -#' ) -#' substitute_names( -#' c(a = fun(a), b = bla), -#' names = list(a = as.name("b"), b = as.name("c")), -#' others = list(bla = "foo") -#' ) #' @keywords internal +#' substitute_names <- function(expr, names, others = list()) { checkmate::assert_list(names, min.len = 1, names = "unique", types = "name") checkmate::assert_list(others, min.len = 0, names = "unique") diff --git a/R/validate_standard_inputs.R b/R/validate_standard_inputs.R index ef97f391ea..48e5acf389 100644 --- a/R/validate_standard_inputs.R +++ b/R/validate_standard_inputs.R @@ -18,100 +18,6 @@ #' #' @keywords internal #' -#' @examples -#' # Internal function - validate_standard_inputs -#' validate_standard_inputs <- getFromNamespace("validate_standard_inputs", "teal.modules.clinical") -#' adsl <- tmc_ex_adsl -#' adae <- tmc_ex_adae -#' -#' ui <- fluidPage( -#' sliderInput("obs", "Max Age", -#' min = 0, max = 100, value = 100 -#' ), -#' sliderInput("maxgr", "Max Grade", -#' min = 0, max = 5, value = 5 -#' ), -#' plotOutput("plot") -#' ) -#' -#' server <- function(input, output) { -#' output$plot <- renderPlot({ -#' keep_adsl <- c("USUBJID", "STUDYID", "ARMCD", "AGE", "ARM") -#' keep_adae <- c("USUBJID", "STUDYID", "AETOXGR") -#' -#' adsl_f <- adsl[adsl$AGE <= input$obs, keep_adsl] -#' adae_f <- adae[as.numeric(adae$AETOXGR) <= input$maxgr, keep_adae] -#' -#' validate_standard_inputs( -#' adsl = adsl_f, -#' adslvars = keep_adsl, -#' anl = adae_f, -#' anlvars = keep_adae, -#' arm_var = "ARM", -#' need_arm = TRUE -#' ) -#' -#' ANL <- merge(adsl_f, adae_f, by = c("USUBJID", "STUDYID")) -#' -#' plot(ANL$AGE, jitter(as.numeric(ANL$AETOXGR)), xlab = "AGE", ylab = "AETOXGR") -#' }) -#' } -#' if (interactive()) { -#' shinyApp(ui, server) -#' } -#' -#' server2 <- function(input, output) { -#' output$plot <- renderPlot({ -#' keep_adsl <- c("USUBJID", "STUDYID", "ARMCD", "AGE", "ARM") -#' keep_adae <- c("USUBJID", "STUDYID", "AETOXGR") -#' -#' adsl_f <- adsl[adsl$AGE <= input$obs, keep_adsl] -#' adae_f <- adae[as.numeric(adae$AETOXGR) <= input$maxgr, keep_adae] -#' -#' validate_standard_inputs( -#' adsl = adsl_f, -#' adslvars = keep_adsl, -#' anl = adae_f, -#' anlvars = keep_adae, -#' arm_var = NULL, -#' need_arm = FALSE -#' ) -#' -#' ANL <- merge(adsl_f, adae_f, by = c("USUBJID", "STUDYID")) -#' -#' plot(ANL$AGE, jitter(as.numeric(ANL$AETOXGR)), xlab = "AGE", ylab = "AETOXGR") -#' }) -#' } -#' if (interactive()) { -#' shinyApp(ui, server2) -#' } -#' -#' server3 <- function(input, output) { -#' output$plot <- renderPlot({ -#' keep_adsl <- c("USUBJID", "STUDYID", "ARMCD", "AGE", "ARM") -#' keep_adae <- c("USUBJID", "STUDYID", "AETOXGR") -#' -#' adsl_f <- adsl[adsl$AGE <= input$obs, keep_adsl] -#' adae_f <- adae[as.numeric(adae$AETOXGR) <= input$maxgr, keep_adae] -#' -#' validate_standard_inputs( -#' adsl = adsl_f, -#' adslvars = keep_adsl, -#' anl = adae_f, -#' anlvars = keep_adae, -#' arm_var = "HELLO", -#' need_arm = FALSE -#' ) -#' -#' ANL <- merge(adsl_f, adae_f, by = c("USUBJID", "STUDYID")) -#' -#' plot(ANL$AGE, jitter(as.numeric(ANL$AETOXGR)), xlab = "AGE", ylab = "AETOXGR") -#' }) -#' } -#' if (interactive()) { -#' shinyApp(ui, server3) -#' } -#' validate_standard_inputs <- function(adsl, adslvars = character(0), anl, diff --git a/_pkgdown.yml b/_pkgdown.yml index ba8158ba2e..83d019b44a 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -39,6 +39,7 @@ reference: - title: Helper functions contents: - add_expr + - as_num - bracket_expr - call_concatenate - clean_description diff --git a/man/arm_ref_comp_observer.Rd b/man/arm_ref_comp_observer.Rd index c2e49a34f4..1037382fea 100644 --- a/man/arm_ref_comp_observer.Rd +++ b/man/arm_ref_comp_observer.Rd @@ -57,55 +57,4 @@ and comparison arm \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#stable}{\figure{lifecycle-stable.svg}{options: alt='[Stable]'}}}{\strong{[Stable]}} Updates the reference and comparison Treatments when the selected Treatment variable changes } -\examples{ -library(teal.widgets) -library(shinyvalidate) - -arm_ref_comp_observer <- getFromNamespace("arm_ref_comp_observer", "teal.modules.clinical") - -arm_ref_comp <- list(ARMCD = list(ref = "ARM A", comp = c("ARM B"))) -arm_var <- choices_selected(c("ARM", "ARMCD"), "ARMCD") - -adsl <- data.frame(ARM = c("ARM 1", "ARM 2"), ARMCD = c("ARM A", "ARM B")) - -ui <- fluidPage( - sidebarLayout( - sidebarPanel( - optionalSelectInput( - "arm", - "Treatment Variable", - choices = arm_var$choices, - selected = arm_var$selected - ), - uiOutput("arms_buckets") - ), - mainPanel( - textOutput("result") - ) - ) -) - -server <- function(input, output, session) { - iv_arm_ref <- arm_ref_comp_observer( - session, - input, - output, - id_arm_var = "arm", - data = adsl, - arm_ref_comp = arm_ref_comp, - module = "example" - ) - - output$result <- renderText({ - iv <- InputValidator$new() - iv$add_validator(iv_arm_ref) - iv$enable() - validate_inputs(iv) - "Valid selection has been made!" - }) -} -if (interactive()) { - shinyApp(ui, server) -} -} \keyword{internal} diff --git a/man/as_num.Rd b/man/as_num.Rd index f74d54fee8..60aaa96ab5 100644 --- a/man/as_num.Rd +++ b/man/as_num.Rd @@ -38,7 +38,6 @@ The function is intended to extract any numeric from a character string, factor levels, boolean and return a vector of numeric. } \examples{ -as_num <- getFromNamespace("as_num", "teal.modules.clinical") dta <- list( character = c("text10,20.5letter30.!", "!-.40$$-50e5[", NA), factor = factor(c("]+60e-6, 7.7\%\%8L", "\%90sep.100\"1L", NA_character_)), @@ -47,4 +46,3 @@ dta <- list( ) lapply(dta, as_num) } -\keyword{internal} diff --git a/man/facet_grid_formula.Rd b/man/facet_grid_formula.Rd index ad3d59b879..33a99c6788 100644 --- a/man/facet_grid_formula.Rd +++ b/man/facet_grid_formula.Rd @@ -20,8 +20,4 @@ facet grid formula \code{formula(x_facet ~ y_facet)} \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#stable}{\figure{lifecycle-stable.svg}{options: alt='[Stable]'}}}{\strong{[Stable]}} Replaces \code{x_facet} or \code{y_facet} by . when empty character } -\examples{ -facet_grid_formula <- getFromNamespace("facet_grid_formula", "teal.modules.clinical") -facet_grid_formula("x", "y") -} \keyword{internal} diff --git a/man/substitute_names.Rd b/man/substitute_names.Rd index 8a50ea6478..7a12efa537 100644 --- a/man/substitute_names.Rd +++ b/man/substitute_names.Rd @@ -45,22 +45,6 @@ quoted expression. Note that this is just a synonym for \code{\link[=substitute_q]{substitute_q()}}. }} -\examples{ -substitute_names <- getFromNamespace("substitute_names", "teal.modules.clinical") -substitute_names( - mutate(a = a + b, b = c + d), - names = list(a = as.name("d"), b = as.name("e")) -) -substitute_names( - c(a = fun(a), b = 3), - names = list(a = as.name("b"), b = as.name("c")) -) -substitute_names( - c(a = fun(a), b = bla), - names = list(a = as.name("b"), b = as.name("c")), - others = list(bla = "foo") -) -} \seealso{ \code{\link[=substitute_q]{substitute_q()}} } diff --git a/man/substitute_q.Rd b/man/substitute_q.Rd index a5217aaadb..b13e800a6b 100644 --- a/man/substitute_q.Rd +++ b/man/substitute_q.Rd @@ -22,12 +22,6 @@ a quoted expression. \note{ This is simplified from the package \code{pryr} to avoid another dependency. } -\examples{ -substitute_q <- getFromNamespace("substitute_q", "teal.modules.clinical") -x <- quote(a + b) -substitute(x, list(a = 1, b = 2)) -substitute_q(x, list(a = 1, b = 2)) -} \seealso{ \code{\link[=substitute_names]{substitute_names()}} } diff --git a/man/validate_standard_inputs.Rd b/man/validate_standard_inputs.Rd index 1775527bc8..e76175de25 100644 --- a/man/validate_standard_inputs.Rd +++ b/man/validate_standard_inputs.Rd @@ -46,100 +46,5 @@ Use \code{NULL} for no maximum.} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#stable}{\figure{lifecycle-stable.svg}{options: alt='[Stable]'}}}{\strong{[Stable]}} -} -\examples{ -# Internal function - validate_standard_inputs -validate_standard_inputs <- getFromNamespace("validate_standard_inputs", "teal.modules.clinical") -adsl <- tmc_ex_adsl -adae <- tmc_ex_adae - -ui <- fluidPage( - sliderInput("obs", "Max Age", - min = 0, max = 100, value = 100 - ), - sliderInput("maxgr", "Max Grade", - min = 0, max = 5, value = 5 - ), - plotOutput("plot") -) - -server <- function(input, output) { - output$plot <- renderPlot({ - keep_adsl <- c("USUBJID", "STUDYID", "ARMCD", "AGE", "ARM") - keep_adae <- c("USUBJID", "STUDYID", "AETOXGR") - - adsl_f <- adsl[adsl$AGE <= input$obs, keep_adsl] - adae_f <- adae[as.numeric(adae$AETOXGR) <= input$maxgr, keep_adae] - - validate_standard_inputs( - adsl = adsl_f, - adslvars = keep_adsl, - anl = adae_f, - anlvars = keep_adae, - arm_var = "ARM", - need_arm = TRUE - ) - - ANL <- merge(adsl_f, adae_f, by = c("USUBJID", "STUDYID")) - - plot(ANL$AGE, jitter(as.numeric(ANL$AETOXGR)), xlab = "AGE", ylab = "AETOXGR") - }) -} -if (interactive()) { - shinyApp(ui, server) -} - -server2 <- function(input, output) { - output$plot <- renderPlot({ - keep_adsl <- c("USUBJID", "STUDYID", "ARMCD", "AGE", "ARM") - keep_adae <- c("USUBJID", "STUDYID", "AETOXGR") - - adsl_f <- adsl[adsl$AGE <= input$obs, keep_adsl] - adae_f <- adae[as.numeric(adae$AETOXGR) <= input$maxgr, keep_adae] - - validate_standard_inputs( - adsl = adsl_f, - adslvars = keep_adsl, - anl = adae_f, - anlvars = keep_adae, - arm_var = NULL, - need_arm = FALSE - ) - - ANL <- merge(adsl_f, adae_f, by = c("USUBJID", "STUDYID")) - - plot(ANL$AGE, jitter(as.numeric(ANL$AETOXGR)), xlab = "AGE", ylab = "AETOXGR") - }) -} -if (interactive()) { - shinyApp(ui, server2) -} - -server3 <- function(input, output) { - output$plot <- renderPlot({ - keep_adsl <- c("USUBJID", "STUDYID", "ARMCD", "AGE", "ARM") - keep_adae <- c("USUBJID", "STUDYID", "AETOXGR") - - adsl_f <- adsl[adsl$AGE <= input$obs, keep_adsl] - adae_f <- adae[as.numeric(adae$AETOXGR) <= input$maxgr, keep_adae] - - validate_standard_inputs( - adsl = adsl_f, - adslvars = keep_adsl, - anl = adae_f, - anlvars = keep_adae, - arm_var = "HELLO", - need_arm = FALSE - ) - - ANL <- merge(adsl_f, adae_f, by = c("USUBJID", "STUDYID")) - - plot(ANL$AGE, jitter(as.numeric(ANL$AETOXGR)), xlab = "AGE", ylab = "AETOXGR") - }) -} -if (interactive()) { - shinyApp(ui, server3) -} - } \keyword{internal} From 85b1140ea4d3db4853abdaf3930cafbefb4e3bc6 Mon Sep 17 00:00:00 2001 From: kartikeyakirar Date: Wed, 14 Feb 2024 04:33:17 +0000 Subject: [PATCH 086/126] [skip actions] Bump version to 0.8.16.9086 --- DESCRIPTION | 4 ++-- NEWS.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index ca5d2b5ec1..0a7bd42d59 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9085 -Date: 2024-02-12 +Version: 0.8.16.9086 +Date: 2024-02-14 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), person("Jana", "Stoilova", , "jana.stoilova@roche.com", role = "aut"), diff --git a/NEWS.md b/NEWS.md index efbd81ce5b..c5b943636a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9085 +# teal.modules.clinical 0.8.16.9086 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 2c1d0b91d3e4536be5fdb84e76034686a57e7f51 Mon Sep 17 00:00:00 2001 From: Vedha Viyash <49812166+vedhav@users.noreply.github.com> Date: Wed, 14 Feb 2024 19:19:34 +0530 Subject: [PATCH 087/126] Append the teal.transform namespace to stay consistent (#1056) Just a small doc change to stay consistent throughout the param function docs. As we're using `teal.transform::choices_selected` and `teal.transform::data_extract_spec` in almost all the places. --- R/argument_convention.R | 8 ++++---- R/tm_t_tte.R | 8 ++++---- man/module_arguments.Rd | 8 ++++---- man/tm_a_gee.Rd | 4 ++-- man/tm_a_mmrm.Rd | 4 ++-- man/tm_g_forest_rsp.Rd | 4 ++-- man/tm_g_forest_tte.Rd | 4 ++-- man/tm_g_km.Rd | 4 ++-- man/tm_t_abnormality.Rd | 4 ++-- man/tm_t_abnormality_by_worst_grade.Rd | 4 ++-- man/tm_t_ancova.Rd | 4 ++-- man/tm_t_binary_outcome.Rd | 4 ++-- man/tm_t_coxreg.Rd | 4 ++-- man/tm_t_events.Rd | 4 ++-- man/tm_t_events_by_grade.Rd | 4 ++-- man/tm_t_events_patyear.Rd | 4 ++-- man/tm_t_events_summary.Rd | 4 ++-- man/tm_t_mult_events.Rd | 4 ++-- man/tm_t_shift_by_arm.Rd | 4 ++-- man/tm_t_shift_by_arm_by_worst.Rd | 4 ++-- man/tm_t_shift_by_grade.Rd | 4 ++-- man/tm_t_smq.Rd | 4 ++-- man/tm_t_summary.Rd | 4 ++-- man/tm_t_summary_by.Rd | 4 ++-- man/tm_t_tte.Rd | 16 ++++++++-------- 25 files changed, 62 insertions(+), 62 deletions(-) diff --git a/R/argument_convention.R b/R/argument_convention.R index d28219bd25..3efafb886f 100644 --- a/R/argument_convention.R +++ b/R/argument_convention.R @@ -120,8 +120,8 @@ NULL #' with delayed [teal.transform::variable_choices()] or delayed [teal.transform::value_choices()] #' with the elements named `ref` and `comp` that the defined the default #' reference and comparison arms when the arm variable is changed. -#' @param arm_var (`choices_selected` or `data_extract_spec`)\cr object with all available choices -#' and preselected option for variable names that can be used as `arm_var`. +#' @param arm_var ([`teal.transform::choices_selected()`] or [`teal.transform::data_extract_spec()`])\cr object with all +#' available choices and preselected option for variable names that can be used as `arm_var`. #' It defines the grouping variable(s) in the results table. #' If there are two elements selected for `arm_var`, #' second variable will be nested under the first variable. @@ -189,8 +189,8 @@ NULL #' the variables that should be summarized. #' @param subgroup_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with #' all available choices and preselected option for variable names that can be used as the default subgroups. -#' @param time_points (`choices_selected`)\cr object with all available choices and preselected option for time -#' points that can be used in [tern::surv_timepoint()]. +#' @param time_points ([teal.transform::choices_selected()])\cr object with all available choices and preselected option +#' for time points that can be used in [tern::surv_timepoint()]. #' @param time_unit_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object #' with all available choices and pre-selected option for the time unit variable. #' @param treatment_flag ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr value diff --git a/R/tm_t_tte.R b/R/tm_t_tte.R index 02789dfcc5..fbfa654a87 100644 --- a/R/tm_t_tte.R +++ b/R/tm_t_tte.R @@ -381,10 +381,10 @@ template_tte <- function(dataname = "ANL", #' #' @inheritParams module_arguments #' @inheritParams template_tte -#' @param conf_level_coxph ([choices_selected()])\cr object with all available choices and pre-selected option -#' for confidence level, each within range of (0, 1). -#' @param conf_level_survfit ([choices_selected()])\cr object with all available choices and pre-selected option -#' for confidence level, each within range of (0, 1). +#' @param conf_level_coxph ([teal.transform::choices_selected()])\cr object with all available choices and +#' pre-selected option for confidence level, each within range of (0, 1). +#' @param conf_level_survfit ([teal.transform::choices_selected()])\cr object with all available choices and +#' pre-selected option for confidence level, each within range of (0, 1). #' @param event_desc_var (`character` or [data_extract_spec()])\cr variable name with the event description #' information, optional. #' diff --git a/man/module_arguments.Rd b/man/module_arguments.Rd index cc1bb866c0..5222abc0ff 100644 --- a/man/module_arguments.Rd +++ b/man/module_arguments.Rd @@ -10,8 +10,8 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} @@ -112,8 +112,8 @@ the variables that should be summarized.} \item{subgroup_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for variable names that can be used as the default subgroups.} -\item{time_points}{(\code{choices_selected})\cr object with all available choices and preselected option for time -points that can be used in \code{\link[tern:survival_timepoint]{tern::surv_timepoint()}}.} +\item{time_points}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option +for time points that can be used in \code{\link[tern:survival_timepoint]{tern::surv_timepoint()}}.} \item{time_unit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and pre-selected option for the time unit variable.} diff --git a/man/tm_a_gee.Rd b/man/tm_a_gee.Rd index d69fd99c5c..8820254e55 100644 --- a/man/tm_a_gee.Rd +++ b/man/tm_a_gee.Rd @@ -36,8 +36,8 @@ all available choices and pre-selected option for the analysis variable.} \item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying the variable name for subject id.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_a_mmrm.Rd b/man/tm_a_mmrm.Rd index bd5fcca7f1..470557355e 100644 --- a/man/tm_a_mmrm.Rd +++ b/man/tm_a_mmrm.Rd @@ -42,8 +42,8 @@ all available choices and pre-selected option for the analysis variable.} \item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying the variable name for subject id.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_g_forest_rsp.Rd b/man/tm_g_forest_rsp.Rd index c9e6ac0626..bad2c0d4c5 100644 --- a/man/tm_g_forest_rsp.Rd +++ b/man/tm_g_forest_rsp.Rd @@ -35,8 +35,8 @@ tm_g_forest_rsp( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_g_forest_tte.Rd b/man/tm_g_forest_tte.Rd index 4b12451ec8..397d0c9fc4 100644 --- a/man/tm_g_forest_tte.Rd +++ b/man/tm_g_forest_tte.Rd @@ -38,8 +38,8 @@ tm_g_forest_tte( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_g_km.Rd b/man/tm_g_km.Rd index b63f761c33..45471899f2 100644 --- a/man/tm_g_km.Rd +++ b/man/tm_g_km.Rd @@ -36,8 +36,8 @@ tm_g_km( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_t_abnormality.Rd b/man/tm_t_abnormality.Rd index 46b77bb17a..c19b152539 100644 --- a/man/tm_t_abnormality.Rd +++ b/man/tm_t_abnormality.Rd @@ -39,8 +39,8 @@ tm_t_abnormality( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_t_abnormality_by_worst_grade.Rd b/man/tm_t_abnormality_by_worst_grade.Rd index 3c5e85cc83..7c2fd82879 100644 --- a/man/tm_t_abnormality_by_worst_grade.Rd +++ b/man/tm_t_abnormality_by_worst_grade.Rd @@ -38,8 +38,8 @@ tm_t_abnormality_by_worst_grade( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_t_ancova.Rd b/man/tm_t_ancova.Rd index 504666c359..0aa525348b 100644 --- a/man/tm_t_ancova.Rd +++ b/man/tm_t_ancova.Rd @@ -32,8 +32,8 @@ tm_t_ancova( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_t_binary_outcome.Rd b/man/tm_t_binary_outcome.Rd index c0afebd84c..3b6386f8f8 100644 --- a/man/tm_t_binary_outcome.Rd +++ b/man/tm_t_binary_outcome.Rd @@ -36,8 +36,8 @@ tm_t_binary_outcome( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_t_coxreg.Rd b/man/tm_t_coxreg.Rd index 3b892fe52f..3c308d444f 100644 --- a/man/tm_t_coxreg.Rd +++ b/man/tm_t_coxreg.Rd @@ -34,8 +34,8 @@ tm_t_coxreg( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_t_events.Rd b/man/tm_t_events.Rd index 3d452f3703..d56dd71f67 100644 --- a/man/tm_t_events.Rd +++ b/man/tm_t_events.Rd @@ -34,8 +34,8 @@ tm_t_events( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_t_events_by_grade.Rd b/man/tm_t_events_by_grade.Rd index 6cf03dde44..6aa2fa025d 100644 --- a/man/tm_t_events_by_grade.Rd +++ b/man/tm_t_events_by_grade.Rd @@ -34,8 +34,8 @@ tm_t_events_by_grade( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_t_events_patyear.Rd b/man/tm_t_events_patyear.Rd index cfedf5482c..e104bcf9f2 100644 --- a/man/tm_t_events_patyear.Rd +++ b/man/tm_t_events_patyear.Rd @@ -34,8 +34,8 @@ tm_t_events_patyear( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_t_events_summary.Rd b/man/tm_t_events_summary.Rd index 4cb8f36482..e1aad8c8a5 100644 --- a/man/tm_t_events_summary.Rd +++ b/man/tm_t_events_summary.Rd @@ -40,8 +40,8 @@ tm_t_events_summary( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_t_mult_events.Rd b/man/tm_t_mult_events.Rd index a494044599..3609d27d49 100644 --- a/man/tm_t_mult_events.Rd +++ b/man/tm_t_mult_events.Rd @@ -30,8 +30,8 @@ tm_t_mult_events( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_t_shift_by_arm.Rd b/man/tm_t_shift_by_arm.Rd index 1128696ad3..e83138160c 100644 --- a/man/tm_t_shift_by_arm.Rd +++ b/man/tm_t_shift_by_arm.Rd @@ -35,8 +35,8 @@ tm_t_shift_by_arm( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_t_shift_by_arm_by_worst.Rd b/man/tm_t_shift_by_arm_by_worst.Rd index 33b9b31b7c..2b8b2f2fd0 100644 --- a/man/tm_t_shift_by_arm_by_worst.Rd +++ b/man/tm_t_shift_by_arm_by_worst.Rd @@ -35,8 +35,8 @@ tm_t_shift_by_arm_by_worst( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_t_shift_by_grade.Rd b/man/tm_t_shift_by_grade.Rd index b97cfe154a..e7e4e7d3c9 100644 --- a/man/tm_t_shift_by_grade.Rd +++ b/man/tm_t_shift_by_grade.Rd @@ -44,8 +44,8 @@ tm_t_shift_by_grade( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_t_smq.Rd b/man/tm_t_smq.Rd index 19912d23fe..ab5f6338d2 100644 --- a/man/tm_t_smq.Rd +++ b/man/tm_t_smq.Rd @@ -33,8 +33,8 @@ tm_t_smq( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_t_summary.Rd b/man/tm_t_summary.Rd index 8e82e6f10e..416f9d7605 100644 --- a/man/tm_t_summary.Rd +++ b/man/tm_t_summary.Rd @@ -31,8 +31,8 @@ tm_t_summary( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_t_summary_by.Rd b/man/tm_t_summary_by.Rd index 889393175a..26409f4e55 100644 --- a/man/tm_t_summary_by.Rd +++ b/man/tm_t_summary_by.Rd @@ -38,8 +38,8 @@ tm_t_summary_by( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} diff --git a/man/tm_t_tte.Rd b/man/tm_t_tte.Rd index 2242493dac..dcf2930a6b 100644 --- a/man/tm_t_tte.Rd +++ b/man/tm_t_tte.Rd @@ -41,8 +41,8 @@ tm_t_tte( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{choices_selected} or \code{data_extract_spec})\cr object with all available choices -and preselected option for variable names that can be used as \code{arm_var}. +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} @@ -65,14 +65,14 @@ all available choices and pre-selected option for the analysis variable.} \item{cnsr_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and preselected option for the censoring variable.} -\item{conf_level_coxph}{(\code{\link[=choices_selected]{choices_selected()}})\cr object with all available choices and pre-selected option -for confidence level, each within range of (0, 1).} +\item{conf_level_coxph}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and +pre-selected option for confidence level, each within range of (0, 1).} -\item{conf_level_survfit}{(\code{\link[=choices_selected]{choices_selected()}})\cr object with all available choices and pre-selected option -for confidence level, each within range of (0, 1).} +\item{conf_level_survfit}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and +pre-selected option for confidence level, each within range of (0, 1).} -\item{time_points}{(\code{choices_selected})\cr object with all available choices and preselected option for time -points that can be used in \code{\link[tern:survival_timepoint]{tern::surv_timepoint()}}.} +\item{time_points}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option +for time points that can be used in \code{\link[tern:survival_timepoint]{tern::surv_timepoint()}}.} \item{time_unit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all available choices and pre-selected option for the time unit variable.} From 16d65b218d002e3f0ed9485a9fa3ffc1f7b0a59c Mon Sep 17 00:00:00 2001 From: vedhav Date: Wed, 14 Feb 2024 13:50:35 +0000 Subject: [PATCH 088/126] [skip actions] Bump version to 0.8.16.9087 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 0a7bd42d59..a833dd2652 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9086 +Version: 0.8.16.9087 Date: 2024-02-14 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index c5b943636a..1f98b475be 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9086 +# teal.modules.clinical 0.8.16.9087 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 15ea8e6df5dd22b339c224b8d170de24a1e5f1ad Mon Sep 17 00:00:00 2001 From: Davide Garolini Date: Thu, 15 Feb 2024 10:00:28 +0100 Subject: [PATCH 089/126] Check description and vignette (#1045) Fixes #1009 --------- Signed-off-by: Davide Garolini --- DESCRIPTION | 7 +++--- vignettes/quickstart_substitute.Rmd | 6 ++--- vignettes/teal-modules-clinical.Rmd | 36 +++++++++++++++++++++-------- 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index a833dd2652..16319a8309 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -17,9 +17,10 @@ Authors@R: c( person("Imanol", "Zubizarreta", role = "ctb"), person("F. Hoffmann-La Roche AG", role = c("cph", "fnd")) ) -Description: Provides teal modules for the standard clinical trials - outputs. The teal modules add an encoding panel to interactively - change the encodings within teal. +Description: Provides user-friendly tools for creating and customizing clinical + trial reports. By leveraging the `teal` framework, this package provides teal + modules to easily create an interactive panel that allows for seamless adjustments + to data presentation, thereby streamlining the creation of detailed and accurate reports. License: Apache License 2.0 | file LICENSE URL: https://insightsengineering.github.io/modules.clinical/, https://github.com/insightsengineering/modules.clinical/ diff --git a/vignettes/quickstart_substitute.Rmd b/vignettes/quickstart_substitute.Rmd index 5f709fd633..ca1481b215 100644 --- a/vignettes/quickstart_substitute.Rmd +++ b/vignettes/quickstart_substitute.Rmd @@ -31,8 +31,8 @@ Instead of focusing on the value, it is also possible to work with the **code** which generated the **value**. This is where non standard evaluation, or NSE, starts. The function `substitute` is an important element of non-standard evaluation. -For instance, if we consider `a` defined such as `a <- 5`, -then the expression `a` returns `r a <- 5; a`, the `substitute(a)` returns +For instance, if we consider `a` defined as `a <- 5`, +then the expression `a` returns `r a <- 5; a`, and the `substitute(a)` returns the code to obtain the value: `a`. This is the principle `teal` relies on to: @@ -42,7 +42,7 @@ ii. return the result of the expression in the result panel of the app. iii. return the corresponding code (or expression) with `Show R Code`. The expression returning the displayed value must be reactive. -The information in the encoding in one hand and the filtering panel on the +The information in the encoding on one hand, and the filtering panel on the other hand modify the expression and the displayed value. As such, `teal` needs to work both on expressions and values and relies heavily on NSE. diff --git a/vignettes/teal-modules-clinical.Rmd b/vignettes/teal-modules-clinical.Rmd index 505775bac0..9ee008562c 100644 --- a/vignettes/teal-modules-clinical.Rmd +++ b/vignettes/teal-modules-clinical.Rmd @@ -65,10 +65,17 @@ app <- teal::init( modules = list( tm_g_barchart_simple( label = "ADAE Analysis", - x = teal.transform::data_extract_spec( + x = data_extract_spec( dataname = "ADAE", - select = teal.transform::select_spec( - choices = teal.transform::variable_choices(ADAE), + select = select_spec( + choices = variable_choices( + ADAE, + c( + "ARM", "ACTARM", "SEX", + "RACE", "SAFFL", "STRATA2" + ) + ), + selected = "ACTARM", multiple = FALSE ) ) @@ -78,6 +85,7 @@ app <- teal::init( if (interactive()) shiny::shinyApp(app$ui, app$server) ``` +Consider consulting the documentation and examples of each module (e.g. `?tm_g_barchart_simple`). In many, you can also find useful links to the [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example apps can be found. `teal.modules.clinical` exports modules and needs support from other libraries to run a `teal` app and flesh out its functionality. In the example above, `tm_g_barchart_simple()` is the only function from `teal.modules.clinical` whereas @@ -121,9 +129,19 @@ app <- teal::init( modules = list( tm_g_barchart_simple( label = "ADAE Analysis", - x = teal.transform::data_extract_spec( + x = data_extract_spec( dataname = "ADAE", - select = teal.transform::select_spec(choices = teal.transform::variable_choices(ADAE), multiple = FALSE) + select = select_spec( + choices = variable_choices( + ADAE, + c( + "ARM", "ACTARM", "SEX", + "RACE", "SAFFL", "STRATA2" + ) + ), + selected = "ACTARM", + multiple = FALSE + ) ) ) ) @@ -142,14 +160,14 @@ Some `teal.modules.clinical` modules allow for the specification of arguments us ```r ADSL <- tmc_ex_adsl -app <- teal::init( - data = teal.data::cdisc_data(ADSL = ADSL, code = "ADSL <- tmc_ex_adsl"), +app <- init( + data = cdisc_data(ADSL = ADSL, code = "ADSL <- tmc_ex_adsl"), modules = list( tm_t_summary( label = "Demographic Table", dataname = "ADSL", - arm_var = teal.transform::choices_selected(choices = c("ARM", "ARMCD"), selected = "ARM"), - summarize_vars = teal.transform::choices_selected( + arm_var = choices_selected(choices = c("ARM", "ARMCD"), selected = "ARM"), + summarize_vars = choices_selected( choices = c("SEX", "RACE", "BMRKR2", "EOSDY", "DCSREAS", "AGE"), selected = c("SEX", "RACE") ) From c804c8e979ae57b3e5a08fc9445b5c49cce72440 Mon Sep 17 00:00:00 2001 From: Melkiades Date: Thu, 15 Feb 2024 09:01:21 +0000 Subject: [PATCH 090/126] [skip actions] Bump version to 0.8.16.9088 --- DESCRIPTION | 13 +++++++------ NEWS.md | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 16319a8309..aaabc7d229 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9087 -Date: 2024-02-14 +Version: 0.8.16.9088 +Date: 2024-02-15 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), person("Jana", "Stoilova", , "jana.stoilova@roche.com", role = "aut"), @@ -17,10 +17,11 @@ Authors@R: c( person("Imanol", "Zubizarreta", role = "ctb"), person("F. Hoffmann-La Roche AG", role = c("cph", "fnd")) ) -Description: Provides user-friendly tools for creating and customizing clinical - trial reports. By leveraging the `teal` framework, this package provides teal - modules to easily create an interactive panel that allows for seamless adjustments - to data presentation, thereby streamlining the creation of detailed and accurate reports. +Description: Provides user-friendly tools for creating and customizing + clinical trial reports. By leveraging the `teal` framework, this + package provides teal modules to easily create an interactive panel + that allows for seamless adjustments to data presentation, thereby + streamlining the creation of detailed and accurate reports. License: Apache License 2.0 | file LICENSE URL: https://insightsengineering.github.io/modules.clinical/, https://github.com/insightsengineering/modules.clinical/ diff --git a/NEWS.md b/NEWS.md index 1f98b475be..3f274d1a07 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9087 +# teal.modules.clinical 0.8.16.9088 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 356d5488f332ae075f4ee9e31e780417ac242fdc Mon Sep 17 00:00:00 2001 From: Marcin <133694481+m7pr@users.noreply.github.com> Date: Thu, 15 Feb 2024 15:40:04 +0100 Subject: [PATCH 091/126] 1057 fix `tm_t_pp_laboratory` reshape (#1060) Close #1057 --- R/tm_t_pp_laboratory.R | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/R/tm_t_pp_laboratory.R b/R/tm_t_pp_laboratory.R index 694c516d4f..5417bff3b6 100644 --- a/R/tm_t_pp_laboratory.R +++ b/R/tm_t_pp_laboratory.R @@ -71,7 +71,8 @@ template_laboratory <- function(dataname = "ANL", dplyr::select(-c(aval_var, anrind)) labor_table_raw <- labor_table_base %>% - reshape( + as.data.frame() %>% + stats::reshape( direction = "wide", idvar = c(paramcd_char, param_char, avalu_char), v.names = "aval_anrind", @@ -91,7 +92,8 @@ template_laboratory <- function(dataname = "ANL", labor_table_html <- labor_table_base %>% dplyr::mutate(aval_anrind_col = color_lab_values(aval_anrind)) %>% dplyr::select(-aval_anrind) %>% - reshape( + as.data.frame() %>% + stats::reshape( direction = "wide", idvar = c(paramcd_char, param_char, avalu_char), v.names = "aval_anrind_col", From 846954354fa2c7f5dc0e704359de681ecb11678b Mon Sep 17 00:00:00 2001 From: m7pr Date: Thu, 15 Feb 2024 14:41:01 +0000 Subject: [PATCH 092/126] [skip actions] Bump version to 0.8.16.9089 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index aaabc7d229..06ecdb4e1f 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9088 +Version: 0.8.16.9089 Date: 2024-02-15 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 3f274d1a07..0f0ffa7c8e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9088 +# teal.modules.clinical 0.8.16.9089 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From ffe5a45788b69e043262effb293115e718d060e0 Mon Sep 17 00:00:00 2001 From: Vedha Viyash <49812166+vedhav@users.noreply.github.com> Date: Fri, 16 Feb 2024 15:56:41 +0530 Subject: [PATCH 093/126] Fix assertion on paramcd (#1067) Closes #1066 --- R/tm_t_shift_by_arm.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/tm_t_shift_by_arm.R b/R/tm_t_shift_by_arm.R index df985069cf..f062f2988b 100644 --- a/R/tm_t_shift_by_arm.R +++ b/R/tm_t_shift_by_arm.R @@ -40,7 +40,7 @@ template_shift_by_arm <- function(dataname, checkmate::assert_string(parentname) checkmate::assert_string(arm_var) checkmate::assert_string(visit_var) - checkmate::assert_string(paramcd) + checkmate::assert_string(paramcd, na.ok = TRUE) checkmate::assert_string(aval_var) checkmate::assert_string(baseline_var) checkmate::assert_flag(na.rm) From 083914615f1db1041ba4ed12efba49fb8f29aa77 Mon Sep 17 00:00:00 2001 From: vedhav Date: Fri, 16 Feb 2024 10:27:35 +0000 Subject: [PATCH 094/126] [skip actions] Bump version to 0.8.16.9090 --- DESCRIPTION | 4 ++-- NEWS.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 06ecdb4e1f..22d3eec3a5 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9089 -Date: 2024-02-15 +Version: 0.8.16.9090 +Date: 2024-02-16 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), person("Jana", "Stoilova", , "jana.stoilova@roche.com", role = "aut"), diff --git a/NEWS.md b/NEWS.md index 0f0ffa7c8e..fe7f2d29fa 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9089 +# teal.modules.clinical 0.8.16.9090 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 40dbcafe1f2761223c21c422aa0ac5bb3672c6fa Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Fri, 16 Feb 2024 07:46:44 -0500 Subject: [PATCH 095/126] Clarify `tm_g_pp_patient_timeline` error message (#1059) Fixes #1058 --- R/tm_g_pp_patient_timeline.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/R/tm_g_pp_patient_timeline.R b/R/tm_g_pp_patient_timeline.R index 741e746547..a1206315cc 100644 --- a/R/tm_g_pp_patient_timeline.R +++ b/R/tm_g_pp_patient_timeline.R @@ -574,13 +574,13 @@ ui_g_patient_timeline <- function(id, ...) { ), teal.transform::data_extract_ui( id = ns("cmdecod"), - label = "Select CMDECOD variable:", + label = "Select Medication standardized term variable:", data_extract_spec = ui_args$cmdecod, is_single_dataset = is_single_dataset_value ), teal.transform::data_extract_ui( id = ns("aeterm"), - label = "Select AETERM variable:", + label = "Select AE reported term variable:", data_extract_spec = ui_args$aeterm, is_single_dataset = is_single_dataset_value ), @@ -746,7 +746,7 @@ srv_g_patient_timeline <- function(id, rule_one_parameter <- function(other) { function(value) { if (length(value) == 0L && length(selector_list()[[other]]()$select) == 0L) { - "At least one parameter must be selected." + "At least one term variable must be selected." } } } From 0e486be8adfa51d8af61c2fb649b5ab541002389 Mon Sep 17 00:00:00 2001 From: edelarua Date: Fri, 16 Feb 2024 12:47:37 +0000 Subject: [PATCH 096/126] [skip actions] Bump version to 0.8.16.9091 --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 22d3eec3a5..db8a1b2645 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9090 +Version: 0.8.16.9091 Date: 2024-02-16 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index fe7f2d29fa..6df779d88e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9090 +# teal.modules.clinical 0.8.16.9091 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 367af9a6488a4cd153ce20de959ba547bcef9dbd Mon Sep 17 00:00:00 2001 From: Dony Unardi Date: Fri, 16 Feb 2024 08:47:22 -0800 Subject: [PATCH 097/126] final prerelease activities (#1065) Fixes #1014 --- DESCRIPTION | 6 +++--- man/teal.modules.clinical.Rd | 6 +++--- vignettes/quickstart_substitute.Rmd | 4 ++-- vignettes/teal-modules-clinical.Rmd | 30 ++++++++++++++--------------- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index db8a1b2645..0919af0526 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -23,9 +23,9 @@ Description: Provides user-friendly tools for creating and customizing that allows for seamless adjustments to data presentation, thereby streamlining the creation of detailed and accurate reports. License: Apache License 2.0 | file LICENSE -URL: https://insightsengineering.github.io/modules.clinical/, - https://github.com/insightsengineering/modules.clinical/ -BugReports: https://github.com/insightsengineering/modules.clinical/issues +URL: https://insightsengineering.github.io/teal.modules.clinical/, + https://github.com/insightsengineering/teal.modules.clinical/ +BugReports: https://github.com/insightsengineering/teal.modules.clinical/issues Depends: R (>= 4.0), teal (>= 0.15.0), diff --git a/man/teal.modules.clinical.Rd b/man/teal.modules.clinical.Rd index 227c3167a6..2b363f0120 100644 --- a/man/teal.modules.clinical.Rd +++ b/man/teal.modules.clinical.Rd @@ -12,9 +12,9 @@ The teal modules add an encoding panel to interactively change the encodings wit \seealso{ Useful links: \itemize{ - \item \url{https://insightsengineering.github.io/modules.clinical/} - \item \url{https://github.com/insightsengineering/modules.clinical/} - \item Report bugs at \url{https://github.com/insightsengineering/modules.clinical/issues} + \item \url{https://insightsengineering.github.io/teal.modules.clinical/} + \item \url{https://github.com/insightsengineering/teal.modules.clinical/} + \item Report bugs at \url{https://github.com/insightsengineering/teal.modules.clinical/issues} } } diff --git a/vignettes/quickstart_substitute.Rmd b/vignettes/quickstart_substitute.Rmd index ca1481b215..60e86d35e7 100644 --- a/vignettes/quickstart_substitute.Rmd +++ b/vignettes/quickstart_substitute.Rmd @@ -365,7 +365,7 @@ eval(result) * The same results as before are obtained ... * while, fine tuning is easier. * For instance, the variable designating the study arm and the visit can be - changed, which is an expected feature in teal module encoding panel. + changed, which is an expected feature in `teal` module encoding panel. ```{r} result <- rtables_expr(df = adlb_f, arm = "ARMCD", visit = "AVISITN") @@ -412,7 +412,7 @@ result * In the context of `rtables`, layers enclosing `analyze` call handle `.stats` option. The lean expression should include the `.stats` option, **only when the default value is changed**. -* This is again an expected feature in teal module when rendering the code with +* This is again an expected feature in `teal` module when rendering the code with `Show R Code`: ```{r} diff --git a/vignettes/teal-modules-clinical.Rmd b/vignettes/teal-modules-clinical.Rmd index 9ee008562c..b6571c1505 100644 --- a/vignettes/teal-modules-clinical.Rmd +++ b/vignettes/teal-modules-clinical.Rmd @@ -11,13 +11,13 @@ vignette: > ### Introduction `teal.modules.clinical` is a package implementing a number of `teal` modules helpful for exploring clinical -trials data, specifically targeted towards data following the [ADaM](https://www.cdisc.org/standards/foundational/adam) -standards. `teal.modules.clinical` modules can be used with data other than ADaM standard clinical data, but some +trials data, specifically targeted towards data following the [ADaM](https://www.cdisc.org/standards/foundational/adam) +standards. `teal.modules.clinical` modules can be used with data other than ADaM standard clinical data, but some features of the package are tailored towards data of this type. The concepts presented here require knowledge about the core features of `teal`, specifically on how to launch a `teal` -application and how to pass data into it. Therefore, it is highly recommended to refer to the [home page](https://insightsengineering.github.io/teal/index.html) and -[introductory vignette](https://insightsengineering.github.io/teal/articles/teal.html) of the `teal` package. +application and how to pass data into it. Therefore, it is highly recommended to refer to the [home page](https://insightsengineering.github.io/teal/latest-tag/) and +[introductory vignette](https://insightsengineering.github.io/teal/latest-tag/articles/getting-started-with-teal.html) of the `teal` package. ### Main Features @@ -39,11 +39,11 @@ The library also offers a group of patient profile modules targeted for clinical who want to review data on a per patient basis. The modules present data about patient's adverse events, their severity, the current therapy, their laboratory results and more. -See the full index of package functions & modules [here](https://insightsengineering.github.io/teal.modules.clinical/reference/index.html). +See the full index of package functions & modules [here](https://insightsengineering.github.io/teal.modules.clinical/latest-tag/reference/index.html). ### A Simple Application -A `teal.modules.clinical` module needs to be embedded inside a `shiny`/`teal` application to interact with it. +A `teal.modules.clinical` module needs to be embedded inside a `shiny`/`teal` application to interact with it. A simple application including a bar chart module could look like this: ```r @@ -64,7 +64,7 @@ app <- teal::init( ), modules = list( tm_g_barchart_simple( - label = "ADAE Analysis", + label = "ADAE Analysis", x = data_extract_spec( dataname = "ADAE", select = select_spec( @@ -85,10 +85,10 @@ app <- teal::init( if (interactive()) shiny::shinyApp(app$ui, app$server) ``` -Consider consulting the documentation and examples of each module (e.g. `?tm_g_barchart_simple`). In many, you can also find useful links to the [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example apps can be found. +Consider consulting the documentation and examples of each module (e.g. `?tm_g_barchart_simple`). In many, you can also find useful links to the [TLG Catalog](https://insightsengineering.github.io/tlg-catalog/stable/) where additional example apps can be found. -`teal.modules.clinical` exports modules and needs support from other libraries to run a `teal` app and flesh out its -functionality. In the example above, `tm_g_barchart_simple()` is the only function from `teal.modules.clinical` whereas +`teal.modules.clinical` exports modules and needs support from other libraries to run a `teal` app and flesh out its +functionality. In the example above, `tm_g_barchart_simple()` is the only function from `teal.modules.clinical` whereas `init()` is a `teal` function, `data_extract_spec()`, `select_spec()`, and `variable_choices()` are `teal.transform` functions, and `cdisc_data()` is a `teal.data` function. @@ -99,7 +99,7 @@ library(teal.modules.clinical) library(nestcolor) ``` -The above lines load the libraries used in this example. We will use the example data provided in the +The above lines load the libraries used in this example. We will use the example data provided in the `teal.modules.clinical` package: ```r @@ -107,7 +107,7 @@ ADSL <- tmc_ex_adsl ADAE <- tmc_ex_adae ``` -`nestcolor` is an optional package that can be loaded in to apply the standardized NEST color palette to all module +`nestcolor` is an optional package that can be loaded in to apply the standardized NEST color palette to all module plots. There is no need to load `teal` as `teal.modules.clinical` already depends on it. @@ -128,7 +128,7 @@ app <- teal::init( ), modules = list( tm_g_barchart_simple( - label = "ADAE Analysis", + label = "ADAE Analysis", x = data_extract_spec( dataname = "ADAE", select = select_spec( @@ -154,7 +154,7 @@ Finally, we use `shiny` to launch the application: if (interactive()) shiny::shinyApp(app$ui, app$server) ``` -Some `teal.modules.clinical` modules allow for the specification of arguments using +Some `teal.modules.clinical` modules allow for the specification of arguments using `teal.transform::choices_selected()`, such as the `tm_t_summary()` module in the following example. ```r @@ -178,5 +178,5 @@ app <- init( if (interactive()) shiny::shinyApp(app$ui, app$server) ``` -Please refer to the [API reference](https://insightsengineering.github.io/teal.modules.clinical/reference/index.html) +Please refer to the [API reference](https://insightsengineering.github.io/teal.modules.clinical/latest-tag/reference/) of specific modules for more examples and information on the customization options available. From 1a3392e26717ff69be7f853415b90c07e0372604 Mon Sep 17 00:00:00 2001 From: donyunardi Date: Fri, 16 Feb 2024 16:48:22 +0000 Subject: [PATCH 098/126] [skip actions] Bump version to 0.8.16.9092 --- DESCRIPTION | 5 +++-- NEWS.md | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 0919af0526..8c6aab4987 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9091 +Version: 0.8.16.9092 Date: 2024-02-16 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), @@ -25,7 +25,8 @@ Description: Provides user-friendly tools for creating and customizing License: Apache License 2.0 | file LICENSE URL: https://insightsengineering.github.io/teal.modules.clinical/, https://github.com/insightsengineering/teal.modules.clinical/ -BugReports: https://github.com/insightsengineering/teal.modules.clinical/issues +BugReports: + https://github.com/insightsengineering/teal.modules.clinical/issues Depends: R (>= 4.0), teal (>= 0.15.0), diff --git a/NEWS.md b/NEWS.md index 6df779d88e..3e95519fec 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9091 +# teal.modules.clinical 0.8.16.9092 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 8eb999ce03678529a603c52da18815061a7b398a Mon Sep 17 00:00:00 2001 From: Joe Zhu Date: Mon, 19 Feb 2024 00:41:26 +0800 Subject: [PATCH 099/126] Update DESCRIPTION teal.transform >= 0.5.0 (#1069) # Pull Request Fixes #nnn Signed-off-by: Joe Zhu --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 8c6aab4987..f4dad96d8d 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -30,7 +30,7 @@ BugReports: Depends: R (>= 4.0), teal (>= 0.15.0), - teal.transform (>= 0.4.0.9011), + teal.transform (>= 0.5.0), tern (>= 0.9.3) Imports: broom (>= 0.7.10), From db6fbae506cd010a8317747d63af681581bcbf01 Mon Sep 17 00:00:00 2001 From: shajoezhu Date: Sun, 18 Feb 2024 16:42:20 +0000 Subject: [PATCH 100/126] [skip actions] Bump version to 0.8.16.9093 --- DESCRIPTION | 4 ++-- NEWS.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index f4dad96d8d..7d0d003584 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: teal.modules.clinical Title: Teal Modules for Standard Clinical Outputs -Version: 0.8.16.9092 -Date: 2024-02-16 +Version: 0.8.16.9093 +Date: 2024-02-18 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), person("Jana", "Stoilova", , "jana.stoilova@roche.com", role = "aut"), diff --git a/NEWS.md b/NEWS.md index 3e95519fec..65c44d01d2 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9092 +# teal.modules.clinical 0.8.16.9093 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From 3d87f228466f2280f3f91f2278440cc3bda73135 Mon Sep 17 00:00:00 2001 From: Marcin <133694481+m7pr@users.noreply.github.com> Date: Tue, 20 Feb 2024 23:59:57 +0100 Subject: [PATCH 101/126] 1071 prerelease cleanup@main (#1072) Close #1071 This PR was meant to update README and DESCRIPTION file up to standards we had for other teal packages before the release. Some of the DESCRIPTION changes are CRAN requirements. ### Summary * [x] Review and update README.md * [x] add CRAN badges to README * [x] add Getting Help section to README * [x] change installation guidelines to use CRAN * [x] cleanup usage section * [x] Package `Title` is not duplicated in Package `Description` in DESCRIPTION file * [x] Make sure all `teal.*` mentions are lower-cased and quoted * [x] Make sure each link to our documentation hosted with pkgdown on github pages do not have `/main/` in the address * it should have has `/latest-tag/` instead * so we always expose the documentation of the latest release and not what's currently on main branch but not yet released * [x] All package names in `Title` and `Description` fields of DESCRIPTION file are quoted with `'` _(not backtick)_ --- .Rbuildignore | 1 + .github/CONTRIBUTING.md | 4 ++-- DESCRIPTION | 6 +++--- R/teal.modules.clinical.R | 2 +- R/tm_t_coxreg.R | 2 +- README.md | 29 ++++++++++++++++++++++++----- man/teal.modules.clinical.Rd | 2 +- man/tm_t_coxreg.Rd | 2 +- 8 files changed, 34 insertions(+), 14 deletions(-) diff --git a/.Rbuildignore b/.Rbuildignore index b01e512c78..a85df50034 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -42,5 +42,6 @@ SECURITY.md ^\.gitlab-ci\.yml$ ^\.pre-commit-config\.yaml$ ^LICENSE\.md$ +LICENSE coverage.* ^pkgdown$ diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 751ada72ea..baacb4f69c 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -131,6 +131,6 @@ If you have further questions regarding the contribution guidelines, please cont [docs]: https://insightsengineering.github.io/teal.modules.clinical/index.html -[articles]: https://insightsengineering.github.io/teal.modules.clinical/main/articles/index.html -[license]: https://insightsengineering.github.io/teal.modules.clinical/main/LICENSE-text.html +[articles]: https://insightsengineering.github.io/teal.modules.clinical/latest-tag/articles/index.html +[license]: https://insightsengineering.github.io/teal.modules.clinical/latest-tag/LICENSE-text.html [insights]: https://github.com/insightsengineering/teal.modules.clinical/pulse diff --git a/DESCRIPTION b/DESCRIPTION index 7d0d003584..e17720434c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,5 @@ Package: teal.modules.clinical -Title: Teal Modules for Standard Clinical Outputs +Title: 'teal' Modules for Standard Clinical Outputs Version: 0.8.16.9093 Date: 2024-02-18 Authors@R: c( @@ -18,11 +18,11 @@ Authors@R: c( person("F. Hoffmann-La Roche AG", role = c("cph", "fnd")) ) Description: Provides user-friendly tools for creating and customizing - clinical trial reports. By leveraging the `teal` framework, this + clinical trial reports. By leveraging the 'teal' framework, this package provides teal modules to easily create an interactive panel that allows for seamless adjustments to data presentation, thereby streamlining the creation of detailed and accurate reports. -License: Apache License 2.0 | file LICENSE +License: Apache License 2.0 URL: https://insightsengineering.github.io/teal.modules.clinical/, https://github.com/insightsengineering/teal.modules.clinical/ BugReports: diff --git a/R/teal.modules.clinical.R b/R/teal.modules.clinical.R index 21a240e8ac..d347b1a0bc 100644 --- a/R/teal.modules.clinical.R +++ b/R/teal.modules.clinical.R @@ -1,4 +1,4 @@ -#' Teal Modules for Standard Clinical Outputs +#' `teal` Modules for Standard Clinical Outputs #' #' Provides teal modules for the standard clinical trials outputs. #' The teal modules add an encoding panel to interactively change the encodings within teal. diff --git a/R/tm_t_coxreg.R b/R/tm_t_coxreg.R index bf1184f481..185692939e 100644 --- a/R/tm_t_coxreg.R +++ b/R/tm_t_coxreg.R @@ -455,7 +455,7 @@ template_coxreg_m <- function(dataname, #' datanames(data) <- datanames #' join_keys(data) <- default_cdisc_join_keys[datanames] #' -#' ## Teal application +#' ## `teal` application #' ## ---------------- #' ## Note that the R code exported by `Show R Code` does not include the data #' ## pre-processing. You will need to create the dataset as above before diff --git a/README.md b/README.md index 884d83e525..378f153fad 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,11 @@ # teal.modules.clinical +[![CRAN Version](https://www.r-pkg.org/badges/version/teal.modules.clinical?color=green)](https://cran.r-project.org/package=teal.modules.clinical) +[![Total Downloads](http://cranlogs.r-pkg.org/badges/grand-total/teal.modules.clinical?color=green)](https://cran.r-project.org/package=teal.modules.clinical) +[![Last Month Downloads](http://cranlogs.r-pkg.org/badges/last-month/teal.modules.clinical?color=green)](https://cran.r-project.org/package=teal.modules.clinical) +[![Last Week Downloads](http://cranlogs.r-pkg.org/badges/last-week/teal.modules.clinical?color=green)](https://cran.r-project.org/package=teal.modules.clinical) + [![Check 🛠](https://github.com/insightsengineering/teal.modules.clinical/actions/workflows/check.yaml/badge.svg)](https://insightsengineering.github.io/teal.modules.clinical/main/unit-test-report/) [![Docs 📚](https://github.com/insightsengineering/teal.modules.clinical/actions/workflows/docs.yaml/badge.svg)](https://insightsengineering.github.io/teal.modules.clinical/) ![GitHub forks](https://img.shields.io/github/forks/insightsengineering/teal.modules.clinical?style=social) @@ -51,17 +56,31 @@ Please see the [Teal Gallery](https://insightsengineering.github.io/teal.gallery ## Installation -As of July 2023, all `insightsengineering` packages are available on [r-universe](https://r-universe.dev/). - ```r # stable versions -install.packages('teal.modules.clinical', repos = c('https://insightsengineering.r-universe.dev', 'https://cloud.r-project.org')) +install.packages('teal.modules.clinical') + +# install.packages("pak") +pak::pak("insightsengineering/teal.modules.clinical@*release") +``` + +Alternatively, you might want to use the development version available on [r-universe](https://r-universe.dev/). +```r # beta versions -install.packages('teal.modules.clinical', repos = c('https://pharmaverse.r-universe.dev', 'https://cloud.r-project.org')) +install.packages('teal.modules.clinical', repos = c('https://pharmaverse.r-universe.dev', getOption('repos'))) + +# install.packages("pak") +pak::pak("insightsengineering/teal.modules.clinical") ``` -See package vignettes (`browseVignettes(package = "teal.modules.clinical")`) for usage of this package. +## Usage + +To understand how to use this package, please refer to the [Package Website](https://insightsengineering.github.io/teal.modules.clinical/latest-tag/). + +## Getting help + +If you encounter a bug or have a feature request, please file an issue. For questions, discussions, and staying up to date, please use the `teal` channel in the [`pharmaverse` slack workspace](https://pharmaverse.slack.com). ## Acknowledgment diff --git a/man/teal.modules.clinical.Rd b/man/teal.modules.clinical.Rd index 2b363f0120..2329b15534 100644 --- a/man/teal.modules.clinical.Rd +++ b/man/teal.modules.clinical.Rd @@ -4,7 +4,7 @@ \name{teal.modules.clinical} \alias{teal.modules.clinical-package} \alias{teal.modules.clinical} -\title{Teal Modules for Standard Clinical Outputs} +\title{\code{teal} Modules for Standard Clinical Outputs} \description{ Provides teal modules for the standard clinical trials outputs. The teal modules add an encoding panel to interactively change the encodings within teal. diff --git a/man/tm_t_coxreg.Rd b/man/tm_t_coxreg.Rd index 3c308d444f..2387e68be7 100644 --- a/man/tm_t_coxreg.Rd +++ b/man/tm_t_coxreg.Rd @@ -209,7 +209,7 @@ datanames <- c("ADSL", "ADTTE") datanames(data) <- datanames join_keys(data) <- default_cdisc_join_keys[datanames] -## Teal application +## `teal` application ## ---------------- ## Note that the R code exported by `Show R Code` does not include the data ## pre-processing. You will need to create the dataset as above before From bf0bbdbb4b3337689bedef27a56007e6244dd8bd Mon Sep 17 00:00:00 2001 From: shajoezhu Date: Tue, 20 Feb 2024 23:00:53 +0000 Subject: [PATCH 102/126] [skip actions] Bump version to 0.8.16.9094 --- DESCRIPTION | 4 ++-- NEWS.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index e17720434c..d90d6e794a 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: teal.modules.clinical Title: 'teal' Modules for Standard Clinical Outputs -Version: 0.8.16.9093 -Date: 2024-02-18 +Version: 0.8.16.9094 +Date: 2024-02-20 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), person("Jana", "Stoilova", , "jana.stoilova@roche.com", role = "aut"), diff --git a/NEWS.md b/NEWS.md index 65c44d01d2..d65683d875 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9093 +# teal.modules.clinical 0.8.16.9094 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From a351243f1d937826c94a19ed4e124eee603fa08b Mon Sep 17 00:00:00 2001 From: Emily de la Rua <59304861+edelarua@users.noreply.github.com> Date: Tue, 20 Feb 2024 22:02:46 -0500 Subject: [PATCH 103/126] Add missing return values (#1075) # Pull Request Fixes #1074 Also added examples where missing to the listed functions. Do we want to merge this into main or the CRAN release branch? --- R/utils.R | 69 ++++++++++++++++++++++++++++++++------- man/bracket_expr.Rd | 4 +++ man/call_concatenate.Rd | 3 ++ man/clean_description.Rd | 8 +++++ man/color_lab_values.Rd | 8 +++++ man/extract_input.Rd | 11 +++++-- man/pipe_expr.Rd | 3 ++ man/prepare_arm.Rd | 3 ++ man/prepare_arm_levels.Rd | 3 ++ man/split_choices.Rd | 7 ++++ man/split_col_expr.Rd | 12 +++++++ man/split_interactions.Rd | 9 +++++ 12 files changed, 127 insertions(+), 13 deletions(-) diff --git a/R/utils.R b/R/utils.R index 5fb6096462..69f17cea0e 100644 --- a/R/utils.R +++ b/R/utils.R @@ -5,7 +5,7 @@ #' @param args arguments to concatenate with operator #' @param bin_op binary operator to concatenate it with #' -#' @export +#' @return a `call` #' #' @examples #' library(ggplot2) @@ -30,6 +30,7 @@ #' ) #' ) #' +#' @export call_concatenate <- function(args, bin_op = "+") { checkmate::assert_string(bin_op) checkmate::assert_list(args, types = c("symbol", "name", "call", "expression")) @@ -57,7 +58,7 @@ count_str_to_column_expr <- function(column, n_column = get_n_name(groupby_vars #' @param dataname (`character`)\cr name of the dataset #' @param vars (`character`)\cr Column names in the data #' -#' @return `character` variable labels. +#' @return `character` variable labels. #' #' @export get_var_labels <- function(datasets, dataname, vars) { @@ -108,7 +109,7 @@ h_concat_expr <- function(expr) { #' pipeline (`%>%`). #' @param pipe_str (`character`)\cr the character which separates the expressions. #' -#' @export +#' @return a `call` #' #' @examples #' pipe_expr( @@ -118,6 +119,7 @@ h_concat_expr <- function(expr) { #' ) #' ) #' +#' @export pipe_expr <- function(exprs, pipe_str = "%>%") { exprs <- lapply(exprs, h_concat_expr) exprs <- unlist(exprs) @@ -186,7 +188,7 @@ add_expr <- function(expr_ls, new_expr) { #' @param exprs (`list` of `call`)\cr expressions to concatenate into #' a single _bracketed_ expression. #' -#' @export +#' @return a `{` object. See [base::Paren()] for details. #' #' @examples #' adsl <- tmc_ex_adsl @@ -207,6 +209,8 @@ add_expr <- function(expr_ls, new_expr) { #' res <- bracket_expr(list(expr1, expr2, expr3)) #' eval(res) #' table(anl$rsp_lab, anl$is_rsp) +#' +#' @export bracket_expr <- function(exprs) { expr <- lapply(exprs, deparse) @@ -380,6 +384,16 @@ is.cs_or_des <- function(x) { # nolint #' @param ref (`character`)\cr the reference level (not used for `combine = TRUE`). #' @param arm_var (`character`)\cr the arm or grouping variable name. #' +#' @return a `call` +#' +#' @examples +#' split_col_expr( +#' compare = TRUE, +#' combine = FALSE, +#' ref = "ARM A", +#' arm_var = "ARMCD" +#' ) +#' #' @export split_col_expr <- function(compare, combine, ref, arm_var) { if (compare && combine) { @@ -418,8 +432,14 @@ split_col_expr <- function(compare, combine, ref, arm_var) { #' @param x (`choices_selected`)\cr #' object with interaction terms #' -#' @export #' @note uses the regex `\\*|:` to perform the split. +#' +#' @return a [choices_selected()] object. +#' +#' @examples +#' split_choices(choices_selected(choices = c("x:y", "a*b"), selected = all_choices())) +#' +#' @export split_choices <- function(x) { checkmate::assert_class(x, "choices_selected") checkmate::assert_character(x$choices, min.len = 1) @@ -434,8 +454,10 @@ split_choices <- function(x) { } #' Extracts html id for `data_extract_ui` -#' @description The `data_extract_ui` is located under extended html id. -#' We could not use `ns("original id")` for reference, as it is extended with specific suffixes. +#' +#' The `data_extract_ui` is located under extended html id. We could not use `ns("original id")` +#' for reference, as it is extended with specific suffixes. +#' #' @param varname (`character`)\cr #' the original html id. This should be retrieved with `ns("original id")` in the UI function #' or `session$ns("original id")`/"original id" in the server function. @@ -445,6 +467,11 @@ split_choices <- function(x) { #' @param filter optional, (`logical`)\cr #' if the connected `extract_data_spec` has objects passed to its `filter` argument #' +#' @return a string +#' +#' @examples +#' extract_input("ARM", "ADSL") +#' #' @export extract_input <- function(varname, dataname, filter = FALSE) { if (filter) { @@ -463,6 +490,13 @@ extract_input <- function(varname, dataname, filter = FALSE) { #' regex with which to split the interaction #' term by. #' +#' @return a vector of strings where each element is a component +#' variable extracted from interaction term `x`. +#' +#' @examples +#' split_interactions("x:y") +#' split_interactions("x*y") +#' #' @export split_interactions <- function(x, by = "\\*|:") { if (length(x) >= 1) { @@ -501,7 +535,7 @@ split_interactions <- function(x, by = "\\*|:") { #' @param ref_arm_val (`character`)\cr replacement name for the reference level. #' @param drop (`logical`)\cr drop the unused variable levels. #' -#' @export +#' @return a `call` #' #' @examples #' prepare_arm( @@ -518,6 +552,7 @@ split_interactions <- function(x, by = "\\*|:") { #' comp_arm = "ARM A" #' ) #' +#' @export prepare_arm <- function(dataname, arm_var, ref_arm, @@ -602,7 +637,8 @@ prepare_arm <- function(dataname, #' #' @inheritParams template_arguments #' -#' @export +#' @return a `{` object. See [base::Paren()] for details. +#' #' @examples #' prepare_arm_levels( #' dataname = "adae", @@ -618,6 +654,7 @@ prepare_arm <- function(dataname, #' drop_arm_levels = FALSE #' ) #' +#' @export prepare_arm_levels <- function(dataname, parentname, arm_var, @@ -733,8 +770,13 @@ prepare_arm_levels <- function(dataname, #' @param default_color (`character`)\cr default color. #' @param icons (`list`)\cr certain icons per level. #' -#' @export +#' @return a character vector where each element is a formatted HTML tag corresponding to +#' a value in `x`. #' +#' @examples +#' color_lab_values(c("LOW", "LOW", "HIGH", "NORMAL", "HIGH")) +#' +#' @export color_lab_values <- function(x, classes = c("HIGH", "NORMAL", "LOW"), colors = list(HIGH = "red", NORMAL = "grey", LOW = "blue"), @@ -771,8 +813,13 @@ color_lab_values <- function(x, #' #' @param x (`character`)\cr vector with categories descriptions. #' -#' @export +#' @return a string +#' +#' @examples +#' clean_description("Level A (other text)") +#' clean_description("A long string that should be shortened") #' +#' @export clean_description <- function(x) { x <- gsub("\\(.*?\\)", "", x) x <- trimws(x) diff --git a/man/bracket_expr.Rd b/man/bracket_expr.Rd index 6d242c273c..6578554a9e 100644 --- a/man/bracket_expr.Rd +++ b/man/bracket_expr.Rd @@ -10,6 +10,9 @@ bracket_expr(exprs) \item{exprs}{(\code{list} of \code{call})\cr expressions to concatenate into a single \emph{bracketed} expression.} } +\value{ +a \verb{\{} object. See \code{\link[base:Paren]{base::Paren()}} for details. +} \description{ Groups several expressions in a single \emph{bracketed} expression. } @@ -32,4 +35,5 @@ expr3 <- substitute( res <- bracket_expr(list(expr1, expr2, expr3)) eval(res) table(anl$rsp_lab, anl$is_rsp) + } diff --git a/man/call_concatenate.Rd b/man/call_concatenate.Rd index d085a6bf0e..b4f0e72c3f 100644 --- a/man/call_concatenate.Rd +++ b/man/call_concatenate.Rd @@ -11,6 +11,9 @@ call_concatenate(args, bin_op = "+") \item{bin_op}{binary operator to concatenate it with} } +\value{ +a \code{call} +} \description{ e.g. combine with \code{+} for \code{ggplot} without introducing parentheses due to associativity } diff --git a/man/clean_description.Rd b/man/clean_description.Rd index 665eeefe30..bf01b74e6f 100644 --- a/man/clean_description.Rd +++ b/man/clean_description.Rd @@ -9,6 +9,14 @@ clean_description(x) \arguments{ \item{x}{(\code{character})\cr vector with categories descriptions.} } +\value{ +a string +} \description{ Cleaning categorical variable descriptions before presenting. } +\examples{ +clean_description("Level A (other text)") +clean_description("A long string that should be shortened") + +} diff --git a/man/color_lab_values.Rd b/man/color_lab_values.Rd index e868d99639..af7dc3c175 100644 --- a/man/color_lab_values.Rd +++ b/man/color_lab_values.Rd @@ -24,6 +24,14 @@ color_lab_values( \item{icons}{(\code{list})\cr certain icons per level.} } +\value{ +a character vector where each element is a formatted HTML tag corresponding to +a value in \code{x}. +} \description{ Map value and level characters to values with with proper html tags, colors and icons. } +\examples{ +color_lab_values(c("LOW", "LOW", "HIGH", "NORMAL", "HIGH")) + +} diff --git a/man/extract_input.Rd b/man/extract_input.Rd index 6830defcb6..f2a2a8fad9 100644 --- a/man/extract_input.Rd +++ b/man/extract_input.Rd @@ -18,7 +18,14 @@ This might be retrieved like \code{data_extract_spec(...)[[1]]$dataname}.} \item{filter}{optional, (\code{logical})\cr if the connected \code{extract_data_spec} has objects passed to its \code{filter} argument} } +\value{ +a string +} \description{ -The \code{data_extract_ui} is located under extended html id. -We could not use \code{ns("original id")} for reference, as it is extended with specific suffixes. +The \code{data_extract_ui} is located under extended html id. We could not use \code{ns("original id")} +for reference, as it is extended with specific suffixes. +} +\examples{ +extract_input("ARM", "ADSL") + } diff --git a/man/pipe_expr.Rd b/man/pipe_expr.Rd index 13ad7d36b5..a6fa1bba84 100644 --- a/man/pipe_expr.Rd +++ b/man/pipe_expr.Rd @@ -12,6 +12,9 @@ pipeline (\verb{\%>\%}).} \item{pipe_str}{(\code{character})\cr the character which separates the expressions.} } +\value{ +a \code{call} +} \description{ Concatenate expressions in a single pipeline-flavor expression. } diff --git a/man/prepare_arm.Rd b/man/prepare_arm.Rd index 373fed6611..14e86cedfa 100644 --- a/man/prepare_arm.Rd +++ b/man/prepare_arm.Rd @@ -29,6 +29,9 @@ prepare_arm( \item{drop}{(\code{logical})\cr drop the unused variable levels.} } +\value{ +a \code{call} +} \description{ The function generate the standard expression for pre-processing of dataset in teal module applications. This is especially of interest when the same diff --git a/man/prepare_arm_levels.Rd b/man/prepare_arm_levels.Rd index e05df620c6..2e2e08bade 100644 --- a/man/prepare_arm_levels.Rd +++ b/man/prepare_arm_levels.Rd @@ -18,6 +18,9 @@ set to those used in the \code{dataname} dataset. If \code{FALSE}, \code{arm_var \code{parentname} dataset. If \code{dataname} and \code{parentname} are the same, then \code{drop_arm_levels} is set to \code{TRUE} and user input for this parameter is ignored.} } +\value{ +a \verb{\{} object. See \code{\link[base:Paren]{base::Paren()}} for details. +} \description{ This function generates the standard expression for pre-processing of dataset arm levels in and is used to apply the same steps in safety teal modules. diff --git a/man/split_choices.Rd b/man/split_choices.Rd index a32bc01e0e..bea53ac31e 100644 --- a/man/split_choices.Rd +++ b/man/split_choices.Rd @@ -11,6 +11,9 @@ split_choices(x) \item{x}{(\code{choices_selected})\cr object with interaction terms} } +\value{ +a \code{\link[=choices_selected]{choices_selected()}} object. +} \description{ Split \code{choices_selected} objects with interactions into their component variables @@ -18,3 +21,7 @@ their component variables \note{ uses the regex \verb{\\\\*|:} to perform the split. } +\examples{ +split_choices(choices_selected(choices = c("x:y", "a*b"), selected = all_choices())) + +} diff --git a/man/split_col_expr.Rd b/man/split_col_expr.Rd index 14206a3a47..d714bc3660 100644 --- a/man/split_col_expr.Rd +++ b/man/split_col_expr.Rd @@ -15,6 +15,9 @@ split_col_expr(compare, combine, ref, arm_var) \item{arm_var}{(\code{character})\cr the arm or grouping variable name.} } +\value{ +a \code{call} +} \description{ Renders the expression for column split in \code{rtables} depending on: \itemize{ @@ -22,3 +25,12 @@ Renders the expression for column split in \code{rtables} depending on: \item the expected or not arm combination } } +\examples{ +split_col_expr( + compare = TRUE, + combine = FALSE, + ref = "ARM A", + arm_var = "ARMCD" +) + +} diff --git a/man/split_interactions.Rd b/man/split_interactions.Rd index 8173e75830..5ca75e5dc7 100644 --- a/man/split_interactions.Rd +++ b/man/split_interactions.Rd @@ -15,6 +15,15 @@ usually in the form \code{x:y} or \code{x*y}.} regex with which to split the interaction term by.} } +\value{ +a vector of strings where each element is a component +variable extracted from interaction term \code{x}. +} \description{ Split interaction terms into their component variables } +\examples{ +split_interactions("x:y") +split_interactions("x*y") + +} From 3e178512646a37bf62a26e5d74ea28587c6b4944 Mon Sep 17 00:00:00 2001 From: shajoezhu Date: Wed, 21 Feb 2024 03:03:46 +0000 Subject: [PATCH 104/126] [skip actions] Bump version to 0.8.16.9095 --- DESCRIPTION | 4 ++-- NEWS.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index d90d6e794a..09a74523a8 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: teal.modules.clinical Title: 'teal' Modules for Standard Clinical Outputs -Version: 0.8.16.9094 -Date: 2024-02-20 +Version: 0.8.16.9095 +Date: 2024-02-21 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), person("Jana", "Stoilova", , "jana.stoilova@roche.com", role = "aut"), diff --git a/NEWS.md b/NEWS.md index d65683d875..6858917b1b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9094 +# teal.modules.clinical 0.8.16.9095 ### Breaking Changes + Adapted all modules to use `teal_data` objects. From f9dc7d5d30a24fd2b451e8bde5c697fb699face0 Mon Sep 17 00:00:00 2001 From: Vedha Viyash <49812166+vedhav@users.noreply.github.com> Date: Fri, 23 Feb 2024 03:50:23 +0530 Subject: [PATCH 105/126] [Docs] Update module arg docs to only accept `choices_selected` (#1078) Closes #1076 #### Changes 1. Updates the documentation in module arguments to accept only `choices_selected` and not `data_extract_spec` 2. Assert this change in the module functions. After this change, all the example apps were run successfully. Here is a [sheet](https://docs.google.com/spreadsheets/d/e/2PACX-1vQazicp4UB_Tut7wd2jAKkSDjfvOb40j27m2EZHsCa8qZGxq8LxrpArBsGtOI74mXu-Vs86cRo7xp-L/pubhtml) that was used to track the changes. P.S I am unsure where I should target this change, and I can change the target branch if needed. --- NEWS.md | 3 +- R/argument_convention.R | 52 +++++++++++++------------- R/tm_a_gee.R | 6 +++ R/tm_a_mmrm.R | 8 +++- R/tm_g_forest_rsp.R | 5 +++ R/tm_g_forest_tte.R | 7 ++++ R/tm_g_ipp.R | 9 ++++- R/tm_g_km.R | 9 ++++- R/tm_g_lineplot.R | 1 + R/tm_g_pp_adverse_events.R | 21 +++++++---- R/tm_g_pp_patient_timeline.R | 28 +++++++++----- R/tm_g_pp_therapy.R | 22 ++++++++--- R/tm_g_pp_vitals.R | 5 ++- R/tm_t_abnormality.R | 6 +-- R/tm_t_abnormality_by_worst_grade.R | 8 ++-- R/tm_t_ancova.R | 5 +++ R/tm_t_binary_outcome.R | 4 ++ R/tm_t_coxreg.R | 6 +++ R/tm_t_events.R | 3 ++ R/tm_t_events_by_grade.R | 3 ++ R/tm_t_events_patyear.R | 2 +- R/tm_t_events_summary.R | 17 ++++++--- R/tm_t_exposure.R | 8 ++-- R/tm_t_logistic.R | 14 +++---- R/tm_t_mult_events.R | 6 ++- R/tm_t_pp_basic_info.R | 3 +- R/tm_t_pp_laboratory.R | 12 ++++-- R/tm_t_pp_medical_history.R | 9 +++-- R/tm_t_pp_prior_medication.R | 4 ++ R/tm_t_shift_by_arm.R | 7 +++- R/tm_t_shift_by_arm_by_worst.R | 7 +++- R/tm_t_shift_by_grade.R | 5 ++- R/tm_t_smq.R | 6 ++- R/tm_t_summary.R | 2 + R/tm_t_summary_by.R | 4 ++ R/tm_t_tte.R | 8 +++- R/utils.R | 2 +- man/is.cs_or_des.Rd | 4 +- man/module_arguments.Rd | 52 +++++++++++++------------- man/tm_a_gee.Rd | 14 +++---- man/tm_a_mmrm.Rd | 16 ++++---- man/tm_g_ci.Rd | 2 +- man/tm_g_forest_rsp.Rd | 12 +++--- man/tm_g_forest_tte.Rd | 16 ++++---- man/tm_g_ipp.Rd | 14 +++---- man/tm_g_km.Rd | 16 ++++---- man/tm_g_lineplot.Rd | 4 +- man/tm_g_pp_adverse_events.Rd | 14 +++---- man/tm_g_pp_patient_timeline.Rd | 20 +++++----- man/tm_g_pp_therapy.Rd | 20 +++++----- man/tm_g_pp_vitals.Rd | 6 +-- man/tm_t_abnormality.Rd | 14 +++---- man/tm_t_abnormality_by_worst_grade.Rd | 14 +++---- man/tm_t_ancova.Rd | 12 +++--- man/tm_t_binary_outcome.Rd | 10 ++--- man/tm_t_coxreg.Rd | 14 +++---- man/tm_t_events.Rd | 6 +-- man/tm_t_events_by_grade.Rd | 6 +-- man/tm_t_events_patyear.Rd | 12 +++--- man/tm_t_events_summary.Rd | 14 +++---- man/tm_t_exposure.Rd | 14 +++---- man/tm_t_logistic.Rd | 10 ++--- man/tm_t_mult_events.Rd | 8 ++-- man/tm_t_pp_basic_info.Rd | 2 +- man/tm_t_pp_laboratory.Rd | 12 +++--- man/tm_t_pp_medical_history.Rd | 6 +-- man/tm_t_pp_prior_medication.Rd | 8 ++-- man/tm_t_shift_by_arm.Rd | 14 +++---- man/tm_t_shift_by_arm_by_worst.Rd | 14 +++---- man/tm_t_shift_by_grade.Rd | 16 ++++---- man/tm_t_smq.Rd | 10 ++--- man/tm_t_summary.Rd | 4 +- man/tm_t_summary_by.Rd | 10 ++--- man/tm_t_tte.Rd | 12 +++--- 74 files changed, 460 insertions(+), 319 deletions(-) diff --git a/NEWS.md b/NEWS.md index 6858917b1b..742657adaa 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,7 +1,8 @@ # teal.modules.clinical 0.8.16.9095 ### Breaking Changes -+ Adapted all modules to use `teal_data` objects. +* Adapted all modules to use `teal_data` objects. +* Module arguments that previously accepted inputs from `teal.transform::choices_selected()` or `teal.transform::data_extract_spec()` now only accept input from `teal.transform::choices_selected()`. The affected modules are: `tm_a_gee`, `tm_a_mmrm`, `tm_g_ci`, `tm_g_forest_rsp`, `tm_g_forest_tte`, `tm_g_ipp`, `tm_g_km`, `tm_g_lineplot`, `tm_g_pp_adverse_events`, `tm_g_pp_patient_timeline`, `tm_g_pp_therapy`, `tm_g_pp_vitals`, `tm_t_abnormality`, `tm_t_abnormality_by_worst_grade`, `tm_t_ancova`, `tm_t_binary_outcome`, `tm_t_coxreg`, `tm_t_events`, `tm_t_events_by_grade`, `tm_t_events_patyear`, `tm_t_events_summary`, `tm_t_exposure`, `tm_t_logistic`, `tm_t_mult_events`, `tm_t_pp_basic_info`, `tm_t_pp_laboratory`, `tm_t_pp_medical_history`, `tm_t_pp_prior_medication`, `tm_t_shift_by_arm`, `tm_t_shift_by_arm_by_worst`, `tm_t_shift_by_grade`, `tm_t_smq`, `tm_t_summary`, `tm_t_summary_by`, and `tm_t_tte` ### Enhancements * Updated the documentation and vignettes to demonstrate method to pass `teal_data` object to `teal::init()`. diff --git a/R/argument_convention.R b/R/argument_convention.R index 3efafb886f..4c4b34f7b6 100644 --- a/R/argument_convention.R +++ b/R/argument_convention.R @@ -120,34 +120,34 @@ NULL #' with delayed [teal.transform::variable_choices()] or delayed [teal.transform::value_choices()] #' with the elements named `ref` and `comp` that the defined the default #' reference and comparison arms when the arm variable is changed. -#' @param arm_var ([`teal.transform::choices_selected()`] or [`teal.transform::data_extract_spec()`])\cr object with all +#' @param arm_var ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for variable names that can be used as `arm_var`. #' It defines the grouping variable(s) in the results table. #' If there are two elements selected for `arm_var`, #' second variable will be nested under the first variable. -#' @param atirel ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param atirel ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `ATIREL` variable from `dataname`. -#' @param aval_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' @param aval_var ([teal.transform::choices_selected()])\cr object with #' all available choices and pre-selected option for the analysis variable. -#' @param avalu_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' @param avalu_var ([teal.transform::choices_selected()])\cr object with #' all available choices and preselected option for the analysis unit variable. -#' @param avisit ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr value of analysis +#' @param avisit ([teal.transform::choices_selected()])\cr value of analysis #' visit `AVISIT` of interest. -#' @param baseline_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' @param baseline_var ([teal.transform::choices_selected()])\cr object with #' all available choices and preselected option for variable values that can be used as `baseline_var`. -#' @param by_vars ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param by_vars ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for variable names used to split the summary by rows. -#' @param cmdecod ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param cmdecod ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `CMDECOD` variable from `dataname`. -#' @param cmindc ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param cmindc ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `CMINDC` variable from `dataname`. -#' @param cmstdy ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param cmstdy ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `CMSTDY` variable from `dataname`. -#' @param cnsr_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param cnsr_var ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the censoring variable. -#' @param conf_level ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' @param conf_level ([teal.transform::choices_selected()])\cr object with #' all available choices and pre-selected option for the confidence level, each within range of (0, 1). -#' @param cov_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param cov_var ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the covariates variables. #' @param dataname (`character`)\cr analysis data used in teal module. #' @param default_responses (`list` or `character`)\cr defines @@ -159,9 +159,9 @@ NULL #' @param fixed_symbol_size (`logical`)\cr When (`TRUE`), the same symbol size is used for plotting each estimate. #' Otherwise, the symbol size will be proportional to the sample size in each each subgroup. #' @param font_size (`numeric`)\cr numeric vector of length 3 of current, minimum and maximum font size values. -#' @param hlt ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr name of the variable +#' @param hlt ([teal.transform::choices_selected()])\cr name of the variable #' with high level term for events. -#' @param id_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object specifying +#' @param id_var ([teal.transform::choices_selected()])\cr object specifying #' the variable name for subject id. #' @param interact_var (`character`)\cr name of the variable that should have interactions #' with arm. If the interaction is not needed, the default option is `NULL`. @@ -169,9 +169,9 @@ NULL #' to select the specific `ANCOVA` results when interact_var is discrete. If the interaction is not #' needed, the default option is `FALSE`. #' @param label (`character`)\cr menu item label of the module in the teal app. -#' @param llt ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr name of the variable +#' @param llt ([teal.transform::choices_selected()])\cr name of the variable #' with low level term for events. -#' @param paramcd ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param paramcd ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the parameter code variable from `dataname`. #' @param parentname (`character`)\cr parent analysis data used in teal module, usually this refers to `ADSL`. #' @param patient_col (`character`)\cr name of patient ID variable. @@ -183,27 +183,27 @@ NULL #' For example the [shiny::helpText()] elements are useful. #' @param pre_output optional, (`shiny.tag`)\cr with text placed before the output to put the output into context. #' For example a title. -#' @param strata_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr names of +#' @param strata_var ([teal.transform::choices_selected()])\cr names of #' the variables for stratified analysis. -#' @param summarize_vars ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr names of +#' @param summarize_vars ([teal.transform::choices_selected()])\cr names of #' the variables that should be summarized. -#' @param subgroup_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' @param subgroup_var ([teal.transform::choices_selected()])\cr object with #' all available choices and preselected option for variable names that can be used as the default subgroups. #' @param time_points ([teal.transform::choices_selected()])\cr object with all available choices and preselected option #' for time points that can be used in [tern::surv_timepoint()]. -#' @param time_unit_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object +#' @param time_unit_var ([teal.transform::choices_selected()])\cr object #' with all available choices and pre-selected option for the time unit variable. -#' @param treatment_flag ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr value +#' @param treatment_flag ([teal.transform::choices_selected()])\cr value #' indicating on treatment records in `treatment_flag_var`. -#' @param treatment_flag_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr on +#' @param treatment_flag_var ([teal.transform::choices_selected()])\cr on #' treatment flag variable. #' @param useNA (`character`)\cr whether missing data (`NA`) should be displayed as a level. -#' @param visit_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' @param visit_var ([teal.transform::choices_selected()])\cr object with #' all available choices and preselected option for variable names that can be used as `visit` variable. #' Must be a factor in `dataname`. -#' @param worst_flag_indicator ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr +#' @param worst_flag_indicator ([teal.transform::choices_selected()])\cr #' value indicating worst grade. -#' @param worst_flag_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object +#' @param worst_flag_var ([teal.transform::choices_selected()])\cr object #' with all available choices and preselected option for variable names that can be used as worst flag variable. #' #' @return a `teal_module` object. diff --git a/R/tm_a_gee.R b/R/tm_a_gee.R index 9651a65ec3..11538e9cd4 100644 --- a/R/tm_a_gee.R +++ b/R/tm_a_gee.R @@ -205,6 +205,12 @@ tm_a_gee <- function(label, checkmate::assert_string(label) checkmate::assert_string(dataname) checkmate::assert_string(parentname) + checkmate::assert_class(aval_var, "choices_selected") + checkmate::assert_class(id_var, "choices_selected") + checkmate::assert_class(arm_var, "choices_selected") + checkmate::assert_class(visit_var, "choices_selected") + checkmate::assert_class(cov_var, "choices_selected") + checkmate::assert_class(paramcd, "choices_selected") checkmate::assert_class(conf_level, "choices_selected") checkmate::assert_class(pre_output, classes = "shiny.tag", null.ok = TRUE) checkmate::assert_class(post_output, classes = "shiny.tag", null.ok = TRUE) diff --git a/R/tm_a_mmrm.R b/R/tm_a_mmrm.R index ee8c43c9ca..22c5ab604d 100644 --- a/R/tm_a_mmrm.R +++ b/R/tm_a_mmrm.R @@ -445,7 +445,7 @@ template_mmrm_plots <- function(fit_name, #' @inheritParams module_arguments #' @inheritParams template_mmrm_tables #' @inheritParams template_mmrm_plots -#' @param method ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' @param method ([teal.transform::choices_selected()])\cr object with #' all available choices and pre-selected option for the adjustment method. #' @param ggplot2_args (`ggplot2_args`) \cr optional, object created by [`teal.widgets::ggplot2_args()`] #' with settings for all the plots or named list of `ggplot2_args` objects for plot-specific settings. @@ -544,6 +544,12 @@ tm_a_mmrm <- function(label, checkmate::assert_string(label) checkmate::assert_string(total_label) checkmate::assert_string(dataname) + checkmate::assert_class(aval_var, "choices_selected") + checkmate::assert_class(id_var, "choices_selected") + checkmate::assert_class(arm_var, "choices_selected") + checkmate::assert_class(visit_var, "choices_selected") + checkmate::assert_class(cov_var, "choices_selected") + checkmate::assert_class(paramcd, "choices_selected") checkmate::assert_class(method, "choices_selected") checkmate::assert_class(conf_level, "choices_selected") checkmate::assert_numeric(plot_height, len = 3, any.missing = FALSE, finite = TRUE) diff --git a/R/tm_g_forest_rsp.R b/R/tm_g_forest_rsp.R index 0df97cf596..6a9a54584d 100644 --- a/R/tm_g_forest_rsp.R +++ b/R/tm_g_forest_rsp.R @@ -311,6 +311,11 @@ tm_g_forest_rsp <- function(label, checkmate::assert_string(dataname) checkmate::assert_string(parentname) checkmate::assert_flag(fixed_symbol_size) + checkmate::assert_class(arm_var, "choices_selected") + checkmate::assert_class(paramcd, "choices_selected") + checkmate::assert_class(aval_var, "choices_selected") + checkmate::assert_class(subgroup_var, "choices_selected") + checkmate::assert_class(strata_var, "choices_selected") checkmate::assert_class(conf_level, "choices_selected") checkmate::assert_multi_class(default_responses, c("list", "character", "numeric"), null.ok = TRUE) checkmate::assert_numeric(plot_height, len = 3, any.missing = FALSE, finite = TRUE) diff --git a/R/tm_g_forest_tte.R b/R/tm_g_forest_tte.R index 475e036323..e094d14356 100644 --- a/R/tm_g_forest_tte.R +++ b/R/tm_g_forest_tte.R @@ -300,7 +300,14 @@ tm_g_forest_tte <- function(label, checkmate::assert_string(label) checkmate::assert_string(dataname) checkmate::assert_string(parentname) + checkmate::assert_class(arm_var, "choices_selected") + checkmate::assert_class(subgroup_var, "choices_selected") + checkmate::assert_class(paramcd, "choices_selected") + checkmate::assert_class(strata_var, "choices_selected") + checkmate::assert_class(aval_var, "choices_selected") + checkmate::assert_class(cnsr_var, "choices_selected") checkmate::assert_class(conf_level, "choices_selected") + checkmate::assert_class(time_unit_var, "choices_selected") checkmate::assert_flag(fixed_symbol_size) 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") diff --git a/R/tm_g_ipp.R b/R/tm_g_ipp.R index cc5b8f6376..3818321a04 100644 --- a/R/tm_g_ipp.R +++ b/R/tm_g_ipp.R @@ -174,7 +174,7 @@ template_g_ipp <- function(dataname = "ANL", #' #' @inheritParams module_arguments #' @inheritParams template_g_ipp -#' @param arm_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' @param arm_var ([teal.transform::choices_selected()])\cr object with #' all available choices and preselected option for variable values that can be used as arm variable. #' #' @inherit module_arguments return seealso @@ -302,6 +302,13 @@ tm_g_ipp <- function(label, } logger::log_info("Initializing tm_g_ipp") + checkmate::assert_class(arm_var, "choices_selected") + checkmate::assert_class(paramcd, "choices_selected") + checkmate::assert_class(id_var, "choices_selected") + checkmate::assert_class(visit_var, "choices_selected") + checkmate::assert_class(aval_var, "choices_selected") + checkmate::assert_class(avalu_var, "choices_selected") + checkmate::assert_class(baseline_var, "choices_selected") checkmate::assert_string(label) checkmate::assert_string(dataname) checkmate::assert_string(parentname) diff --git a/R/tm_g_km.R b/R/tm_g_km.R index 02adc71d38..de83be9165 100644 --- a/R/tm_g_km.R +++ b/R/tm_g_km.R @@ -237,7 +237,7 @@ template_g_km <- function(dataname = "ANL", #' #' @inheritParams module_arguments #' @inheritParams template_g_km -#' @param facet_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' @param facet_var ([teal.transform::choices_selected()])\cr object with #' all available choices and preselected option for names of variable that can be used for plot faceting. #' #' @inherit module_arguments return seealso @@ -331,6 +331,13 @@ tm_g_km <- function(label, checkmate::assert_string(label) checkmate::assert_string(dataname) checkmate::assert_string(parentname) + checkmate::assert_class(arm_var, "choices_selected") + checkmate::assert_class(paramcd, "choices_selected") + checkmate::assert_class(strata_var, "choices_selected") + checkmate::assert_class(facet_var, "choices_selected") + checkmate::assert_class(time_unit_var, "choices_selected") + checkmate::assert_class(aval_var, "choices_selected") + checkmate::assert_class(cnsr_var, "choices_selected") checkmate::assert_class(conf_level, "choices_selected") 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") diff --git a/R/tm_g_lineplot.R b/R/tm_g_lineplot.R index 7b814638dd..1ca65d70cf 100644 --- a/R/tm_g_lineplot.R +++ b/R/tm_g_lineplot.R @@ -294,6 +294,7 @@ tm_g_lineplot <- function(label, checkmate::assert_string(mid) checkmate::assert_string(interval, null.ok = TRUE) whiskers <- match.arg(whiskers) + checkmate::assert_class(paramcd, "choices_selected") checkmate::assert_class(conf_level, "choices_selected") 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") diff --git a/R/tm_g_pp_adverse_events.R b/R/tm_g_pp_adverse_events.R index a709d15d1b..7c377ced20 100644 --- a/R/tm_g_pp_adverse_events.R +++ b/R/tm_g_pp_adverse_events.R @@ -169,19 +169,19 @@ template_adverse_events <- function(dataname = "ANL", #' #' @inheritParams module_arguments #' @inheritParams template_adverse_events -#' @param aeterm ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param aeterm ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `AETERM` variable from `dataname`. -#' @param tox_grade ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param tox_grade ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `AETOXGR` variable from `dataname`. -#' @param causality ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param causality ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `AEREL` variable from `dataname`. -#' @param outcome ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param outcome ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `AEOUT` variable from `dataname`. -#' @param action ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param action ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `AEACN` variable from `dataname`. -#' @param time ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param time ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `ASTDY` variable from `dataname`. -#' @param decod ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param decod ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `AEDECOD` variable from `dataname`. #' #' @inherit module_arguments return @@ -264,6 +264,13 @@ tm_g_pp_adverse_events <- function(label, checkmate::assert_string(dataname) checkmate::assert_string(parentname) checkmate::assert_string(patient_col) + checkmate::assert_class(aeterm, "choices_selected", null.ok = TRUE) + checkmate::assert_class(tox_grade, "choices_selected", null.ok = TRUE) + checkmate::assert_class(causality, "choices_selected", null.ok = TRUE) + checkmate::assert_class(outcome, "choices_selected", null.ok = TRUE) + checkmate::assert_class(action, "choices_selected", null.ok = TRUE) + checkmate::assert_class(time, "choices_selected", null.ok = TRUE) + checkmate::assert_class(decod, "choices_selected", null.ok = TRUE) checkmate::assert_numeric(font_size, len = 3, any.missing = FALSE, finite = TRUE) checkmate::assert_numeric(font_size[1], lower = font_size[2], upper = font_size[3], .var.name = "font_size") checkmate::assert_numeric(plot_height, len = 3, any.missing = FALSE, finite = TRUE) diff --git a/R/tm_g_pp_patient_timeline.R b/R/tm_g_pp_patient_timeline.R index a1206315cc..8da1acdb5c 100644 --- a/R/tm_g_pp_patient_timeline.R +++ b/R/tm_g_pp_patient_timeline.R @@ -326,23 +326,23 @@ template_patient_timeline <- function(dataname = "ANL", #' @inheritParams template_patient_timeline #' @param dataname_adcm (`character`)\cr name of `ADCM` dataset or equivalent. #' @param dataname_adae (`character`)\cr name of `ADAE` dataset or equivalent. -#' @param aerelday_start ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object +#' @param aerelday_start ([teal.transform::choices_selected()])\cr object #' with all available choices and preselected option for the `ASTDY` variable from `dataname_adae`. -#' @param aerelday_end ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object +#' @param aerelday_end ([teal.transform::choices_selected()])\cr object #' with all available choices and preselected option for the `AENDY` variable from `dataname_adae`. -#' @param dsrelday_start ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object +#' @param dsrelday_start ([teal.transform::choices_selected()])\cr object #' with all available choices and preselected option for the `ASTDY` variable from `dataname_adcm`. -#' @param dsrelday_end ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object +#' @param dsrelday_end ([teal.transform::choices_selected()])\cr object #' with all available choices and preselected option for the `AENDY` variable from `dataname_adcm`. -#' @param cmdecod ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param cmdecod ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `CMDECOD` variable from `dataname_adcm`. -#' @param aetime_start ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' @param aetime_start ([teal.transform::choices_selected()])\cr object with #' all available choices and preselected option for the `ASTDTM` variable from `dataname_adae`. -#' @param aetime_end ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param aetime_end ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `AENDTM` variable from `dataname_adae`. -#' @param dstime_start ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' @param dstime_start ([teal.transform::choices_selected()])\cr object with #' all available choices and preselected option for the `CMASTDTM` variable from `dataname_adcm`. -#' @param dstime_end ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param dstime_end ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `CMAENDTM` variable from `dataname_adcm`. #' #' @inherit module_arguments return @@ -463,6 +463,16 @@ tm_g_pp_patient_timeline <- function(label, checkmate::assert_string(dataname_adae) checkmate::assert_string(parentname) checkmate::assert_string(patient_col) + checkmate::assert_class(aeterm, "choices_selected", null.ok = TRUE) + checkmate::assert_class(cmdecod, "choices_selected", null.ok = TRUE) + checkmate::assert_class(aetime_start, "choices_selected", null.ok = TRUE) + checkmate::assert_class(aetime_end, "choices_selected", null.ok = TRUE) + checkmate::assert_class(dstime_start, "choices_selected", null.ok = TRUE) + checkmate::assert_class(dstime_end, "choices_selected", null.ok = TRUE) + checkmate::assert_class(aerelday_start, "choices_selected", null.ok = TRUE) + checkmate::assert_class(aerelday_end, "choices_selected", null.ok = TRUE) + checkmate::assert_class(dsrelday_start, "choices_selected", null.ok = TRUE) + checkmate::assert_class(dsrelday_end, "choices_selected", null.ok = TRUE) checkmate::assert_numeric(font_size, len = 3, any.missing = FALSE, finite = TRUE) checkmate::assert_numeric(font_size[1], lower = font_size[2], upper = font_size[3], .var.name = "font_size") checkmate::assert_numeric(plot_height, len = 3, any.missing = FALSE, finite = TRUE) diff --git a/R/tm_g_pp_therapy.R b/R/tm_g_pp_therapy.R index 6bbff227e8..df06737800 100644 --- a/R/tm_g_pp_therapy.R +++ b/R/tm_g_pp_therapy.R @@ -233,17 +233,17 @@ template_therapy <- function(dataname = "ANL", #' #' @inheritParams module_arguments #' @inheritParams template_therapy -#' @param cmdose ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param cmdose ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `CMDOSE` variable from `dataname`. -#' @param cmtrt ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param cmtrt ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `CMTRT` variable from `dataname`. -#' @param cmdosu ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param cmdosu ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `CMDOSU` variable from `dataname`. -#' @param cmroute ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param cmroute ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `CMROUTE` variable from `dataname`. -#' @param cmdosfrq ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param cmdosfrq ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `CMDOSFRQ` variable from `dataname`. -#' @param cmendy ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param cmendy ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `CMENDY` variable from `dataname`. #' #' @inherit module_arguments return @@ -349,6 +349,16 @@ tm_g_pp_therapy <- function(label, post_output = NULL, ggplot2_args = teal.widgets::ggplot2_args()) { logger::log_info("Initializing tm_g_pp_therapy") + checkmate::assert_class(atirel, "choices_selected", null.ok = TRUE) + checkmate::assert_class(cmdecod, "choices_selected", null.ok = TRUE) + checkmate::assert_class(cmindc, "choices_selected", null.ok = TRUE) + checkmate::assert_class(cmdose, "choices_selected", null.ok = TRUE) + checkmate::assert_class(cmtrt, "choices_selected", null.ok = TRUE) + checkmate::assert_class(cmdosu, "choices_selected", null.ok = TRUE) + checkmate::assert_class(cmroute, "choices_selected", null.ok = TRUE) + checkmate::assert_class(cmdosfrq, "choices_selected", null.ok = TRUE) + checkmate::assert_class(cmstdy, "choices_selected", null.ok = TRUE) + checkmate::assert_class(cmendy, "choices_selected", null.ok = TRUE) checkmate::assert_string(label) checkmate::assert_string(dataname) checkmate::assert_string(parentname) diff --git a/R/tm_g_pp_vitals.R b/R/tm_g_pp_vitals.R index 4ce788c8e3..b8ce4a024a 100644 --- a/R/tm_g_pp_vitals.R +++ b/R/tm_g_pp_vitals.R @@ -206,7 +206,7 @@ template_vitals <- function(dataname = "ANL", #' #' @inheritParams module_arguments #' @inheritParams template_vitals -#' @param xaxis ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param xaxis ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the time variable from `dataname` to be put on the plot x-axis. #' #' @inherit module_arguments return @@ -283,6 +283,9 @@ tm_g_pp_vitals <- function(label, checkmate::assert_string(dataname) checkmate::assert_string(parentname) checkmate::assert_string(patient_col) + checkmate::assert_class(paramcd, "choices_selected", null.ok = TRUE) + checkmate::assert_class(aval_var, "choices_selected", null.ok = TRUE) + checkmate::assert_class(xaxis, "choices_selected", null.ok = TRUE) checkmate::assert_numeric(font_size, len = 3, any.missing = FALSE, finite = TRUE) checkmate::assert_numeric(font_size[1], lower = font_size[2], upper = font_size[3], .var.name = "font_size") checkmate::assert_numeric(plot_height, len = 3, any.missing = FALSE, finite = TRUE) diff --git a/R/tm_t_abnormality.R b/R/tm_t_abnormality.R index c48c9961f9..26b361fc24 100644 --- a/R/tm_t_abnormality.R +++ b/R/tm_t_abnormality.R @@ -228,11 +228,11 @@ template_abnormality <- function(parentname, #' #' @inheritParams module_arguments #' @inheritParams template_abnormality -#' @param grade ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr +#' @param grade ([teal.transform::choices_selected()])\cr #' object with all available choices and preselected option for variable names that can be used to #' specify the abnormality grade. Variable must be factor. #' @param abnormal (`named list`)\cr defined by user to indicate what abnormalities are to be displayed. -#' @param baseline_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr +#' @param baseline_var ([teal.transform::choices_selected()])\cr #' variable for baseline abnormality grade. #' @param na_level (`character`)\cr the NA level in the input dataset, default to `""`. #' @@ -339,8 +339,8 @@ tm_t_abnormality <- function(label, checkmate::assert_class(grade, "choices_selected") checkmate::assert_class(id_var, "choices_selected") checkmate::assert_class(baseline_var, "choices_selected") - checkmate::assert_class(treatment_flag, "choices_selected") checkmate::assert_class(treatment_flag_var, "choices_selected") + checkmate::assert_class(treatment_flag, "choices_selected") checkmate::assert_flag(add_total) checkmate::assert_string(total_label) checkmate::assert_flag(drop_arm_levels) diff --git a/R/tm_t_abnormality_by_worst_grade.R b/R/tm_t_abnormality_by_worst_grade.R index 065237b9c7..82ce8e4041 100644 --- a/R/tm_t_abnormality_by_worst_grade.R +++ b/R/tm_t_abnormality_by_worst_grade.R @@ -235,15 +235,15 @@ template_abnormality_by_worst_grade <- function(parentname, # nolint #' @inheritParams module_arguments #' @inheritParams template_abnormality_by_worst_grade -#' @param atoxgr_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr +#' @param atoxgr_var ([teal.transform::choices_selected()])\cr #' object with all available choices and preselected option #' for variable names that can be used as Analysis Toxicity Grade. -#' @param worst_high_flag_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr +#' @param worst_high_flag_var ([teal.transform::choices_selected()])\cr #' object with all available choices and preselected option for variable names that can be used as Worst High #' Grade flag. -#' @param worst_low_flag_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr +#' @param worst_low_flag_var ([teal.transform::choices_selected()])\cr #' object with all available choices and preselected option for variable names that can be used as Worst Low Grade flag. -#' @param worst_flag_indicator ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr +#' @param worst_flag_indicator ([teal.transform::choices_selected()])\cr #' value indicating worst grade. #' #' @inherit module_arguments return seealso diff --git a/R/tm_t_ancova.R b/R/tm_t_ancova.R index b5338c6c7a..c7a76aa42a 100644 --- a/R/tm_t_ancova.R +++ b/R/tm_t_ancova.R @@ -521,6 +521,11 @@ tm_t_ancova <- function(label, checkmate::assert_string(label) checkmate::assert_string(dataname) checkmate::assert_string(parentname) + checkmate::assert_class(arm_var, "choices_selected") + checkmate::assert_class(aval_var, "choices_selected") + checkmate::assert_class(cov_var, "choices_selected") + checkmate::assert_class(avisit, "choices_selected") + checkmate::assert_class(paramcd, "choices_selected") checkmate::assert_class(conf_level, "choices_selected") checkmate::assert_class(pre_output, classes = "shiny.tag", null.ok = TRUE) checkmate::assert_class(post_output, classes = "shiny.tag", null.ok = TRUE) diff --git a/R/tm_t_binary_outcome.R b/R/tm_t_binary_outcome.R index e0a9907d98..805423d96e 100644 --- a/R/tm_t_binary_outcome.R +++ b/R/tm_t_binary_outcome.R @@ -449,6 +449,10 @@ tm_t_binary_outcome <- function(label, checkmate::assert_string(label) checkmate::assert_string(dataname) checkmate::assert_string(parentname) + checkmate::assert_class(arm_var, "choices_selected") + checkmate::assert_class(paramcd, "choices_selected") + checkmate::assert_class(strata_var, "choices_selected") + checkmate::assert_class(aval_var, "choices_selected") checkmate::assert_class(conf_level, "choices_selected") checkmate::assert_flag(add_total) checkmate::assert_string(total_label) diff --git a/R/tm_t_coxreg.R b/R/tm_t_coxreg.R index 185692939e..a231e15e7a 100644 --- a/R/tm_t_coxreg.R +++ b/R/tm_t_coxreg.R @@ -515,6 +515,12 @@ tm_t_coxreg <- function(label, checkmate::assert_string(dataname) checkmate::assert_string(parentname) checkmate::assert_string(na_level) + checkmate::assert_class(arm_var, "choices_selected") + checkmate::assert_class(paramcd, "choices_selected") + checkmate::assert_class(cov_var, "choices_selected") + checkmate::assert_class(strata_var, "choices_selected") + checkmate::assert_class(aval_var, "choices_selected") + checkmate::assert_class(cnsr_var, "choices_selected") checkmate::assert_class(conf_level, "choices_selected") checkmate::assert_class(pre_output, classes = "shiny.tag", null.ok = TRUE) checkmate::assert_class(post_output, classes = "shiny.tag", null.ok = TRUE) diff --git a/R/tm_t_events.R b/R/tm_t_events.R index a7f3a6ebd7..c7bc04173c 100644 --- a/R/tm_t_events.R +++ b/R/tm_t_events.R @@ -524,6 +524,9 @@ tm_t_events <- function(label, checkmate::assert_string(label) checkmate::assert_string(dataname) checkmate::assert_string(parentname) + checkmate::assert_class(arm_var, "choices_selected") + checkmate::assert_class(hlt, "choices_selected") + checkmate::assert_class(llt, "choices_selected") checkmate::assert_string(event_type) checkmate::assert_flag(add_total) checkmate::assert_string(total_label) diff --git a/R/tm_t_events_by_grade.R b/R/tm_t_events_by_grade.R index 760d1c5bf8..d6520eeb6f 100644 --- a/R/tm_t_events_by_grade.R +++ b/R/tm_t_events_by_grade.R @@ -868,6 +868,9 @@ tm_t_events_by_grade <- function(label, checkmate::assert_string(label) checkmate::assert_string(dataname) checkmate::assert_string(parentname) + checkmate::assert_class(arm_var, "choices_selected") + checkmate::assert_class(hlt, "choices_selected") + checkmate::assert_class(llt, "choices_selected") checkmate::assert_flag(add_total) checkmate::assert_string(total_label) checkmate::assert_string(na_level) diff --git a/R/tm_t_events_patyear.R b/R/tm_t_events_patyear.R index 1483eae7f2..7c92a07f4b 100644 --- a/R/tm_t_events_patyear.R +++ b/R/tm_t_events_patyear.R @@ -152,7 +152,7 @@ template_events_patyear <- function(dataname, #' #' @inheritParams module_arguments #' @inheritParams template_events_patyear -#' @param events_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' @param events_var ([teal.transform::choices_selected()])\cr object with #' all available choices and preselected option for the variable with all event counts. #' #' @inherit module_arguments return seealso diff --git a/R/tm_t_events_summary.R b/R/tm_t_events_summary.R index f5998a1735..5598562ceb 100644 --- a/R/tm_t_events_summary.R +++ b/R/tm_t_events_summary.R @@ -483,20 +483,20 @@ template_events_summary <- function(anl_name, #' @inheritParams module_arguments #' @inheritParams template_arguments #' @inheritParams template_events_summary -#' @param dthfl_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object +#' @param dthfl_var ([teal.transform::choices_selected()])\cr object #' with all available choices and preselected option for variable names that can be used as death flag variable. #' Records with `"Y"`` are summarized in the table row for "Total number of deaths". -#' @param dcsreas_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object +#' @param dcsreas_var ([teal.transform::choices_selected()])\cr object #' with all available choices and preselected option for variable names that can be used as study discontinuation #' reason variable. Records with `"ADVERSE EVENTS"` are summarized in the table row for #' "Total number of patients withdrawn from study due to an AE". -#' @param flag_var_anl ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()] or `NULL`)\cr +#' @param flag_var_anl ([teal.transform::choices_selected()] or `NULL`)\cr #' vector with names of flag variables from `dataset` used to count adverse event sub-groups (e.g. Serious events, #' Related events, etc.). Variable labels are used as table row names if they exist. -#' @param flag_var_aesi ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()] or `NULL`)\cr +#' @param flag_var_aesi ([teal.transform::choices_selected()] or `NULL`)\cr #' vector with names of flag variables from `dataset` used to count adverse event special interest groups. All flag #' variables must be of type `logical`. Variable labels are used as table row names if they exist. -#' @param aeseq_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr variable for +#' @param aeseq_var ([teal.transform::choices_selected()])\cr variable for #' adverse events sequence number from `dataset`. Used for counting total number of events. #' #' @inherit module_arguments return seealso @@ -619,6 +619,13 @@ tm_t_events_summary <- function(label, checkmate::assert_string(label) checkmate::assert_string(dataname) checkmate::assert_string(parentname) + checkmate::assert_class(arm_var, "choices_selected") + checkmate::assert_class(flag_var_anl, "choices_selected", null.ok = TRUE) + checkmate::assert_class(flag_var_aesi, "choices_selected", null.ok = TRUE) + checkmate::assert_class(dthfl_var, "choices_selected") + checkmate::assert_class(dcsreas_var, "choices_selected") + checkmate::assert_class(llt, "choices_selected") + checkmate::assert_class(aeseq_var, "choices_selected") checkmate::assert_flag(add_total) checkmate::assert_string(total_label) checkmate::assert_string(na_level) diff --git a/R/tm_t_exposure.R b/R/tm_t_exposure.R index 42fee6bbee..59db38cee6 100644 --- a/R/tm_t_exposure.R +++ b/R/tm_t_exposure.R @@ -213,13 +213,13 @@ template_exposure <- function(parentname, #' #' @inheritParams module_arguments #' @inheritParams template_exposure -#' @param row_by_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr +#' @param row_by_var ([teal.transform::choices_selected()])\cr #' object with all available choices and preselected option for #' variable names that can be used to split rows. -#' @param col_by_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr +#' @param col_by_var ([teal.transform::choices_selected()])\cr #' object with all available choices and preselected option for #' variable names that can be used to split columns. -#' @param parcat ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr +#' @param parcat ([teal.transform::choices_selected()])\cr #' object with all available choices and preselected option for #' parameter category values. #' @param paramcd_label (`character`)\cr the column from the dataset where the value will be used to @@ -329,9 +329,9 @@ tm_t_exposure <- function(label, checkmate::assert_string(dataname) checkmate::assert_string(parentname) checkmate::assert_string(na_level) - checkmate::assert_class(paramcd, "choices_selected") checkmate::assert_class(row_by_var, "choices_selected") checkmate::assert_class(col_by_var, "choices_selected") + checkmate::assert_class(paramcd, "choices_selected") checkmate::assert_class(id_var, "choices_selected") checkmate::assert_class(parcat, "choices_selected") checkmate::assert_class(aval_var, "choices_selected") diff --git a/R/tm_t_logistic.R b/R/tm_t_logistic.R index 385b40e633..ef523e1786 100644 --- a/R/tm_t_logistic.R +++ b/R/tm_t_logistic.R @@ -212,12 +212,12 @@ template_logistic <- function(dataname, #' #' @inheritParams module_arguments #' @inheritParams template_logistic -#' @param arm_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()] or `NULL`)\cr object +#' @param arm_var ([teal.transform::choices_selected()] or `NULL`)\cr object #' with all available choices and preselected option for variable names that can be used as `arm_var`. This defines #' the grouping variable(s) in the results table. If there are two elements selected for `arm_var`, the second #' variable will be nested under the first variable. If `NULL`, no arm/treatment variable is included in the #' logistic model. -#' @param avalc_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param avalc_var ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the analysis variable (categorical). #' #' @inherit module_arguments return seealso @@ -298,12 +298,12 @@ tm_t_logistic <- function(label, checkmate::assert_string(label) checkmate::assert_string(dataname) checkmate::assert_string(parentname) - checkmate::assert_multi_class(arm_var, c("choices_selected", "data_extract_spec"), null.ok = TRUE) + checkmate::assert_class(arm_var, "choices_selected", null.ok = TRUE) + checkmate::assert_class(paramcd, "choices_selected") + checkmate::assert_class(cov_var, "choices_selected", null.ok = TRUE) + checkmate::assert_class(avalc_var, "choices_selected") + checkmate::assert_class(conf_level, "choices_selected") checkmate::assert_list(arm_ref_comp, names = "named", null.ok = TRUE) - checkmate::assert_multi_class(paramcd, c("choices_selected", "data_extract_spec")) - checkmate::assert_multi_class(cov_var, c("choices_selected", "data_extract_spec")) - checkmate::assert_multi_class(avalc_var, c("choices_selected", "data_extract_spec")) - checkmate::assert_class(conf_level, classes = "choices_selected") checkmate::assert_class(pre_output, classes = "shiny.tag", null.ok = TRUE) checkmate::assert_class(post_output, classes = "shiny.tag", null.ok = TRUE) checkmate::assert_class(basic_table_args, "basic_table_args") diff --git a/R/tm_t_mult_events.R b/R/tm_t_mult_events.R index e4a8f60638..a76f5dfd47 100644 --- a/R/tm_t_mult_events.R +++ b/R/tm_t_mult_events.R @@ -277,7 +277,7 @@ template_mult_events <- function(dataname, #' #' @inheritParams module_arguments #' @inheritParams template_mult_events -#' @param seq_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with +#' @param seq_var ([teal.transform::choices_selected()])\cr object with #' all available choices and preselected option for variable names that can be used as analysis sequence number #' variable. Used for counting the unique number of events. #' @@ -348,6 +348,10 @@ tm_t_mult_events <- function(label, checkmate::assert_string(label) checkmate::assert_string(dataname) checkmate::assert_string(parentname) + checkmate::assert_class(arm_var, "choices_selected") + checkmate::assert_class(seq_var, "choices_selected") + checkmate::assert_class(hlt, "choices_selected") + checkmate::assert_class(llt, "choices_selected") checkmate::assert_string(event_type) checkmate::assert_flag(add_total) checkmate::assert_string(total_label) diff --git a/R/tm_t_pp_basic_info.R b/R/tm_t_pp_basic_info.R index de57922ac2..1ff097c7d8 100644 --- a/R/tm_t_pp_basic_info.R +++ b/R/tm_t_pp_basic_info.R @@ -61,7 +61,7 @@ template_basic_info <- function(dataname = "ANL", #' #' @inheritParams module_arguments #' @inheritParams template_basic_info -#' @param vars ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param vars ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for variables from `dataname` to show in the table. #' #' @inherit module_arguments return @@ -101,6 +101,7 @@ tm_t_pp_basic_info <- function(label, checkmate::assert_string(label) checkmate::assert_string(dataname) checkmate::assert_string(patient_col) + checkmate::assert_class(vars, "choices_selected", null.ok = TRUE) checkmate::assert_class(pre_output, classes = "shiny.tag", null.ok = TRUE) checkmate::assert_class(post_output, classes = "shiny.tag", null.ok = TRUE) diff --git a/R/tm_t_pp_laboratory.R b/R/tm_t_pp_laboratory.R index 5417bff3b6..eabed2db4c 100644 --- a/R/tm_t_pp_laboratory.R +++ b/R/tm_t_pp_laboratory.R @@ -137,11 +137,11 @@ template_laboratory <- function(dataname = "ANL", #' #' @inheritParams module_arguments #' @inheritParams template_laboratory -#' @param param ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param param ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `PARAM` variable from `dataname`. -#' @param timepoints ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param timepoints ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the time variable from `dataname`. -#' @param anrind ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param anrind ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `ANRIND` variable from `dataname`. Variable should have the #' following 3 levels: `"HIGH"`, `"LOW"`, and `"NORMAL"`. #' @@ -238,6 +238,12 @@ tm_t_pp_laboratory <- function(label, checkmate::assert_string(dataname) checkmate::assert_string(parentname) checkmate::assert_string(patient_col) + checkmate::assert_class(timepoints, "choices_selected", null.ok = TRUE) + checkmate::assert_class(aval_var, "choices_selected", null.ok = TRUE) + checkmate::assert_class(avalu_var, "choices_selected", null.ok = TRUE) + checkmate::assert_class(param, "choices_selected", null.ok = TRUE) + checkmate::assert_class(paramcd, "choices_selected", null.ok = TRUE) + checkmate::assert_class(anrind, "choices_selected", null.ok = TRUE) checkmate::assert_class(pre_output, classes = "shiny.tag", null.ok = TRUE) checkmate::assert_class(post_output, classes = "shiny.tag", null.ok = TRUE) diff --git a/R/tm_t_pp_medical_history.R b/R/tm_t_pp_medical_history.R index 7213c2c0e8..2cbc7477da 100644 --- a/R/tm_t_pp_medical_history.R +++ b/R/tm_t_pp_medical_history.R @@ -80,11 +80,11 @@ template_medical_history <- function(dataname = "ANL", #' #' @inheritParams module_arguments #' @inheritParams template_medical_history -#' @param mhterm ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param mhterm ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `MHTERM` variable from `dataname`. -#' @param mhbodsys ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param mhbodsys ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `MHBODSYS` variable from `dataname`. -#' @param mhdistat ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param mhdistat ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected option for the `MHDISTAT` variable from `dataname`. #' #' @inherit module_arguments return @@ -142,6 +142,9 @@ tm_t_pp_medical_history <- function(label, checkmate::assert_string(dataname) checkmate::assert_string(parentname) checkmate::assert_string(patient_col) + checkmate::assert_class(mhterm, "choices_selected", null.ok = TRUE) + checkmate::assert_class(mhbodsys, "choices_selected", null.ok = TRUE) + checkmate::assert_class(mhdistat, "choices_selected", null.ok = TRUE) checkmate::assert_class(pre_output, classes = "shiny.tag", null.ok = TRUE) checkmate::assert_class(post_output, classes = "shiny.tag", null.ok = TRUE) diff --git a/R/tm_t_pp_prior_medication.R b/R/tm_t_pp_prior_medication.R index 3497a021af..b156ff7116 100644 --- a/R/tm_t_pp_prior_medication.R +++ b/R/tm_t_pp_prior_medication.R @@ -130,6 +130,10 @@ tm_t_pp_prior_medication <- function(label, checkmate::assert_string(dataname) checkmate::assert_string(parentname) checkmate::assert_string(patient_col) + checkmate::assert_class(atirel, "choices_selected", null.ok = TRUE) + checkmate::assert_class(cmdecod, "choices_selected", null.ok = TRUE) + checkmate::assert_class(cmindc, "choices_selected", null.ok = TRUE) + checkmate::assert_class(cmstdy, "choices_selected", null.ok = TRUE) checkmate::assert_class(pre_output, classes = "shiny.tag", null.ok = TRUE) checkmate::assert_class(post_output, classes = "shiny.tag", null.ok = TRUE) diff --git a/R/tm_t_shift_by_arm.R b/R/tm_t_shift_by_arm.R index f062f2988b..4908fb72ca 100644 --- a/R/tm_t_shift_by_arm.R +++ b/R/tm_t_shift_by_arm.R @@ -274,8 +274,13 @@ tm_t_shift_by_arm <- function(label, useNA <- match.arg(useNA) # nolint checkmate::assert_string(na_level) checkmate::assert_string(total_label) - checkmate::assert_class(treatment_flag, "choices_selected") + checkmate::assert_class(arm_var, "choices_selected") + checkmate::assert_class(paramcd, "choices_selected") + checkmate::assert_class(visit_var, "choices_selected") + checkmate::assert_class(aval_var, "choices_selected") + checkmate::assert_class(baseline_var, "choices_selected") checkmate::assert_class(treatment_flag_var, "choices_selected") + checkmate::assert_class(treatment_flag, "choices_selected") checkmate::assert_class(pre_output, classes = "shiny.tag", null.ok = TRUE) checkmate::assert_class(post_output, classes = "shiny.tag", null.ok = TRUE) checkmate::assert_class(basic_table_args, "basic_table_args") diff --git a/R/tm_t_shift_by_arm_by_worst.R b/R/tm_t_shift_by_arm_by_worst.R index b46d71b70d..375c792d26 100644 --- a/R/tm_t_shift_by_arm_by_worst.R +++ b/R/tm_t_shift_by_arm_by_worst.R @@ -285,8 +285,13 @@ tm_t_shift_by_arm_by_worst <- function(label, useNA <- match.arg(useNA) # nolint checkmate::assert_string(na_level) checkmate::assert_string(total_label) - checkmate::assert_class(treatment_flag, "choices_selected") + checkmate::assert_class(arm_var, "choices_selected") + checkmate::assert_class(paramcd, "choices_selected") + checkmate::assert_class(aval_var, "choices_selected") + checkmate::assert_class(baseline_var, "choices_selected") + checkmate::assert_class(worst_flag_var, "choices_selected") checkmate::assert_class(treatment_flag_var, "choices_selected") + checkmate::assert_class(treatment_flag, "choices_selected") checkmate::assert_class(pre_output, classes = "shiny.tag", null.ok = TRUE) checkmate::assert_class(post_output, classes = "shiny.tag", null.ok = TRUE) checkmate::assert_class(basic_table_args, "basic_table_args") diff --git a/R/tm_t_shift_by_grade.R b/R/tm_t_shift_by_grade.R index 26e892cce3..43e70abd99 100644 --- a/R/tm_t_shift_by_grade.R +++ b/R/tm_t_shift_by_grade.R @@ -466,9 +466,9 @@ template_shift_by_grade <- function(parentname, #' #' @inheritParams module_arguments #' @inheritParams template_shift_by_grade -#' @param anl_toxgrade_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr +#' @param anl_toxgrade_var ([teal.transform::choices_selected()])\cr #' variable for analysis toxicity grade. -#' @param base_toxgrade_var ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr +#' @param base_toxgrade_var ([teal.transform::choices_selected()])\cr #' variable for baseline toxicity grade. #' #' @inherit module_arguments return seealso @@ -575,6 +575,7 @@ tm_t_shift_by_grade <- function(label, checkmate::assert_string(parentname) checkmate::assert_string(na_level) checkmate::assert_class(arm_var, "choices_selected") + checkmate::assert_class(visit_var, "choices_selected") checkmate::assert_class(paramcd, "choices_selected") checkmate::assert_class(worst_flag_var, "choices_selected") checkmate::assert_class(worst_flag_indicator, "choices_selected") diff --git a/R/tm_t_smq.R b/R/tm_t_smq.R index 9b2d65ec2f..b3c78abc68 100644 --- a/R/tm_t_smq.R +++ b/R/tm_t_smq.R @@ -308,9 +308,9 @@ template_smq <- function(dataname, #' #' @inheritParams module_arguments #' @inheritParams template_smq -#' @param baskets ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param baskets ([teal.transform::choices_selected()])\cr object with all #' available choices and preselected options for standardized/customized queries. -#' @param scopes ([teal.transform::choices_selected()] or [teal.transform::data_extract_spec()])\cr object with all +#' @param scopes ([teal.transform::choices_selected()])\cr object with all #' available choices for the scopes of standardized queries. #' #' @inherit module_arguments return seealso @@ -396,6 +396,8 @@ tm_t_smq <- function(label, checkmate::assert_class(arm_var, "choices_selected") checkmate::assert_class(id_var, "choices_selected") checkmate::assert_class(llt, "choices_selected") + checkmate::assert_class(baskets, "choices_selected") + checkmate::assert_class(scopes, "choices_selected") checkmate::assert_flag(add_total) checkmate::assert_string(total_label) checkmate::assert_flag(drop_arm_levels) diff --git a/R/tm_t_summary.R b/R/tm_t_summary.R index 881416c022..7dc65b3039 100644 --- a/R/tm_t_summary.R +++ b/R/tm_t_summary.R @@ -258,6 +258,8 @@ tm_t_summary <- function(label, checkmate::assert_string(label) checkmate::assert_string(dataname) checkmate::assert_string(parentname) + checkmate::assert_class(arm_var, "choices_selected") + checkmate::assert_class(summarize_vars, "choices_selected") checkmate::assert_string(na_level) checkmate::assert_character(numeric_stats, min.len = 1) useNA <- match.arg(useNA) # nolint diff --git a/R/tm_t_summary_by.R b/R/tm_t_summary_by.R index 15830d3cf0..e00a149959 100644 --- a/R/tm_t_summary_by.R +++ b/R/tm_t_summary_by.R @@ -398,7 +398,11 @@ tm_t_summary_by <- function(label, checkmate::assert_string(parentname) useNA <- match.arg(useNA) # nolint checkmate::assert_string(na_level) + checkmate::assert_class(arm_var, "choices_selected") + checkmate::assert_class(by_vars, "choices_selected") + checkmate::assert_class(summarize_vars, "choices_selected") checkmate::assert_class(id_var, "choices_selected") + checkmate::assert_class(paramcd, "choices_selected") checkmate::assert_class(denominator, "choices_selected") checkmate::assert_flag(add_total) checkmate::assert_string(total_label) diff --git a/R/tm_t_tte.R b/R/tm_t_tte.R index fbfa654a87..9897e5533c 100644 --- a/R/tm_t_tte.R +++ b/R/tm_t_tte.R @@ -493,9 +493,15 @@ tm_t_tte <- function(label, checkmate::assert_string(label) checkmate::assert_string(dataname) checkmate::assert_string(parentname) - checkmate::assert_class(time_points, "choices_selected") + checkmate::assert_class(arm_var, "choices_selected") + checkmate::assert_class(paramcd, "choices_selected") + checkmate::assert_class(strata_var, "choices_selected") + checkmate::assert_class(aval_var, "choices_selected") + checkmate::assert_class(cnsr_var, "choices_selected") checkmate::assert_class(conf_level_coxph, "choices_selected") checkmate::assert_class(conf_level_survfit, "choices_selected") + checkmate::assert_class(time_points, "choices_selected") + checkmate::assert_class(time_unit_var, "choices_selected") checkmate::assert_flag(add_total) checkmate::assert_string(total_label) checkmate::assert_string(na_level) diff --git a/R/utils.R b/R/utils.R index 69f17cea0e..20f7b6339f 100644 --- a/R/utils.R +++ b/R/utils.R @@ -363,7 +363,7 @@ cs_to_des_filter <- function(cs, dataname, multiple = FALSE, include_vars = FALS } } -#' Whether object is of class [teal.transform::choices_selected()] or [teal.transform::data_extract_spec()] +#' Whether object is of class [teal.transform::choices_selected()] #' #' @param x object to be checked #' diff --git a/man/is.cs_or_des.Rd b/man/is.cs_or_des.Rd index 73ad7fdb76..4d1043f5c4 100644 --- a/man/is.cs_or_des.Rd +++ b/man/is.cs_or_des.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/utils.R \name{is.cs_or_des} \alias{is.cs_or_des} -\title{Whether object is of class \code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}}} +\title{Whether object is of class \code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}}} \usage{ is.cs_or_des(x) } @@ -13,5 +13,5 @@ is.cs_or_des(x) (\code{logical}) } \description{ -Whether object is of class \code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}} +Whether object is of class \code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} } diff --git a/man/module_arguments.Rd b/man/module_arguments.Rd index 5222abc0ff..5ff8d44af8 100644 --- a/man/module_arguments.Rd +++ b/man/module_arguments.Rd @@ -10,46 +10,46 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{atirel}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{atirel}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{ATIREL} variable from \code{dataname}.} -\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the analysis variable.} -\item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the analysis unit variable.} -\item{avisit}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr value of analysis +\item{avisit}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr value of analysis visit \code{AVISIT} of interest.} -\item{baseline_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{baseline_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable values that can be used as \code{baseline_var}.} -\item{by_vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{by_vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names used to split the summary by rows.} -\item{cmdecod}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cmdecod}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{CMDECOD} variable from \code{dataname}.} -\item{cmindc}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cmindc}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{CMINDC} variable from \code{dataname}.} -\item{cmstdy}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cmstdy}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{CMSTDY} variable from \code{dataname}.} -\item{cnsr_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cnsr_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the censoring variable.} -\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the confidence level, each within range of (0, 1).} -\item{cov_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cov_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the covariates variables.} \item{dataname}{(\code{character})\cr analysis data used in teal module.} @@ -66,10 +66,10 @@ Otherwise, the symbol size will be proportional to the sample size in each each \item{font_size}{(\code{numeric})\cr numeric vector of length 3 of current, minimum and maximum font size values.} -\item{hlt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable +\item{hlt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr name of the variable with high level term for events.} -\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying +\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object specifying the variable name for subject id.} \item{interact_var}{(\code{character})\cr name of the variable that should have interactions @@ -81,10 +81,10 @@ needed, the default option is \code{FALSE}.} \item{label}{(\code{character})\cr menu item label of the module in the teal app.} -\item{llt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable +\item{llt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr name of the variable with low level term for events.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} @@ -103,37 +103,37 @@ For example the \code{\link[shiny:helpText]{shiny::helpText()}} elements are use \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. For example a title.} -\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of +\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr names of the variables for stratified analysis.} -\item{summarize_vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of +\item{summarize_vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr names of the variables that should be summarized.} -\item{subgroup_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{subgroup_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as the default subgroups.} \item{time_points}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for time points that can be used in \code{\link[tern:survival_timepoint]{tern::surv_timepoint()}}.} -\item{time_unit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +\item{time_unit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the time unit variable.} -\item{treatment_flag}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr value +\item{treatment_flag}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr value indicating on treatment records in \code{treatment_flag_var}.} -\item{treatment_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr on +\item{treatment_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr on treatment flag variable.} \item{useNA}{(\code{character})\cr whether missing data (\code{NA}) should be displayed as a level.} -\item{visit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{visit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{visit} variable. Must be a factor in \code{dataname}.} -\item{worst_flag_indicator}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr +\item{worst_flag_indicator}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr value indicating worst grade.} -\item{worst_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +\item{worst_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as worst flag variable.} } \value{ diff --git a/man/tm_a_gee.Rd b/man/tm_a_gee.Rd index 8820254e55..4a7c342693 100644 --- a/man/tm_a_gee.Rd +++ b/man/tm_a_gee.Rd @@ -30,23 +30,23 @@ tm_a_gee( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the analysis variable.} -\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying +\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object specifying the variable name for subject id.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{visit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{visit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{visit} variable. Must be a factor in \code{dataname}.} -\item{cov_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cov_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the covariates variables.} \item{arm_ref_comp}{optional, (\code{list})\cr If specified it must be a named list with each element corresponding to @@ -55,10 +55,10 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} -\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. diff --git a/man/tm_a_mmrm.Rd b/man/tm_a_mmrm.Rd index 470557355e..d6f03fe982 100644 --- a/man/tm_a_mmrm.Rd +++ b/man/tm_a_mmrm.Rd @@ -36,23 +36,23 @@ tm_a_mmrm( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the analysis variable.} -\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying +\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object specifying the variable name for subject id.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{visit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{visit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{visit} variable. Must be a factor in \code{dataname}.} -\item{cov_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cov_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the covariates variables.} \item{arm_ref_comp}{optional, (\code{list})\cr If specified it must be a named list with each element corresponding to @@ -61,13 +61,13 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} -\item{method}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{method}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the adjustment method.} -\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{plot_height}{optional, (\code{numeric})\cr a vector of length three with \code{c(value, min, max)}. Specifies the diff --git a/man/tm_g_ci.Rd b/man/tm_g_ci.Rd index 624fc3a0ad..8aacafccea 100644 --- a/man/tm_g_ci.Rd +++ b/man/tm_g_ci.Rd @@ -30,7 +30,7 @@ tm_g_ci( \item{stat}{(\code{character})\cr statistic to plot. Options are \code{"mean"} and \code{"median"}.} -\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{plot_height}{optional, (\code{numeric})\cr a vector of length three with \code{c(value, min, max)}. Specifies the diff --git a/man/tm_g_forest_rsp.Rd b/man/tm_g_forest_rsp.Rd index bad2c0d4c5..3525a20a62 100644 --- a/man/tm_g_forest_rsp.Rd +++ b/man/tm_g_forest_rsp.Rd @@ -35,7 +35,7 @@ tm_g_forest_rsp( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, @@ -47,22 +47,22 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} -\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the analysis variable.} -\item{subgroup_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{subgroup_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as the default subgroups.} -\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of +\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr names of the variables for stratified analysis.} \item{fixed_symbol_size}{(\code{logical})\cr When (\code{TRUE}), the same symbol size is used for plotting each estimate. Otherwise, the symbol size will be proportional to the sample size in each each subgroup.} -\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{default_responses}{(\code{list} or \code{character})\cr defines diff --git a/man/tm_g_forest_tte.Rd b/man/tm_g_forest_tte.Rd index 397d0c9fc4..d6ce1bad6d 100644 --- a/man/tm_g_forest_tte.Rd +++ b/man/tm_g_forest_tte.Rd @@ -38,7 +38,7 @@ tm_g_forest_tte( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, @@ -50,25 +50,25 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{subgroup_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{subgroup_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as the default subgroups.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} -\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of +\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr names of the variables for stratified analysis.} -\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the analysis variable.} -\item{cnsr_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cnsr_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the censoring variable.} -\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the confidence level, each within range of (0, 1).} -\item{time_unit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +\item{time_unit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the time unit variable.} \item{fixed_symbol_size}{(\code{logical})\cr When (\code{TRUE}), the same symbol size is used for plotting each estimate. diff --git a/man/tm_g_ipp.Rd b/man/tm_g_ipp.Rd index 302b658c20..4464242ded 100644 --- a/man/tm_g_ipp.Rd +++ b/man/tm_g_ipp.Rd @@ -41,28 +41,28 @@ tm_g_ipp( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable values that can be used as arm variable.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} -\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying +\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object specifying the variable name for subject id.} -\item{visit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{visit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{visit} variable. Must be a factor in \code{dataname}.} -\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the analysis variable.} -\item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the analysis unit variable.} \item{base_var}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Please use the \code{baseline_var} argument instead.} -\item{baseline_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{baseline_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable values that can be used as \code{baseline_var}.} \item{add_baseline_hline}{(\code{logical})\cr whether a horizontal line should be added to the plot at baseline y-value.} diff --git a/man/tm_g_km.Rd b/man/tm_g_km.Rd index 45471899f2..eb51167d69 100644 --- a/man/tm_g_km.Rd +++ b/man/tm_g_km.Rd @@ -36,7 +36,7 @@ tm_g_km( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, @@ -48,25 +48,25 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} -\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of +\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr names of the variables for stratified analysis.} -\item{facet_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{facet_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for names of variable that can be used for plot faceting.} -\item{time_unit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +\item{time_unit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the time unit variable.} -\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the analysis variable.} -\item{cnsr_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cnsr_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the censoring variable.} -\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{plot_height}{optional, (\code{numeric})\cr a vector of length three with \code{c(value, min, max)}. Specifies the diff --git a/man/tm_g_lineplot.Rd b/man/tm_g_lineplot.Rd index 456da73514..681d10c06a 100644 --- a/man/tm_g_lineplot.Rd +++ b/man/tm_g_lineplot.Rd @@ -52,12 +52,12 @@ tm_g_lineplot( \item{y_unit}{(\code{character} or \code{NA})\cr \code{y_unit} variable name.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} \item{param}{(\code{character})\cr parameter to filter the data by.} -\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{interval}{(\code{character} or \code{NULL})\cr names of the statistics that will be plotted as intervals. diff --git a/man/tm_g_pp_adverse_events.Rd b/man/tm_g_pp_adverse_events.Rd index dc1fcc4573..2e1f4ee24f 100644 --- a/man/tm_g_pp_adverse_events.Rd +++ b/man/tm_g_pp_adverse_events.Rd @@ -33,25 +33,25 @@ tm_g_pp_adverse_events( \item{patient_col}{(\code{character})\cr name of patient ID variable.} -\item{aeterm}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{aeterm}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{AETERM} variable from \code{dataname}.} -\item{tox_grade}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{tox_grade}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{AETOXGR} variable from \code{dataname}.} -\item{causality}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{causality}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{AEREL} variable from \code{dataname}.} -\item{outcome}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{outcome}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{AEOUT} variable from \code{dataname}.} -\item{action}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{action}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{AEACN} variable from \code{dataname}.} -\item{time}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{time}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{ASTDY} variable from \code{dataname}.} -\item{decod}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{decod}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{AEDECOD} variable from \code{dataname}.} \item{font_size}{(\code{numeric})\cr numeric vector of length 3 of current, minimum and maximum font size values.} diff --git a/man/tm_g_pp_patient_timeline.Rd b/man/tm_g_pp_patient_timeline.Rd index 1656f61da1..93496df644 100644 --- a/man/tm_g_pp_patient_timeline.Rd +++ b/man/tm_g_pp_patient_timeline.Rd @@ -39,34 +39,34 @@ tm_g_pp_patient_timeline( \item{patient_col}{(\code{character})\cr name of patient ID variable.} -\item{aeterm}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{aeterm}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{AETERM} variable from \code{dataname}.} -\item{cmdecod}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cmdecod}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{CMDECOD} variable from \code{dataname_adcm}.} -\item{aetime_start}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{aetime_start}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{ASTDTM} variable from \code{dataname_adae}.} -\item{aetime_end}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{aetime_end}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{AENDTM} variable from \code{dataname_adae}.} -\item{dstime_start}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{dstime_start}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{CMASTDTM} variable from \code{dataname_adcm}.} -\item{dstime_end}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{dstime_end}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{CMAENDTM} variable from \code{dataname_adcm}.} -\item{aerelday_start}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +\item{aerelday_start}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{ASTDY} variable from \code{dataname_adae}.} -\item{aerelday_end}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +\item{aerelday_end}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{AENDY} variable from \code{dataname_adae}.} -\item{dsrelday_start}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +\item{dsrelday_start}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{ASTDY} variable from \code{dataname_adcm}.} -\item{dsrelday_end}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +\item{dsrelday_end}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{AENDY} variable from \code{dataname_adcm}.} \item{font_size}{(\code{numeric})\cr numeric vector of length 3 of current, minimum and maximum font size values.} diff --git a/man/tm_g_pp_therapy.Rd b/man/tm_g_pp_therapy.Rd index 9a8fc132fc..914eead236 100644 --- a/man/tm_g_pp_therapy.Rd +++ b/man/tm_g_pp_therapy.Rd @@ -36,34 +36,34 @@ tm_g_pp_therapy( \item{patient_col}{(\code{character})\cr name of patient ID variable.} -\item{atirel}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{atirel}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{ATIREL} variable from \code{dataname}.} -\item{cmdecod}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cmdecod}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{CMDECOD} variable from \code{dataname}.} -\item{cmindc}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cmindc}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{CMINDC} variable from \code{dataname}.} -\item{cmdose}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cmdose}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{CMDOSE} variable from \code{dataname}.} -\item{cmtrt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cmtrt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{CMTRT} variable from \code{dataname}.} -\item{cmdosu}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cmdosu}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{CMDOSU} variable from \code{dataname}.} -\item{cmroute}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cmroute}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{CMROUTE} variable from \code{dataname}.} -\item{cmdosfrq}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cmdosfrq}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{CMDOSFRQ} variable from \code{dataname}.} -\item{cmstdy}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cmstdy}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{CMSTDY} variable from \code{dataname}.} -\item{cmendy}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cmendy}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{CMENDY} variable from \code{dataname}.} \item{font_size}{(\code{numeric})\cr numeric vector of length 3 of current, minimum and maximum font size values.} diff --git a/man/tm_g_pp_vitals.Rd b/man/tm_g_pp_vitals.Rd index 94e973b0d1..bea5a275d0 100644 --- a/man/tm_g_pp_vitals.Rd +++ b/man/tm_g_pp_vitals.Rd @@ -30,15 +30,15 @@ tm_g_pp_vitals( \item{patient_col}{(\code{character})\cr name of patient ID variable.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} \item{aval}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Please use the \code{aval_var} argument instead.} -\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the analysis variable.} -\item{xaxis}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{xaxis}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the time variable from \code{dataname} to be put on the plot x-axis.} \item{font_size}{(\code{numeric})\cr numeric vector of length 3 of current, minimum and maximum font size values.} diff --git a/man/tm_t_abnormality.Rd b/man/tm_t_abnormality.Rd index c19b152539..087a2a3d77 100644 --- a/man/tm_t_abnormality.Rd +++ b/man/tm_t_abnormality.Rd @@ -39,31 +39,31 @@ tm_t_abnormality( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{by_vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{by_vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names used to split the summary by rows.} -\item{grade}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr +\item{grade}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used to specify the abnormality grade. Variable must be factor.} \item{abnormal}{(\verb{named list})\cr defined by user to indicate what abnormalities are to be displayed.} -\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying +\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object specifying the variable name for subject id.} -\item{baseline_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr +\item{baseline_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr variable for baseline abnormality grade.} -\item{treatment_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr on +\item{treatment_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr on treatment flag variable.} -\item{treatment_flag}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr value +\item{treatment_flag}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr value indicating on treatment records in \code{treatment_flag_var}.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} diff --git a/man/tm_t_abnormality_by_worst_grade.Rd b/man/tm_t_abnormality_by_worst_grade.Rd index 7c2fd82879..fc31aca6f6 100644 --- a/man/tm_t_abnormality_by_worst_grade.Rd +++ b/man/tm_t_abnormality_by_worst_grade.Rd @@ -38,30 +38,30 @@ tm_t_abnormality_by_worst_grade( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying +\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object specifying the variable name for subject id.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} -\item{atoxgr_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr +\item{atoxgr_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as Analysis Toxicity Grade.} -\item{worst_high_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr +\item{worst_high_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as Worst High Grade flag.} -\item{worst_low_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr +\item{worst_low_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as Worst Low Grade flag.} -\item{worst_flag_indicator}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr +\item{worst_flag_indicator}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr value indicating worst grade.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} diff --git a/man/tm_t_ancova.Rd b/man/tm_t_ancova.Rd index 0aa525348b..37f6915035 100644 --- a/man/tm_t_ancova.Rd +++ b/man/tm_t_ancova.Rd @@ -32,7 +32,7 @@ tm_t_ancova( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, @@ -44,10 +44,10 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the analysis variable.} -\item{cov_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cov_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the covariates variables.} \item{include_interact}{(\code{logical})\cr whether an interaction term should be included in the model.} @@ -59,13 +59,13 @@ with arm. If the interaction is not needed, the default option is \code{NULL}.} to select the specific \code{ANCOVA} results when interact_var is discrete. If the interaction is not needed, the default option is \code{FALSE}.} -\item{avisit}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr value of analysis +\item{avisit}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr value of analysis visit \code{AVISIT} of interest.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} -\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. diff --git a/man/tm_t_binary_outcome.Rd b/man/tm_t_binary_outcome.Rd index 3b6386f8f8..f61313024e 100644 --- a/man/tm_t_binary_outcome.Rd +++ b/man/tm_t_binary_outcome.Rd @@ -36,7 +36,7 @@ tm_t_binary_outcome( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, @@ -48,16 +48,16 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} -\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of +\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr names of the variables for stratified analysis.} -\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the analysis variable.} -\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{default_responses}{(\code{list} or \code{character})\cr defines diff --git a/man/tm_t_coxreg.Rd b/man/tm_t_coxreg.Rd index 2387e68be7..8bde57a3cf 100644 --- a/man/tm_t_coxreg.Rd +++ b/man/tm_t_coxreg.Rd @@ -34,7 +34,7 @@ tm_t_coxreg( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, @@ -46,19 +46,19 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} -\item{cov_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cov_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the covariates variables.} -\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of +\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr names of the variables for stratified analysis.} -\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the analysis variable.} -\item{cnsr_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cnsr_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the censoring variable.} \item{multivariate}{(\code{logical})\cr if \code{FALSE}, the univariable approach is used instead of the @@ -68,7 +68,7 @@ multi-variable model.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. diff --git a/man/tm_t_events.Rd b/man/tm_t_events.Rd index d56dd71f67..4a28261ed3 100644 --- a/man/tm_t_events.Rd +++ b/man/tm_t_events.Rd @@ -34,16 +34,16 @@ tm_t_events( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{hlt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable +\item{hlt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr name of the variable with high level term for events.} -\item{llt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable +\item{llt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr name of the variable with low level term for events.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} diff --git a/man/tm_t_events_by_grade.Rd b/man/tm_t_events_by_grade.Rd index 6aa2fa025d..380441b1ca 100644 --- a/man/tm_t_events_by_grade.Rd +++ b/man/tm_t_events_by_grade.Rd @@ -34,16 +34,16 @@ tm_t_events_by_grade( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{hlt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable +\item{hlt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr name of the variable with high level term for events.} -\item{llt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable +\item{llt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr name of the variable with low level term for events.} \item{grade}{(\code{character})\cr name of the severity level variable.} diff --git a/man/tm_t_events_patyear.Rd b/man/tm_t_events_patyear.Rd index e104bcf9f2..d0909842b3 100644 --- a/man/tm_t_events_patyear.Rd +++ b/man/tm_t_events_patyear.Rd @@ -34,22 +34,22 @@ tm_t_events_patyear( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{events_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{events_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the variable with all event counts.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} -\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the analysis variable.} -\item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the analysis unit variable.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} @@ -62,7 +62,7 @@ apply in all modules, run \code{set_default_total_label("new_default")}.} in character or factor variables in the data. Defaults to \code{""}. To set a default \code{na_level} to apply in all modules, run \code{set_default_na_str("new_default")}.} -\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{drop_arm_levels}{(\code{logical})\cr whether to drop unused levels of \code{arm_var}. If \code{TRUE}, \code{arm_var} levels are diff --git a/man/tm_t_events_summary.Rd b/man/tm_t_events_summary.Rd index e1aad8c8a5..cfe36d2f38 100644 --- a/man/tm_t_events_summary.Rd +++ b/man/tm_t_events_summary.Rd @@ -40,33 +40,33 @@ tm_t_events_summary( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{flag_var_anl}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}} or \code{NULL})\cr +\item{flag_var_anl}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{NULL})\cr vector with names of flag variables from \code{dataset} used to count adverse event sub-groups (e.g. Serious events, Related events, etc.). Variable labels are used as table row names if they exist.} -\item{flag_var_aesi}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}} or \code{NULL})\cr +\item{flag_var_aesi}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{NULL})\cr vector with names of flag variables from \code{dataset} used to count adverse event special interest groups. All flag variables must be of type \code{logical}. Variable labels are used as table row names if they exist.} -\item{dthfl_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +\item{dthfl_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as death flag variable. Records with `"Y"`` are summarized in the table row for "Total number of deaths".} -\item{dcsreas_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +\item{dcsreas_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as study discontinuation reason variable. Records with \code{"ADVERSE EVENTS"} are summarized in the table row for "Total number of patients withdrawn from study due to an AE".} -\item{llt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable +\item{llt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr name of the variable with low level term for events.} -\item{aeseq_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr variable for +\item{aeseq_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr variable for adverse events sequence number from \code{dataset}. Used for counting total number of events.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} diff --git a/man/tm_t_exposure.Rd b/man/tm_t_exposure.Rd index 269ff014d0..ea2ce20817 100644 --- a/man/tm_t_exposure.Rd +++ b/man/tm_t_exposure.Rd @@ -38,31 +38,31 @@ tm_t_exposure( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{row_by_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr +\item{row_by_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used to split rows.} -\item{col_by_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr +\item{col_by_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used to split columns.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} \item{paramcd_label}{(\code{character})\cr the column from the dataset where the value will be used to label the argument \code{paramcd}.} -\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying +\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object specifying the variable name for subject id.} -\item{parcat}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr +\item{parcat}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for parameter category values.} -\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the analysis variable.} -\item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the analysis unit variable.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} diff --git a/man/tm_t_logistic.Rd b/man/tm_t_logistic.Rd index 4c095bbccd..7e6289e2ae 100644 --- a/man/tm_t_logistic.Rd +++ b/man/tm_t_logistic.Rd @@ -29,7 +29,7 @@ tm_t_logistic( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}} or \code{NULL})\cr object +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{NULL})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. This defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, the second variable will be nested under the first variable. If \code{NULL}, no arm/treatment variable is included in the @@ -41,16 +41,16 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} -\item{cov_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cov_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the covariates variables.} -\item{avalc_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{avalc_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the analysis variable (categorical).} -\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{conf_level}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the confidence level, each within range of (0, 1).} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. diff --git a/man/tm_t_mult_events.Rd b/man/tm_t_mult_events.Rd index 3609d27d49..c330f2daaa 100644 --- a/man/tm_t_mult_events.Rd +++ b/man/tm_t_mult_events.Rd @@ -30,20 +30,20 @@ tm_t_mult_events( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{seq_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{seq_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as analysis sequence number variable. Used for counting the unique number of events.} -\item{hlt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable +\item{hlt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr name of the variable with high level term for events.} -\item{llt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable +\item{llt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr name of the variable with low level term for events.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} diff --git a/man/tm_t_pp_basic_info.Rd b/man/tm_t_pp_basic_info.Rd index eec7520422..3a8cbd7311 100644 --- a/man/tm_t_pp_basic_info.Rd +++ b/man/tm_t_pp_basic_info.Rd @@ -20,7 +20,7 @@ tm_t_pp_basic_info( \item{patient_col}{(\code{character})\cr name of patient ID variable.} -\item{vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variables from \code{dataname} to show in the table.} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. diff --git a/man/tm_t_pp_laboratory.Rd b/man/tm_t_pp_laboratory.Rd index 4e6e2f9683..5cee5537bf 100644 --- a/man/tm_t_pp_laboratory.Rd +++ b/man/tm_t_pp_laboratory.Rd @@ -30,26 +30,26 @@ tm_t_pp_laboratory( \item{patient_col}{(\code{character})\cr name of patient ID variable.} -\item{timepoints}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{timepoints}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the time variable from \code{dataname}.} \item{aval}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Please use the \code{aval_var} argument instead.} -\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the analysis variable.} \item{avalu}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Please use the \code{avalu_var} argument instead.} -\item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{avalu_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the analysis unit variable.} -\item{param}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{param}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{PARAM} variable from \code{dataname}.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} -\item{anrind}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{anrind}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{ANRIND} variable from \code{dataname}. Variable should have the following 3 levels: \code{"HIGH"}, \code{"LOW"}, and \code{"NORMAL"}.} diff --git a/man/tm_t_pp_medical_history.Rd b/man/tm_t_pp_medical_history.Rd index 80f2645138..8a86715808 100644 --- a/man/tm_t_pp_medical_history.Rd +++ b/man/tm_t_pp_medical_history.Rd @@ -25,13 +25,13 @@ tm_t_pp_medical_history( \item{patient_col}{(\code{character})\cr name of patient ID variable.} -\item{mhterm}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{mhterm}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{MHTERM} variable from \code{dataname}.} -\item{mhbodsys}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{mhbodsys}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{MHBODSYS} variable from \code{dataname}.} -\item{mhdistat}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{mhdistat}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{MHDISTAT} variable from \code{dataname}.} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. diff --git a/man/tm_t_pp_prior_medication.Rd b/man/tm_t_pp_prior_medication.Rd index 1220c9a8f4..8bc56b9b99 100644 --- a/man/tm_t_pp_prior_medication.Rd +++ b/man/tm_t_pp_prior_medication.Rd @@ -26,16 +26,16 @@ tm_t_pp_prior_medication( \item{patient_col}{(\code{character})\cr name of patient ID variable.} -\item{atirel}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{atirel}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{ATIREL} variable from \code{dataname}.} -\item{cmdecod}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cmdecod}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{CMDECOD} variable from \code{dataname}.} -\item{cmindc}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cmindc}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{CMINDC} variable from \code{dataname}.} -\item{cmstdy}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cmstdy}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the \code{CMSTDY} variable from \code{dataname}.} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. diff --git a/man/tm_t_shift_by_arm.Rd b/man/tm_t_shift_by_arm.Rd index e83138160c..30e072cd3d 100644 --- a/man/tm_t_shift_by_arm.Rd +++ b/man/tm_t_shift_by_arm.Rd @@ -35,31 +35,31 @@ tm_t_shift_by_arm( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} -\item{visit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{visit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{visit} variable. Must be a factor in \code{dataname}.} -\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the analysis variable.} \item{base_var}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Please use the \code{baseline_var} argument instead.} -\item{baseline_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{baseline_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable values that can be used as \code{baseline_var}.} -\item{treatment_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr on +\item{treatment_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr on treatment flag variable.} -\item{treatment_flag}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr value +\item{treatment_flag}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr value indicating on treatment records in \code{treatment_flag_var}.} \item{useNA}{(\code{character})\cr whether missing data (\code{NA}) should be displayed as a level.} diff --git a/man/tm_t_shift_by_arm_by_worst.Rd b/man/tm_t_shift_by_arm_by_worst.Rd index 2b8b2f2fd0..6eae9c7b10 100644 --- a/man/tm_t_shift_by_arm_by_worst.Rd +++ b/man/tm_t_shift_by_arm_by_worst.Rd @@ -35,32 +35,32 @@ tm_t_shift_by_arm_by_worst( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} -\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the analysis variable.} \item{base_var}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Please use the \code{baseline_var} argument instead.} -\item{baseline_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{baseline_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable values that can be used as \code{baseline_var}.} -\item{worst_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +\item{worst_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as worst flag variable.} \item{worst_flag}{(\code{character})\cr value indicating worst analysis indicator level.} -\item{treatment_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr on +\item{treatment_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr on treatment flag variable.} -\item{treatment_flag}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr value +\item{treatment_flag}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr value indicating on treatment records in \code{treatment_flag_var}.} \item{useNA}{(\code{character})\cr whether missing data (\code{NA}) should be displayed as a level.} diff --git a/man/tm_t_shift_by_grade.Rd b/man/tm_t_shift_by_grade.Rd index e7e4e7d3c9..f93f46d215 100644 --- a/man/tm_t_shift_by_grade.Rd +++ b/man/tm_t_shift_by_grade.Rd @@ -44,32 +44,32 @@ tm_t_shift_by_grade( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{visit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{visit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{visit} variable. Must be a factor in \code{dataname}.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} -\item{worst_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +\item{worst_flag_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as worst flag variable.} -\item{worst_flag_indicator}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr +\item{worst_flag_indicator}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr value indicating worst grade.} -\item{anl_toxgrade_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr +\item{anl_toxgrade_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr variable for analysis toxicity grade.} -\item{base_toxgrade_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr +\item{base_toxgrade_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr variable for baseline toxicity grade.} -\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying +\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object specifying the variable name for subject id.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} diff --git a/man/tm_t_smq.Rd b/man/tm_t_smq.Rd index ab5f6338d2..5efd8dbde6 100644 --- a/man/tm_t_smq.Rd +++ b/man/tm_t_smq.Rd @@ -33,16 +33,16 @@ tm_t_smq( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying +\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object specifying the variable name for subject id.} -\item{llt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr name of the variable +\item{llt}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr name of the variable with low level term for events.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} @@ -66,10 +66,10 @@ default \code{na_level} to apply in all modules, run \code{set_default_na_str("n \item{smq_varlabel}{(\code{character})\cr label to use for new column \code{SMQ} created by \code{\link[tern:h_stack_by_baskets]{tern::h_stack_by_baskets()}}.} -\item{baskets}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{baskets}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected options for standardized/customized queries.} -\item{scopes}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{scopes}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices for the scopes of standardized queries.} \item{pre_output}{optional, (\code{shiny.tag})\cr with text placed before the output to put the output into context. diff --git a/man/tm_t_summary.Rd b/man/tm_t_summary.Rd index 416f9d7605..e43dc9a94d 100644 --- a/man/tm_t_summary.Rd +++ b/man/tm_t_summary.Rd @@ -31,13 +31,13 @@ tm_t_summary( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{summarize_vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of +\item{summarize_vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr names of the variables that should be summarized.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} diff --git a/man/tm_t_summary_by.Rd b/man/tm_t_summary_by.Rd index 26409f4e55..713e889a52 100644 --- a/man/tm_t_summary_by.Rd +++ b/man/tm_t_summary_by.Rd @@ -38,22 +38,22 @@ tm_t_summary_by( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, second variable will be nested under the first variable.} -\item{by_vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{by_vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names used to split the summary by rows.} -\item{summarize_vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of +\item{summarize_vars}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr names of the variables that should be summarized.} -\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object specifying +\item{id_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object specifying the variable name for subject id.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} \item{add_total}{(\code{logical})\cr whether to include column with total number of patients.} diff --git a/man/tm_t_tte.Rd b/man/tm_t_tte.Rd index dcf2930a6b..2b6082a3cf 100644 --- a/man/tm_t_tte.Rd +++ b/man/tm_t_tte.Rd @@ -41,7 +41,7 @@ tm_t_tte( \item{parentname}{(\code{character})\cr parent analysis data used in teal module, usually this refers to \code{ADSL}.} -\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{arm_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for variable names that can be used as \code{arm_var}. It defines the grouping variable(s) in the results table. If there are two elements selected for \code{arm_var}, @@ -53,16 +53,16 @@ with delayed \code{\link[teal.transform:variable_choices]{teal.transform::variab with the elements named \code{ref} and \code{comp} that the defined the default reference and comparison arms when the arm variable is changed.} -\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{paramcd}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the parameter code variable from \code{dataname}.} -\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr names of +\item{strata_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr names of the variables for stratified analysis.} -\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with +\item{aval_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the analysis variable.} -\item{cnsr_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object with all +\item{cnsr_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for the censoring variable.} \item{conf_level_coxph}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and @@ -74,7 +74,7 @@ pre-selected option for confidence level, each within range of (0, 1).} \item{time_points}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and preselected option for time points that can be used in \code{\link[tern:survival_timepoint]{tern::surv_timepoint()}}.} -\item{time_unit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}} or \code{\link[teal.transform:data_extract_spec]{teal.transform::data_extract_spec()}})\cr object +\item{time_unit_var}{(\code{\link[teal.transform:choices_selected]{teal.transform::choices_selected()}})\cr object with all available choices and pre-selected option for the time unit variable.} \item{event_desc_var}{(\code{character} or \code{\link[=data_extract_spec]{data_extract_spec()}})\cr variable name with the event description From 37974c323471eef89d3efc8f6d8e169deef93863 Mon Sep 17 00:00:00 2001 From: shajoezhu Date: Thu, 22 Feb 2024 22:21:15 +0000 Subject: [PATCH 106/126] [skip actions] Bump version to 0.8.16.9096 --- DESCRIPTION | 4 ++-- NEWS.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 09a74523a8..7c7c0b22ef 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: teal.modules.clinical Title: 'teal' Modules for Standard Clinical Outputs -Version: 0.8.16.9095 -Date: 2024-02-21 +Version: 0.8.16.9096 +Date: 2024-02-22 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), person("Jana", "Stoilova", , "jana.stoilova@roche.com", role = "aut"), diff --git a/NEWS.md b/NEWS.md index 742657adaa..8725e60ec7 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9095 +# teal.modules.clinical 0.8.16.9096 ### Breaking Changes * Adapted all modules to use `teal_data` objects. From c2db189c2761805929b7d3ccfca9e244fe2280ec Mon Sep 17 00:00:00 2001 From: Joe Zhu Date: Mon, 26 Feb 2024 09:19:17 +0800 Subject: [PATCH 107/126] Cran release 0.9.0 [skip vbump] (#1070) close #920 --------- Signed-off-by: Joe Zhu --- DESCRIPTION | 7 +++++-- NEWS.md | 4 ++-- man/teal.modules.clinical.Rd | 3 +++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 7c7c0b22ef..8e79e35f0e 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,10 +1,13 @@ Package: teal.modules.clinical Title: 'teal' Modules for Standard Clinical Outputs -Version: 0.8.16.9096 +Version: 0.9.0 Date: 2024-02-22 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), person("Jana", "Stoilova", , "jana.stoilova@roche.com", role = "aut"), + person("Davide", "Garolini", , "davide.garolini@roche.com", role = "aut"), + person("Emily", "de la Rua", , "emily.de_la_rua@contractors.roche.com", role = "aut"), + person("Abinaya", "Yogasekaram", , "abinaya.yogasekaram@contractors.roche.com", role = "aut"), person("Mahmoud", "Hallal", , "mahmoud.hallal@roche.com", role = "aut"), person("Dawid", "Kaledkowski", , "dawid.kaledkowski@roche.com", role = "aut"), person("Rosemary", "Li", , "li.yaqiong@gene.com", role = "aut"), @@ -19,7 +22,7 @@ Authors@R: c( ) Description: Provides user-friendly tools for creating and customizing clinical trial reports. By leveraging the 'teal' framework, this - package provides teal modules to easily create an interactive panel + package provides 'teal' modules to easily create an interactive panel that allows for seamless adjustments to data presentation, thereby streamlining the creation of detailed and accurate reports. License: Apache License 2.0 diff --git a/NEWS.md b/NEWS.md index 8725e60ec7..5ea56f47ea 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# teal.modules.clinical 0.8.16.9096 +# teal.modules.clinical 0.9.0 ### Breaking Changes * Adapted all modules to use `teal_data` objects. @@ -23,7 +23,7 @@ * Replaced usage of deprecated `summarize_vars` function with `analyze_vars`. * Reduced package dependencies (removed `tidyr`, `rlang`, `magrittr` and `styler`). -# teal.modules.clinical 0.8.16.9010 +# teal.modules.clinical 0.8.16 ### Enhancements * Added more informative error message when grade mapping error occurs in `tm_t_abnormality_by_worst_grade`. diff --git a/man/teal.modules.clinical.Rd b/man/teal.modules.clinical.Rd index 2329b15534..60ab5a1c8d 100644 --- a/man/teal.modules.clinical.Rd +++ b/man/teal.modules.clinical.Rd @@ -24,6 +24,9 @@ Useful links: Authors: \itemize{ \item Jana Stoilova \email{jana.stoilova@roche.com} + \item Davide Garolini \email{davide.garolini@roche.com} + \item Emily de la Rua \email{emily.de_la_rua@contractors.roche.com} + \item Abinaya Yogasekaram \email{abinaya.yogasekaram@contractors.roche.com} \item Mahmoud Hallal \email{mahmoud.hallal@roche.com} \item Dawid Kaledkowski \email{dawid.kaledkowski@roche.com} \item Rosemary Li \email{li.yaqiong@gene.com} From 3de6f016ac717fcb23716b8ce0da64da8bd4d5c5 Mon Sep 17 00:00:00 2001 From: insights-engineering-bot Date: Mon, 26 Feb 2024 01:37:53 +0000 Subject: [PATCH 108/126] [skip actions] Bump version to 0.9.0.9000 --- DESCRIPTION | 4 ++-- NEWS.md | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 8e79e35f0e..b7b93e5c54 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: teal.modules.clinical Title: 'teal' Modules for Standard Clinical Outputs -Version: 0.9.0 -Date: 2024-02-22 +Version: 0.9.0.9000 +Date: 2024-02-26 Authors@R: c( person("Joe", "Zhu", , "joe.zhu@roche.com", role = c("aut", "cre")), person("Jana", "Stoilova", , "jana.stoilova@roche.com", role = "aut"), diff --git a/NEWS.md b/NEWS.md index 5ea56f47ea..c7026329a7 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,5 @@ +# teal.modules.clinical 0.9.0.9000 + # teal.modules.clinical 0.9.0 ### Breaking Changes From f8645442d19446a6a487a9089035c94bd0d483cd Mon Sep 17 00:00:00 2001 From: Aleksander Chlebowski <114988527+chlebowa@users.noreply.github.com> Date: Mon, 26 Feb 2024 09:48:11 +0100 Subject: [PATCH 109/126] 1077 remove `formatters` (#1079) Closes #1077 Removed `formatters` from dependencies. Replaced calls: - `formatters::var_labels` -> `teal.data::col_labels` - `formatters::var_relabel` -> `teal.data::col_relabel` Adjusted code in vignette that generates example datasets. Rebuilt example datasets. --------- Co-authored-by: Joe Zhu --- .pre-commit-config.yaml | 1 - DESCRIPTION | 3 +- NEWS.md | 3 + R/tm_g_barchart_simple.R | 1 - R/tm_g_forest_rsp.R | 1 - R/tm_g_forest_tte.R | 1 - R/tm_g_pp_patient_timeline.R | 1 - R/tm_t_abnormality.R | 3 +- R/tm_t_abnormality_by_worst_grade.R | 5 +- R/tm_t_ancova.R | 4 +- R/tm_t_binary_outcome.R | 1 - R/tm_t_events.R | 2 +- R/tm_t_events_by_grade.R | 11 ++- R/tm_t_events_summary.R | 7 +- R/tm_t_exposure.R | 7 +- R/tm_t_logistic.R | 4 +- R/tm_t_mult_events.R | 2 +- R/tm_t_pp_medical_history.R | 2 +- R/tm_t_shift_by_grade.R | 12 +-- R/tm_t_smq.R | 2 +- R/tm_t_summary.R | 2 +- R/tm_t_summary_by.R | 4 +- R/utils.R | 2 +- data/tmc_ex_adae.rda | Bin 22948 -> 23120 bytes data/tmc_ex_adaette.rda | Bin 22320 -> 22404 bytes data/tmc_ex_adcm.rda | Bin 18156 -> 18312 bytes data/tmc_ex_adeg.rda | Bin 100924 -> 101024 bytes data/tmc_ex_adex.rda | Bin 9656 -> 9624 bytes data/tmc_ex_adlb.rda | Bin 71228 -> 71332 bytes data/tmc_ex_admh.rda | Bin 15060 -> 15028 bytes data/tmc_ex_adqs.rda | Bin 109036 -> 107628 bytes data/tmc_ex_adrs.rda | Bin 13044 -> 12984 bytes data/tmc_ex_adsl.rda | Bin 8128 -> 8124 bytes data/tmc_ex_adtte.rda | Bin 20848 -> 20684 bytes data/tmc_ex_advs.rda | Bin 106112 -> 109996 bytes man/tm_g_barchart_simple.Rd | 1 - man/tm_g_forest_rsp.Rd | 1 - man/tm_g_forest_tte.Rd | 1 - man/tm_g_pp_patient_timeline.Rd | 1 - man/tm_t_abnormality.Rd | 1 - man/tm_t_abnormality_by_worst_grade.Rd | 1 - man/tm_t_binary_outcome.Rd | 1 - man/tm_t_events_by_grade.Rd | 5 +- man/tm_t_events_summary.Rd | 3 +- man/tm_t_exposure.Rd | 5 +- staged_dependencies.yaml | 3 - tests/testthat/_snaps/tm_t_abnormality.md | 12 +-- .../_snaps/tm_t_abnormality_by_worst_grade.md | 8 +- tests/testthat/_snaps/tm_t_ancova.md | 26 +++--- tests/testthat/_snaps/tm_t_events.md | 10 +-- tests/testthat/_snaps/tm_t_events_by_grade.md | 14 ++-- tests/testthat/_snaps/tm_t_events_summary.md | 4 +- tests/testthat/_snaps/tm_t_exposure.md | 6 +- tests/testthat/_snaps/tm_t_logisitic.md | 8 +- tests/testthat/_snaps/tm_t_mult_events.md | 22 ++--- .../_snaps/tm_t_pp_medical_history.md | 2 +- tests/testthat/_snaps/tm_t_shift_by_grade.md | 24 +++--- tests/testthat/_snaps/tm_t_smq.md | 4 +- tests/testthat/_snaps/tm_t_summary_by.md | 12 +-- vignettes/generate_tmc_test_data.Rmd | 75 ++++++++++-------- 60 files changed, 157 insertions(+), 174 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 710d0e6c68..bfa114f265 100755 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,7 +25,6 @@ repos: - checkmate - dplyr - DT - - formatters - ggplot2 - ggrepel - grid diff --git a/DESCRIPTION b/DESCRIPTION index b7b93e5c54..1db2650a90 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -40,7 +40,6 @@ Imports: checkmate (>= 2.1.0), dplyr (>= 1.0.5), DT (>= 0.13), - formatters (>= 0.5.5), ggplot2 (>= 3.4.0), ggrepel, grid, @@ -77,7 +76,7 @@ VignetteBuilder: Config/Needs/verdepcheck: insightsengineering/teal, insightsengineering/teal.transform, insightsengineering/tern, tidymodels/broom, mllg/checkmate, tidyverse/dplyr, rstudio/DT, - insightsengineering/formatters, tidyverse/ggplot2, slowkow/ggrepel, + tidyverse/ggplot2, slowkow/ggrepel, r-lib/lifecycle, daroczig/logger, tidyverse/magrittr, r-lib/rlang, insightsengineering/rlistings, rstudio/rmarkdown, insightsengineering/rtables, r-lib/scales, rstudio/shiny, diff --git a/NEWS.md b/NEWS.md index c7026329a7..c97c47743c 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,8 @@ # teal.modules.clinical 0.9.0.9000 +### Miscellaneous +* Removed `formatters` from dependencies and replaced the use of its functions relating to variable labels with functions from `teal.data`. + # teal.modules.clinical 0.9.0 ### Breaking Changes diff --git a/R/tm_g_barchart_simple.R b/R/tm_g_barchart_simple.R index 2b44ef2d05..952eac52f6 100644 --- a/R/tm_g_barchart_simple.R +++ b/R/tm_g_barchart_simple.R @@ -18,7 +18,6 @@ #' @examples #' library(nestcolor) #' library(dplyr) -#' library(formatters) #' #' ADSL <- tmc_ex_adsl %>% #' mutate(ITTFL = factor("Y") %>% diff --git a/R/tm_g_forest_rsp.R b/R/tm_g_forest_rsp.R index 6a9a54584d..7ee807f9e2 100644 --- a/R/tm_g_forest_rsp.R +++ b/R/tm_g_forest_rsp.R @@ -201,7 +201,6 @@ template_forest_rsp <- function(dataname = "ANL", #' @examples #' library(nestcolor) #' library(dplyr) -#' library(formatters) #' #' ADSL <- tmc_ex_adsl #' ADRS <- tmc_ex_adrs %>% diff --git a/R/tm_g_forest_tte.R b/R/tm_g_forest_tte.R index e094d14356..d2061f2354 100644 --- a/R/tm_g_forest_tte.R +++ b/R/tm_g_forest_tte.R @@ -208,7 +208,6 @@ template_forest_tte <- function(dataname = "ANL", #' #' @examples #' library(nestcolor) -#' library(formatters) #' #' ADSL <- tmc_ex_adsl #' ADTTE <- tmc_ex_adtte diff --git a/R/tm_g_pp_patient_timeline.R b/R/tm_g_pp_patient_timeline.R index 8da1acdb5c..822f2b4734 100644 --- a/R/tm_g_pp_patient_timeline.R +++ b/R/tm_g_pp_patient_timeline.R @@ -350,7 +350,6 @@ template_patient_timeline <- function(dataname = "ANL", #' @examples #' library(nestcolor) #' library(dplyr) -#' library(formatters) #' #' data <- teal_data() #' data <- within(data, { diff --git a/R/tm_t_abnormality.R b/R/tm_t_abnormality.R index 26b361fc24..cd30a7ece1 100644 --- a/R/tm_t_abnormality.R +++ b/R/tm_t_abnormality.R @@ -157,7 +157,7 @@ template_abnormality <- function(parentname, for (by_var in by_vars) { split_label <- substitute( - expr = formatters::var_labels(dataname, fill = FALSE)[[by_var]], + expr = teal.data::col_labels(dataname, fill = FALSE)[[by_var]], env = list( dataname = as.name(dataname), by_var = by_var @@ -246,7 +246,6 @@ template_abnormality <- function(parentname, #' data <- teal_data() #' data <- within(data, { #' library(dplyr) -#' library(formatters) #' #' ADSL <- tmc_ex_adsl #' ADLB <- tmc_ex_adlb %>% diff --git a/R/tm_t_abnormality_by_worst_grade.R b/R/tm_t_abnormality_by_worst_grade.R index 82ce8e4041..9e530ae980 100644 --- a/R/tm_t_abnormality_by_worst_grade.R +++ b/R/tm_t_abnormality_by_worst_grade.R @@ -48,7 +48,7 @@ template_abnormality_by_worst_grade <- function(parentname, # nolint data_list <- add_expr( data_list, substitute( - expr = anl_labels <- formatters::var_labels(df, fill = FALSE), + expr = anl_labels <- teal.data::col_labels(df, fill = FALSE), env = list( df = as.name(dataname) ) @@ -95,7 +95,7 @@ template_abnormality_by_worst_grade <- function(parentname, # nolint data_list <- add_expr( data_list, quote( - expr = formatters::var_labels(anl) <- c( + expr = teal.data::col_labels(anl) <- c( anl_labels, GRADE_DIR = " Direction of Abnormality", GRADE_ANL = "Highest Grade" @@ -252,7 +252,6 @@ template_abnormality_by_worst_grade <- function(parentname, # nolint #' #' @examples #' library(dplyr) -#' library(formatters) #' #' ADSL <- tmc_ex_adsl #' ADLB <- tmc_ex_adlb %>% diff --git a/R/tm_t_ancova.R b/R/tm_t_ancova.R index c7a76aa42a..d526238c93 100644 --- a/R/tm_t_ancova.R +++ b/R/tm_t_ancova.R @@ -187,7 +187,7 @@ template_ancova <- function(dataname = "ANL", visit_var, split_fun = split_fun, label_pos = "topleft", - split_label = formatters::var_labels(dataname[visit_var], fill = TRUE) + split_label = teal.data::col_labels(dataname[visit_var], fill = TRUE) ), env = list( arm_var = arm_var, @@ -206,7 +206,7 @@ template_ancova <- function(dataname = "ANL", paramcd_var, split_fun = split_fun, label_pos = "topleft", - split_label = formatters::var_labels(dataname[paramcd_var], fill = TRUE) + split_label = teal.data::col_labels(dataname[paramcd_var], fill = TRUE) ), env = list( paramcd_var = paramcd_var, diff --git a/R/tm_t_binary_outcome.R b/R/tm_t_binary_outcome.R index 805423d96e..53ce623986 100644 --- a/R/tm_t_binary_outcome.R +++ b/R/tm_t_binary_outcome.R @@ -344,7 +344,6 @@ template_binary_outcome <- function(dataname, #' #' @examples #' library(dplyr) -#' library(formatters) #' #' ADSL <- tmc_ex_adsl #' ADRS <- tmc_ex_adrs %>% diff --git a/R/tm_t_events.R b/R/tm_t_events.R index c7bc04173c..44afed0765 100644 --- a/R/tm_t_events.R +++ b/R/tm_t_events.R @@ -239,7 +239,7 @@ template_events <- function(dataname, indent_mod = -1L, split_fun = split_fun, label_pos = "topleft", - split_label = formatters::var_labels(dataname[hlt]) + split_label = teal.data::col_labels(dataname[hlt]) ) %>% summarize_num_patients( var = "USUBJID", diff --git a/R/tm_t_events_by_grade.R b/R/tm_t_events_by_grade.R index d6520eeb6f..bf435e8da0 100644 --- a/R/tm_t_events_by_grade.R +++ b/R/tm_t_events_by_grade.R @@ -170,7 +170,7 @@ template_events_by_grade <- function(dataname, indent_mod = -1L, split_fun = split_fun(grade), label_pos = "topleft", - split_label = formatters::var_labels(dataname[term_var]) + split_label = teal.data::col_labels(dataname[term_var]) ) %>% summarize_num_patients( var = id, @@ -207,7 +207,7 @@ template_events_by_grade <- function(dataname, indent_mod = -1L, split_fun = split_fun(grade), label_pos = "topleft", - split_label = formatters::var_labels(dataname[hlt]) + split_label = teal.data::col_labels(dataname[hlt]) ) %>% summarize_occurrences_by_grade( var = grade, @@ -221,7 +221,7 @@ template_events_by_grade <- function(dataname, indent_mod = -1L, split_fun = split_fun(grade), label_pos = "topleft", - split_label = formatters::var_labels(dataname[llt]) + split_label = teal.data::col_labels(dataname[llt]) ) %>% summarize_num_patients( var = id, @@ -797,14 +797,13 @@ template_events_col_by_grade <- function(dataname, #' @examples #' data <- teal_data() #' data <- within(data, { -#' library(formatters) #' library(dplyr) #' #' ADSL <- tmc_ex_adsl -#' lbls_adae <- var_labels(tmc_ex_adae) +#' lbls_adae <- col_labels(tmc_ex_adae) #' ADAE <- tmc_ex_adae %>% #' mutate_if(is.character, as.factor) #' be certain of having factors -#' var_labels(ADAE) <- lbls_adae +#' col_labels(ADAE) <- lbls_adae #' }) #' #' datanames <- c("ADSL", "ADAE") diff --git a/R/tm_t_events_summary.R b/R/tm_t_events_summary.R index 5598562ceb..89b07555d4 100644 --- a/R/tm_t_events_summary.R +++ b/R/tm_t_events_summary.R @@ -126,7 +126,7 @@ template_events_summary <- function(anl_name, data_list <- add_expr( data_list, substitute( - flag_var_anl_label <- formatters::var_labels(anl[, flag_var_anl], fill = FALSE), + flag_var_anl_label <- teal.data::col_labels(anl[, flag_var_anl], fill = FALSE), env = list(flag_var_anl = flag_var_anl) ) ) @@ -136,7 +136,7 @@ template_events_summary <- function(anl_name, data_list <- add_expr( data_list, substitute( - flag_var_aesi_label <- formatters::var_labels(anl[, flag_var_aesi], fill = FALSE), + flag_var_aesi_label <- teal.data::col_labels(anl[, flag_var_aesi], fill = FALSE), env = list(flag_var_aesi = flag_var_aesi) ) ) @@ -503,7 +503,6 @@ template_events_summary <- function(anl_name, #' #' @examples #' library(dplyr) -#' library(formatters) #' #' data <- teal_data() #' data <- within(data, { @@ -534,7 +533,7 @@ template_events_summary <- function(anl_name, #' TMP_SMQ02 = aesi_label("Y.9.9.9.9/Z.9.9.9.9 AESI"), #' TMP_CQ01 = aesi_label(dat[["CQ01NAM"]]) #' ) -#' var_labels(dat)[names(column_labels)] <- as.character(column_labels) +#' col_labels(dat)[names(column_labels)] <- as.character(column_labels) #' dat #' } #' diff --git a/R/tm_t_exposure.R b/R/tm_t_exposure.R index 59db38cee6..7d50481095 100644 --- a/R/tm_t_exposure.R +++ b/R/tm_t_exposure.R @@ -158,7 +158,7 @@ template_exposure <- function(parentname, ) split_label <- substitute( - expr = formatters::var_labels(dataname[row_by_var], fill = TRUE), + expr = teal.data::col_labels(dataname[row_by_var], fill = TRUE), env = list( dataname = as.name(dataname), row_by_var = row_by_var @@ -229,7 +229,6 @@ template_exposure <- function(parentname, #' #' @examples #' library(dplyr) -#' library(formatters) #' #' data <- teal_data() #' data <- within(data, { @@ -237,7 +236,7 @@ template_exposure <- function(parentname, #' ADEX <- tmc_ex_adex #' #' set.seed(1, kind = "Mersenne-Twister") -#' labels <- var_labels(ADEX, fill = FALSE) +#' labels <- col_labels(ADEX, fill = FALSE) #' ADEX <- ADEX %>% #' distinct(USUBJID, .keep_all = TRUE) %>% #' mutate( @@ -247,7 +246,7 @@ template_exposure <- function(parentname, #' AVALU = "Days" #' ) %>% #' bind_rows(ADEX) -#' var_labels(ADEX) <- labels +#' col_labels(ADEX) <- labels #' }) #' #' datanames <- c("ADSL", "ADEX") diff --git a/R/tm_t_logistic.R b/R/tm_t_logistic.R index ef523e1786..35499c1c66 100644 --- a/R/tm_t_logistic.R +++ b/R/tm_t_logistic.R @@ -57,7 +57,7 @@ template_logistic <- function(dataname, ref_arm_val <- paste(ref_arm, collapse = "/") y$arm_lab <- substitute( - expr = arm_var_lab <- formatters::var_labels(anl[arm_var], fill = FALSE), + expr = arm_var_lab <- teal.data::col_labels(anl[arm_var], fill = FALSE), env = list(anl = as.name(dataname), arm_var = arm_var) ) @@ -107,7 +107,7 @@ template_logistic <- function(dataname, if (!is.null(arm_var)) { y$relabel <- substitute( - expr = formatters::var_labels(ANL[arm_var]) <- arm_var_lab, # nolint + expr = teal.data::col_labels(ANL[arm_var]) <- arm_var_lab, # nolint env = list(arm_var = arm_var) ) } diff --git a/R/tm_t_mult_events.R b/R/tm_t_mult_events.R index a76f5dfd47..f73c70d8e1 100644 --- a/R/tm_t_mult_events.R +++ b/R/tm_t_mult_events.R @@ -188,7 +188,7 @@ template_mult_events <- function(dataname, indent_mod = indent_mod, split_fun = split_fun, label_pos = "topleft", - split_label = formatters::var_labels(dataname[hlt_new]) + split_label = teal.data::col_labels(dataname[hlt_new]) ), env = list( hlt = hlt_new, diff --git a/R/tm_t_pp_medical_history.R b/R/tm_t_pp_medical_history.R index 2cbc7477da..1e74987407 100644 --- a/R/tm_t_pp_medical_history.R +++ b/R/tm_t_pp_medical_history.R @@ -28,7 +28,7 @@ template_medical_history <- function(dataname = "ANL", table_list <- add_expr( list(), substitute(expr = { - labels <- formatters::var_labels(dataname, fill = FALSE)[c(mhbodsys_char, mhterm_char, mhdistat_char)] + labels <- teal.data::col_labels(dataname, fill = FALSE)[c(mhbodsys_char, mhterm_char, mhdistat_char)] mhbodsys_label <- labels[mhbodsys_char] result_raw <- diff --git a/R/tm_t_shift_by_grade.R b/R/tm_t_shift_by_grade.R index 43e70abd99..20c6da39b8 100644 --- a/R/tm_t_shift_by_grade.R +++ b/R/tm_t_shift_by_grade.R @@ -267,12 +267,12 @@ template_shift_by_grade <- function(parentname, substitute( expr = { column_labels <- list( - PARAMCD = formatters::var_labels(dataname, fill = FALSE)[[paramcd]], - AVISIT = formatters::var_labels(dataname, fill = FALSE)[[visit_var]], + PARAMCD = teal.data::col_labels(dataname, fill = FALSE)[[paramcd]], + AVISIT = teal.data::col_labels(dataname, fill = FALSE)[[visit_var]], ATOXGR_GP = dplyr::if_else(by_visit_fl, "Grade at Visit", "Post-baseline Grade"), BTOXGR_GP = "Baseline Grade" ) - formatters::var_labels(dataname)[names(column_labels)] <- as.character(column_labels) + teal.data::col_labels(dataname)[names(column_labels)] <- as.character(column_labels) dataname }, env = list( @@ -326,7 +326,7 @@ template_shift_by_grade <- function(parentname, ) split_label <- substitute( - expr = formatters::var_labels(dataname, fill = FALSE)[[paramcd]], + expr = teal.data::col_labels(dataname, fill = FALSE)[[paramcd]], env = list( dataname = as.name("anl"), paramcd = paramcd @@ -351,7 +351,7 @@ template_shift_by_grade <- function(parentname, if (by_visit_fl) { split_label <- substitute( - expr = formatters::var_labels(dataname, fill = FALSE)[[visit_var]], + expr = teal.data::col_labels(dataname, fill = FALSE)[[visit_var]], env = list( dataname = as.name("anl"), visit_var = visit_var @@ -382,7 +382,7 @@ template_shift_by_grade <- function(parentname, } split_label <- substitute( - expr = formatters::var_labels(dataname, fill = FALSE)[[by_var_gp]], + expr = teal.data::col_labels(dataname, fill = FALSE)[[by_var_gp]], env = list( dataname = as.name("anl"), by_var_gp = by_var_gp diff --git a/R/tm_t_smq.R b/R/tm_t_smq.R index b3c78abc68..e46cf1466c 100644 --- a/R/tm_t_smq.R +++ b/R/tm_t_smq.R @@ -199,7 +199,7 @@ template_smq <- function(dataname, ) split_label <- substitute( - expr = formatters::var_labels(dataname, fill = FALSE)[["SMQ"]], + expr = teal.data::col_labels(dataname, fill = FALSE)[["SMQ"]], env = list( dataname = as.name("anl") ) diff --git a/R/tm_t_summary.R b/R/tm_t_summary.R index 7dc65b3039..76c0a395fc 100644 --- a/R/tm_t_summary.R +++ b/R/tm_t_summary.R @@ -513,7 +513,7 @@ srv_summary <- function(id, validate_checks() summarize_vars <- merged$anl_input_r()$columns_source$summarize_vars - var_labels <- formatters::var_labels(data()[[dataname]][, summarize_vars, drop = FALSE]) + var_labels <- teal.data::col_labels(data()[[dataname]][, summarize_vars, drop = FALSE]) my_calls <- template_summary( dataname = "ANL", parentname = "ANL_ADSL", diff --git a/R/tm_t_summary_by.R b/R/tm_t_summary_by.R index e00a149959..8cfd2ea128 100644 --- a/R/tm_t_summary_by.R +++ b/R/tm_t_summary_by.R @@ -164,7 +164,7 @@ template_summary_by <- function(parentname, for (by_var in by_vars) { split_label <- substitute( - expr = formatters::var_labels(dataname, fill = FALSE)[[by_var]], + expr = teal.data::col_labels(dataname, fill = FALSE)[[by_var]], env = list( dataname = as.name(dataname), by_var = by_var @@ -684,7 +684,7 @@ srv_summary_by <- function(id, all_q <- shiny::reactive({ validate_checks() summarize_vars <- as.vector(merged$anl_input_r()$columns_source$summarize_vars) - var_labels <- formatters::var_labels(merged$anl_q()[[dataname]][, summarize_vars, drop = FALSE]) + var_labels <- teal.data::col_labels(merged$anl_q()[[dataname]][, summarize_vars, drop = FALSE]) my_calls <- template_summary_by( parentname = "ANL_ADSL", diff --git a/R/utils.R b/R/utils.R index 20f7b6339f..3182e0d26d 100644 --- a/R/utils.R +++ b/R/utils.R @@ -65,7 +65,7 @@ get_var_labels <- function(datasets, dataname, vars) { lifecycle::deprecate_warn( when = "0.8.14", what = "get_var_labels()", - with = "formatters::var_labels()", + with = "teal.data::col_labels()", details = "teal.modules.clinical won't export any utility functions except those which are necessary to prepare shiny app." ) diff --git a/data/tmc_ex_adae.rda b/data/tmc_ex_adae.rda index 3e59a1d6b34f37e35d9baa9edd4bb635213f79bb..8b967f29f169aa0cd606378100c4f5b2bb006b86 100644 GIT binary patch literal 23120 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 fcvQ&2UKVgRpfklJ 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 H00CKAD7ncd literal 22320 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
%&=G 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 X0h{p-jefTNJ}?c70ssI200CKA6;FL_ literal 18156 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

o8eba?f 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

uJNILBxS!ZB485+)`QV1S(iOzd1Dq^8eBSE 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 w;Lpe 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 diff --git a/data/tmc_ex_adex.rda b/data/tmc_ex_adex.rda index 388ac8704ddfae0c5ca278f4f9f20c61897776c7..9841e9d4ad076abf8ed9bb146f37cfadbd9e2813 100644 GIT binary patch literal 9624 zcmV;JC1=|GH+ooF0004LBHlIv03iV!0000G&sfaiCK4rDT>vQ&2UKVgRpfklJ zX`5N??lWQ-aN$^%=S23Cid~p$T44^ftT9`$LpRfbcNj~q((G=zk&b{%;U6UE9Y&e4 zNb`FA3K2r#30RB9BLV8- zO#%1r(vY58ir?=^oOGxTv1_WJF)>e1Lt>H zI|a9~k3YCPCYg+W&g6H{qT1M*ea^fB;Ybu6qh_ZoTuelax+&JmWk5&Hrk)6fvF*mLAP-~%B9w~6tthP(_jz^n3or;k`O zS1_;scag8K-W(#&Sa>%Kj|j0cJ9Ly+TV)UcY(c01#NECu6wwd6k^tznOzX?;Cr*a+ zwirmqhT}wm?j&n*4B%VCZ*JVN-^j+Gv@y@O-$VljAF=r_RWDRb9aj_6RR=mG z`Z>hjTrBX$rBJr6R);l<^7#6)<>+`g9h{cmF^G{?>0#E(ae{Q`)2#25BtCd74Bz35 z?BfowI55A)D|&NRz&G`}Pa#aWR$7f zi@g`1X?x_USOh)`xio|Y>OwpzZ$x-?T&HH3E zt6FjXF#qJ?(!jBb6s8-NpTXK3L3_v`Jxzh4GrIDdCNSu|q91^Nr)?j5 z@r_bMTGu_k4wt}1Yomv#o2UR(yaX6z&VcZs@H1ct`I&9r zb#tyPM*CDAAEuP~b@+uV)d9vrE3pUKm?a|X;iEkdkt20Yv}he#A{ol5;}rg4y-EyU zH_wVL5UZb6myQdURVwFY!iU9FrJRQN<5qG411)G1smS_ z#8ar~QBtsrAwK?6i$YNUIcgcT6bukG>1#x~r{=lyNBIP4uVH7?(T|Z0^;^nk zQD`m(v#T5oeH_0XUlRLGVeqLGX<`s!%aPF-3nWQkx`yr;BX(!fqS#|1?ZLY~zX zt@GBXyy#qCI&ru)G4qZ^Y<{V$mn=Pf#2=M3Tc2V&Pa3?(Q~hACI>D=wsLVx{C73sR z@)ueAc;1KYBgNenBw`cp>fARnk=!}=W0ocf)TJXr+LehxT9t^Z;`d$eUn$qGWhKTn>p|Rb z0&hScp-ta4B7K)r1~`l76d4iYMi3iq9WU z5Nxg-Smx##W#}taDwgwErC8Ed%RHCO`M7A=3`FD8h_!C}iHTuD=!i@#R^g zG1?%Mk4mf!j#{O-0XBMHM8Y^^DvgwxeX5n>-~wG)^>EQUxGGKZu?)*de9Vs4FG7l0 z6bfn3$;OfEYuLbc$2oIG{`jx_+R3*=*y$POFSdkumC@6o9~QlV%rd)@4d7I^i%Q~q zps6a^wi@za@1u%f$}F4H83Jz)(HBvXW( zC}i`liV_G?_8qQ2&}@nV=eFw!g7s+tMps22Y%%n|X(^*ic4vb} zJ%H&AG?`(mx9;T%0Mbc# zq|iSoT+>$Tv*!+Ydy>~S^Jk^KvQV0e*`PHbEo6uJC{)2^bV*MhFulG+OH02czzku3A%su|C;JeuwW z&s$|y&$A2`Q_fydSOG=?%D!*k=X9sZwU)TaiCY5r(4FftYHFt7@B9z1Cj%M(Y7f0% zi38Yw5a@HWS|&Z(5B}G=i9QwJlrnDt4dFfar@I z)?E&|F=OxrtpP>)xWT$damvbS|rMhqW>8e3|m0^k9 zI_O@kZ1st|D4yl76~q_^3nmvCt;UYwTH$CCwJ#6VvRv+9)F5wG`rKtwpZcIvh2G4k zYQs@717xm_4RJMnAwkM8X>q>!wga z0P`nt9dq{N6SH7s1KP!$A3;Wp;8~=#2gnKLn6*bHYuMF|MxFlmS$^sA39iU z`}sa_>Q(v4kGx>|X~#QhKxHraFTgy1X2&45GBrj-?-`1$RH{_yF^YoD!oYDf>mUG1 zUJqroD{B8|p%onn0mW+6Fy_Q61K~>WC}=AdSE^zQow&yL^?{P1&$EmC!d9X2rK;Dh ziT+$PtGIwea?fU)7;lvQSUQu5z{%BK!C-_7SHW z@HK#8#Y-_nR?1$NQfpP#TG>fscT(IZSMOT6h$nW$>))Ig_G9g%HH`T#L26UG=^qOg zns=+!%hbH9gX-Wyn2ejKt3XRa-BNvJoq^1l=VqPxYeEw7M$=SxOYbTjo%}g+HY|&l zWkp){v9LLiNemB>-SK!R?2Yt2)b>m;qR(f$R$1*4g&Q8iOKiHO;v^0bsOO3$e@=@0 z;t?8Qk)s1F5>x{%ke2j6<%ii;^L7iS{v9ZGJ@`$I{-x3CCMullIHOX z!hLNrsfX?$`!w~2!^PTTu*_ny-`~00i^RV#RD+rScx138BnAa?Hiih_n} zRcFl?=jV|fhMTD{il3HbOBD@X_X7#)l(R7iX#$ZitGH0Fst$L6=^&g`OFL0I zT-*gO8e|mS;Scctv>Fuy)oA5S)@N}AHl)YK*%wKbr50{T#%D*dg6_mWau8!_Auq;k zr54Lq-vtvYhz%G#r|s;C3~OG*Kaka-?7(dZt&AdC7amK9>XId^m_qVj_%*i?yU!nA zraomRe;_W_@Blvy392%d&o`d7+bJHgZe+U6sgDf0O{OJEtQec^+D;_9UA^6oBwd z|De$WEVD3C@2Q+w3pLS<*BLU07dhEkYJhrGd(q@rey^k)?T~+QAm`R(-K$lVe`?8RW-Vd0n=e(*E6WrwiTBiVCm?uQrv;eCU(0dLz^(d%OQ`dr4dQg*im zidr3C@@7#C-vcBem(Id=3G;o#=S2hDlUx(tA5Y@J-fBe=;fK_AyIzZkp1ese8*t%8CVK0A#DDV!`rEgZGZu5DP@ zK=kTe`)LVv2(RV$gNsrB94=OW5BdUju9SC zc(_{IwWD2UMaZ4tf%J#bU~Ihi=fh4)1HJ;p9rY2zwZ zifQx|J5Z2`Z6VjdI|?{HuYVIJC(5)iT#${dTvqqPH4{tdO#QtKu0#%76$QUPk>B95 zNW4fee_)d?w`PT%?_Z7+9anH%q6&F3ZYhtw7r4USeqHy*wA;BTdF(o(D0x=&&0&xo zhg%{#=Yke%sUoeE4FGD#GnkT^zng1#uf@9tCqb7DG8qM~2+U5n$S00tU!L?~m`(`+ z0X&Ev-inV@|Ft;~L>FwV1V~xOMXY*o-TXA(6GQkq$vDzDTTT96 z2kHZ(W`t+Fdz-vea7Gczn~|QUm%eLfyKQ}`Ajq4XOkb}n2=wlev7p82LALpuQOB8Z zs9UpYiIp;AGeKJ9a!C3B@mmd{lk`&i@J`S%Heuu!K)!-E<5twEjiP3|PYN?CGred> zz*wP>M@uw^g!mv3UDGY);09c!ZEL&5mw*ZB6;{6+igqHMAd9PKa;xTGa$;F30*cEw z&}td2F2z9tq7JDYxBgs!F~5V$CCGJ9)GB3RhXv)KKKFc3lgU=b5V}g#3*F!83bp;k zMS^p0q9XKgiyD^XCr1UoPmi41&Q!YVtXey-uJ46sP2R z(&T6Aj{UGV%4rbhj}W4F^ad^;w_kyRaM(i7eic^#X7w|#+c zb$fEnWQ_Y4de`-qd(8J<^Dm?pfH3PmK&s1~-A_Tm(bW_ZKult844Q@leYD^=+CA;y z2AbS|nRzqt7R``!vD9dwBqa?(pkyDgo@cb3wJm_0t}FFJUdI@AhzH3@bgP{lBvq&o zk4*F1;wocwqhoZFffm}=0Nhf1?R`ok=1QEiC?dBN`KJeY1`!=0t7b>v8F`UH+=U*e zvMyiZ9s$1jc1KLQsGpD<0ZaanwH~C#=Tuc@wm`(vWiKMVzKcD)1D}#NrkaaS)2eww z2m_aJbDAik(>w^40PypSjIXdd!fnw@ylBTOa~`5UwxoyrlESwrI{C;-Y5V})!o7cg zg8a*}K?9ro@hB)7#cu;#5tE?0Va`-J*(UeQcQ~ZI-K}wgM$ZJykXoX7?~MUb3Tlrs z6Tx?_V0qsvH9bQd)MWuhZd1Mtp7)gwdF-*8X_r&cdQ`k`WSIN~jKUK8tzNMU-{LE`3Ny6R04&VbPSM<+Uax5_NDzhTdD8yb5|0+rxO4E*Sz zQGK-ojQyuqj$}c3+0*rXABB##Q4tiIGV0o_3|;S~FOQlos$#X_^MNdHC(<>fsX`*j zl%z7F`+80SNtB8;)5dn-Ax;?K87-mqa4sC{O`~^i`OBvD@X>5&9F~!!6JJ$ua?nUi@7$7x4t}+DZH<*Z}QOcrh6!fB^YJ6kyS+*9p=KeFL&i zFh&}?O*TQ2Bb8IAqVZgE1cy@Ln3i-D!X&Rxg%iq*VYW(?1fxwbdNyM(h@*)fZk2`l z{f(?`d34`2zaIS4sw=`S-%q*(J!IPnbFc_{HCYTEe;iuI>VSc#&FPq*5neMpM_ zTabrlb07}bew1X3G>^Ii*T&mu%z;JoP-9I>cQ^i+rWEh7j*GNZSYGO%BWOysBFsg4 zDZXi35Z6yP#7H2#GNjYf??Y>zkTiXxiFba{qP*NG@n_Pzs{IRtaXbxVwj4&xKBZ=m z9Eo57dxtK&gvs$lweowvBrXYVwyzq}WIjgehU&TVESKV!;1{+VQNp3*cr`ebO_&R^ z+x70ez}j~Zmg_x~+~V}VzbB1knP&vEevHz0^tTUs{@v7EU}*5v)z1G>9^70+1;c^1 z+4_md0xq*c{A>H)4+pP@+l5f;-%E059qhW}O#-prOG&je&9Cf4PCdEqq$r}R0LP;i$9bB4*qB#}gG zSvapUs>*{tOG~BmJCx9yc6%J`zQuN^$)Bb1v}q}g$q{F7D)Etk8tQud!!TA4 zEDd(!>%;eVEEt=2rdjS1=;xwNdg3D1q%VahtA7ljCxMxD{qjkX z^O|!60I!s(6NhiKl0JF^3UUvgKYQ5nd1J=@FKmD!e@aazD=?S#uEoUaGir5LGPtKr zi3vOHI{bM3^+dwQ)cFwPS{JATwFQtcbokt!$8&tGfqOC(I&43@Ry3QdST(3HZ(CgG zXaq&aI)@7M0hy1W(RDuIVUfHLV_we=4gS-jyy?j-_#u4JjoRFN^=Jo}ZspG}eT43H z7B^!Gj-hxt3zEU@SqIrFSs~dd_{jph0}$ph-$ZQiMzeP(rDJ|rUryHgMH&ko>xzej z(I7c9U{&@Fbb4m~Pi~V}r!?QE*v6r@I8FdUe5@X~7B6+Z+y$QAZ&%O7yv{sXcM9;X zF98Q4m`Jw3wk+QR4wOhnJY#bOe@N0UIH|XfoTFrNigfU&=(4+SA{Aw(=im>q@lqx> zV{`7VNy^_nFn`mWKzDwZGhp{lo@PMbfK&LnMl}(`BlI(Z?@Fz%NWD-R1U1FP-x~dfm*D*5-0>HMqlklIZji1V`$m4{O>U9{2PWhd`ayeQZU76d3nKVC;jEd*XW#{!QXVqy-u61=L z#X{WmVPB<1R;nGDrl9;7NaF1y#W75(oP<05O7nvC-saQ>2_*bip-_vtS$*d zxgrQ-ym8lxC>NkQ{Dd-+^1}O^v)D`IMe;Ja_SN;h(_}!Oy3qeN&}0foMZYm08MAPE z17dt}*fzsW9vUN(pF7vRT`Q*~F5GWtK9ej%59#GG$n-JG{}qw>OQW8~tuQkAGro?u z3Z^(#y4&Dq58)^G4;yLxLCPHju#ls2x%U&D;ySJVW?oM|B#=Zd`}cIl(Mki8Na2Z8cwYs=dINNJ>uIJU30oRq$*iDpo*=ehblwa32M=S;P% zbvuvO(%6%ftvfYZHg(dPhbO2ZhzhJb#tp2e9qk*$oWo52(~YA888H#4{L(XuP+9;{ zE}^RqFuv}&uEC`ay!E>AK$SmM9L*^XD#$?5P3iH%=LdW59HaM}TP3le?<#&`gOJoY z1e1&UUru!3PX|zORzjke!8+k*vO0AnZTw4tzJG`T7@}}ktaeS!*wPP%Y=@@rKkG>P zt$!YeQ5T?j;D~tNr6r7zTnbYsp#BMfSaB;66a!Zt_;2Oy{$_lfy7Q6DRZplK7c{!? zoWq*M*g{O? zyGgW20!W|Hl@`jg!nI`1uE>y&fxZ)Ccfyz%OY~1E8*@jjA!7`sar#XGFBWTD3iBx1 z4V*y%$;*7joc!e!x4rMN4K)0izXFfYDG8ri&rD~hU!kSV!rGvlEUG7TuI?I4E;kU1to1HbN}Y)erzZ~{PU~^E z9W-b{^COd1O=25)7ujPjiS8oVCJ{8+0JElBizkjkUR_y{aJn=!h0_cfy!@2XyHwMr zWPLb}wt8&2pY#XYH*%6I)f|sr?0?9rtFr>kP(JY;a6o^U6_kGp)uJv=Dvb^otpmzA zEcC-r=vh?hg&po%6y0s3Y`6 zzMY8t7kVR#Y6`0cNCd&W%0qTk+n?>t=N;|DD=yohvrh@6YPAR(0Du-&FKPTjLIdMS zM1H%AlJ029YyxH}_pQ!;!hqp}72A2qyVO0bA=>iyKc;}YLoKknR7Mpdy#lN-*fmSq@2&0vqYaw0-4Znm+$V_sOf?o)t zmYD>d+PNeuC9e#XNBlV5uL;hP@7R(1mSBh@2y4d9$!JrHA`V7}>x2$3F+%yX^6iY7kRpY zhWg;D`nc^tT~5sEH@@dHtQ}ZK)`)fMrlh6SlDRk0joBu~`?J0T5)F7heO1lz$M;v( zG>}!nW{9PzSSs}`Ce)&wBaUc=V(BGyE&XpBPvtESf&L@97q7J1uxrTcKvnzNf1HDa z#v6+;Z321Hl7_1_!<%DHjz`CeS60=qowz-^5u7JKvw$yxankVmA#ysg{Pv)q(>l{) zFDh{v(5o4eggA1XD@}$~vkt{d&Wa}K?wm8Ao%35ag!FTZI5wwq%$J|nDyjv}R%}e-UOC}sxy|?4g#s_aS@$mi8L-q| z8)|LG^e|mA!MKNCD)&c*2;if&aI%37g}>Myov*y#`E~+Y^dP>}zYd_r+IapDOxe5 zrwsmfsqAu4^aK*F$0_Nk+GmA4Wt{_*zm#0yxc1Czp2uAuCu>-w;J%Ilkv29iTM1T{ z-Jx-%Xe^722n zH&eXlyT=JWL=<)}f~xw6N5x4B{(g!kZ$uqA&oCOEu%S&a3+IEC$Qe%8X&()+oXt4P zQ|zSFTVJ2iC=%I^s1r{ZT>Fx+4{Ti)(*lu!^+$MwWgCHhJU zq*F1w50YEP#liD&^Po+>dGztME+`7ipcZq3bfmnB$ympxOYAX8hEm5qE&y;uH>a_} zu+nnTrDK~r=t%5X)DO$a#eSL3)(Agwh1A>;KAGv{YbBTN;F3Ad!JD;EjC%Vrv90A6 zF4N!hFeKTNJ{H_bHS75=^Mkwoz~95=4+szR9n-;DN0BX0t^y|D#JV9xIdwaZ(1}NY zM4dXGJw>`GcwOeO@RQXviZrx8&O>G5Mzz3)W-23f@nK-6FYr4cps~JC?@yc^%-g

UUuyb6OjKpP!^{bUW0XT4 zvuKb)3p#Aogg31sCailr{|at1j5Vn)`P()YnI$+?iKfn})G_8Tu7q{D#qT`QIDI8x z8yYy`25aBvzs-hSe3)u7)<2Qhw8u{BQhUUGvB{cLm!0av2AZtZaBnO1D@@(u?_kqy z_^B;s(1X}!$1FS&tld~?s-rd##=VSOT~#cm@Rq)(q3ogONwkvFm%W7 za1Y1{9KIH91pY1y337r6+j4$)W{r1Y4k(R_AOT-R<2ukt;J)MMFI12e_=D@$b2d~?gZtpD7?Y09pR~ONE+Z8*vP}4I0x!|| zlJvKn1MAJp#TL$Wgs&5bpvA!@t32V=)UBcX%vQ&2UKVgRpfklJ zUb}0Y*Nam(57p9}vK1-^1o+4Z^XcarKv(RSXw9Y-jz!-{gz z8mqIVU`YaefFnKpnC%yILwT_~tFp&-Q>>MdMVKDvLz$HnmFg#P!dLfuGs_@^ud&La z+ujM>X1N1GUDSOIsr8DEZ%bq2)AkuGyKv`Q#t)wMrMlr}SDOt5-ueEs*^Lf_s9gN; zZ0C%VMvwI!9t5Z%8|84tgle4(JYXbw1K&Kuib62!@@oXPYb}jqW7MdP&T~p!}9taWqVujceB0!2d>FHr!w=IgcSOkaM!R=s5x(|1t8EnEv+( z7@_>aS%tq}|E3+p5VZD*zi>EP8ybLCJ~KiOno6JbD)o!1NGG8d8e#I@>)31Zy-e1*%vR^2(h1E=rX3mm!*&@<;`Cu5DiiA6Tiidqzw`hY^h`l88%QrqxaTq z&oQrwTn^lQSDl|Dyow;k7U>{))NL%>XM!ctL9hwe=6~(!%BIQSa#_Z$tT(lE{qnIN za#Bg)Xcgnv6_ImhqqCqKZgx1SvjnXeb;%d_Q1Zh?fWT%g90@Tedbdr#;P?FNv^;p}@qRtuiZj4=)f?%3${sMTfOc-L|+H@JYNL zr2)7@omM}$?7%-Ui_V3j1Z*l~9ec-^!5&GQ8fn1m^~p*;HV$Z`c9~#v$YrbHrhI1# zm{bwD-<29d@5(IFIyZ*9nEdZ}vWo!&o~?;KeLntw*Z3XI%h@9pjN+VSyY9`mPKVQDL@u=Fp6Z-xB^g zmJ+uG*^v=H`g%@i)zG3w!(>^JNb4EmwnCJ%b0WE9wc%2OwS%On(mC1%Ug}X&SYVlB zSyav=96Q$twL{c{b>H#v97Z1k2WnWdVRVbOy$JJx$g2~MBVMH}4&4JI)iKtHI|B$y z48FCxSNhExl$pM>%*_JCD(##^yy8JLrHJ*Gn-YIcpFGZS^>pb|9W+q5`8TgV)Q4nD{3D<~TRsQS)bhg5oF=#v*V0}=ZFMYE=R zQ#akI_6}t;k??DR+1ZUr;-*Occ1z0a;CD^AicJe(GL-0D*{LT1hHBDHQVlLGeVH+(p&kTrG(a1_M!K-Y_&Ao0cu%RM_FLU8 znDZq}-{zqOba4wF5%Stdls(QLp@6v&p5bqU!_e$T@t1oj4Po%caTJ{Fq1{0W@YG%O z^D(P`nsJZ>YGVnzpZSx{ajn3K2GNNfzM7Fyz_H6^2o6y+e6rM>-aSX24BBIa-}@ZV zPVWj~tNd*+R#M1!^CD~ETgtcahDoi8f6bjYXHWbTKsrsz(02@Cbl%?{QUg) zXgT%j0$%Luh19T;B8F&4AlqOQ)q{3B^@?~M_u2U<^7Z+akVP39q6zxY`xe86R836= zeV78BSLna~re&CUL z^SA1HJ2}u^rOMGAHgY+R2Mk~#I(msftyMu(pTckX*|U=axNa$;R6{7=wv&pUph!E6 zz;|djEfmPYQL(HA3C-0tT8jenOxW%3TY_{tevI6+SQeHeQ5qagR>qG88dU_VUk2TX zL!0LODmywm-fvI-?1oa19+UpDJimCFc%MwN}K2M{d|{y?T)PJE_;K)A`V_ za(keTFH8aenEI~!Hnv3@9FArr4RAM+lv`0L09W^g8iSwHi9}I5a*MQ8GRvLUKN=3N z$K#De@7c7a7Be;3p0Oy3sii6iEt28JoROs@OQp*a23x{s9pl;i65)6O_f}i=HY81= zP-w1nG3}o>4F9~QA zj+bZy`)D<5?wUFXM^cQR=OaVNReX;7+Bx)OgFEUSON=&7QcclC>oeCUU2W!{%t02f z@I3j=!vXjp0{Y7J{)SW$K-t7QooIyBUczo#2yb3Vy4Wf8vC^mra#O62XOaOqouPja z8v(Rg%!-wNpky*?q+>&hN()CgV(w4wxq?_d_d8+w5TrT!|5>RHQPYgW{-yE&P6NC$b=(KOX=#RgUX=s>Juk*1`T< zc!OxnI?xf0c3fX~NTL?vJ`Wr>qto(YnZ26WZe`HlwCf@&S1~3AyrxW`{T}D~z5wTb$(4__nf5gaCKbCCtdl z206jx&s6(*85vVf)}xnqg3$M;VZ+AQ%y+BK=7fr|0ElA9M(3Kb|7MG+Tqp1zV7pXAGwV*r68S5t}Hw_zFh@9r6 zEIhiGWmb%PXItOdm2&He3)g=EMFs9+EJmXAgwd!c5FN=$rYfQ56HpzO}g>5!LGnw z_dH@R@CnOPFD#-Q&5*i5rUyuN@Fs9zw|7Pp1hfa+29c1W#D_`)jl(@1t2S=>6FE%t z#!GJo(M3ppZc!CI+~+QC>oHSe&tY6p6ISy27RlWe-S_fI2G3v!8SQf%RnQ4E=9 zX5nHVRD}p=!!IRVH9|Zxug8qjBol%Mgf`Hwa{^_h8dT&YY+qlOX=ukuoU8}{ekhGs z(RY{&ce5Daj3j5@y{>U_VgE{;2tF4`NC@C^vQf@y0`NgY=)KTt_g&+2%<5i%mV4W8 ze%dLQ(`zR0OSA{k-&?Dpy)A-wZzSuC)jN5?nhnKb`lGtOC5};5?-IFYN@mtEOeh^K zE;kK@TO7zWK1O~I(UlL;2MFATShJV4N50MnLH;fU@B|QWTw0sG+yzU^v2VTx zzpTus?4L)pB6rtn0V{Z<)3+qpXSb3WwI)t7yvU8oU|qd`hNJb?umM-aj@TpFzJ`!GcrvbnH-ab z1HG|_<-~fn=^vyMKhD2TG@_V`G$<*_z8t2NECWtq1hIfO6wvWPhqm;p;JYJby;9N{ z@0%~mU-)FnH-GuXEgS-T_pGl3IX{;SGD0(v3xn(WcL^q4NJ7nsaGcE5D`%5v6x&jJ z80;HI@+GZ92DoVN^9$b~$ji3$e!ubA>mQL8ykZX%ld?e@JR&-s*Q&Uhy%m?CmnIt= zaeD3YDdEC(tDa@+r?Nn;kib`W|J6efBWLCyNI7jwa7Gf&+|AZ4-cWuPU4Z_;k@?hm zb>LH4ODT_qWe5m>AsPk#2_`dc7dbb!f0N;4BgRpn5{HtYL9^ET;D>T%(o_>Q#2CUK zzj^Dj18OsJF2h*m5cW+QTRA06T{;6$xSolG%1JqnGfXO>31|?!`lJHWF}L^+_VUv> zipF#Q!?D&%M|s;!s$sm&7~V6c;#zl$b(@hZ`;t?pekv8k!)XE8}jifDo?q}L!lT+}*w zlu^>WhZfPIA%=If)s*WAJX2T$ZDpfdKETI*&`O{v7z_Dbj(YyuH!jpI_6cqJ{t7&Z zpw$_m-`7<3((*WO&i*4HJVOB`WtIE(N139Ryu@=q(t*%g4IYt z=g3PNod+6b^cyv%iLEH7S-qv&&ENGauqi2R>7>HQzrn-G6I5dhDkiatimlhRp7lS{ zz9%Tkx^5x{1~D%m0r2JRNXPSt!NArRjuR4qcJMtRm0lkCO=PeSKPsH7sW`Ti{$g|# z=zCOo4FWG}Rl&18xS?^!CdOz8p^2(B@;+93Ds|l9n=S>vvIRG;v*8#8pg8=Uj`L-) zU|nz2p3za!0lv_}<d`db^mYPiv~D?wN+H?iY}o!(N4=yA<>+W)>mj0 z6ck}(HGembc#r)<(8=4;z)&2YRZR~6Z%i%|Zh)FFbZ2{7G+!FylV3AF>*jZ0tddbH zIc{kVXS{t{3xZ}@i7gl|KefD}jCsFbEx`IWHy2#QfDHUIejk9HS$!NZc^Ep8oPWFp7ryr=7-u!f;Mh2?J*R2R^JI-#fs>8p-P+X9g= z+~OqZyeO?>kF9xs1(;kA`f&tFG```-NaG==Ug3uOGa)n0Uv_;e%HFs!+d=50Dr0r# z=4qN3W)t;{c2Qy74(nAxoMYL)!Eo{zApeqlrnSIdLgIry%bh{rX1P>r-RgY@wyz)C`jq`>jN6dzkAN|E%gd=;ZkE`4 zeMMyU${ED=sT3gml;-CZD-61{_(w+;2~Q;A@WCu1v-Q45ILHanT!c&R*)>1QgQk1I zxLAchHenizBP)^n^w9z0T+;Du3?rT?P#l>_gs-ENU(8E1Ua-+98I9(Rk%ix(E%QQM zz0rI^ZNOH`j?lPseSq2O;Ysfrh(3AGRGTY}S@kTBmIdW^cormCGTi}v% zfD=P7*}Pk2JEw~swZn^XIXN{7q_IFF%6$b3v|GY?aJX_977w`TO4ovE^Vt#}&pH}2 zi4e`m>*L-u@;XYQ642DI$fNY(h{>Qzbewx4*ek1BOd7@16(3?7fxs74JHg>U-G*sl z(x%CxcjdM3HBxKszd;Y0b*?rEoUwZA)}UsI|GVCG zyS@D1B!==H&ck0Q32A87gb>`3+XXF75r4~M!8h>D<0_xT!im^G0cNkkiz?GgpaCIf zN0f3J0}N<7?8!kDx)3WO8IAF*QT3H&pY4pFfJ37q7^DM9FFdpExxq0u9++3@&OaQT8U^oR zl%EJ;P@8yOY}sBDU&<&K(Id8cDb1n06+)uL#R|)5%8CK3>qYM*Z$j?%Z5bNG%z%o_ z_}k-ro6}Th8l$=o6TLKsNY}nkgsOF?w4hmoxBLOK$0CeiX^X1aXH~bO`3CUkjyN1D z6>8EwBis{~!LG*6XZ!WI=>F6t+4gcl@%mV)djOxwmm<-2Wr2-1bTcI`YL-Vvw{$Y~ zTb{u^<^8TaAaY@sedi~z=2J$6gydY-G30AX35c@Pc>_J7|y zh~D*RB{tdZ2F|cXnU*GSU64Fl3p19KDMS=3>47m^{`fAbm^`zk)9}ax*U&I7F~ilU zM+Mg=2t-nFstNqaU@)QO%rjv(Yf3~`Uem=<5tdzi3g0|TM}SV8bR%XL2{&7eWVMz^ z0bz?l5UmZ_u-V5$W?m+q}xZcu#vOkV7( zROvX*ybi$eGfM0cFyGr34bDghY~Wk@HGvU7+302d$3!6WcbI}pZJuVbX64RaM!ctw z2u4qzLo~Wc_OdF&p)A5f)r60kkfB2Zj zP=^&tW`Qs79%o+K>b*H{Mkz%yhqFCyWf4+kak!wAuyU%@upsR~m^VE}v*5+1b{Dx> zeeM$|$kR_!w&#kS#6p@A_Oin_pUJ{TdK4LSA~(IXG8bYsqgW7z) zveXlG#!2>=d`b@ud$VIh3H&=rpp+4ziXO`_W#qObz$!9#lQ@LZ2opB2W`d}3;`BXB zR~0@cY69Ig;yI2q*bI%E(=ZYL2L5PSz!{x}1Q|TpD(dLET)Rj%W);?3b>i3lYo&3J zVBW1wYiVEg$P^HxIz)?bjT7yW=B>9Tu4h=G*NLt2ttJ>nvhAG8P~5xMf>bWGPa;&n z(D|hZU80ryy-&`1>;gUpbmhQ*)@y)@d!;1T6tw`tOHLb!X=g-pKmG;|cD(!a0p621 zVF2CIf2k%hHFNvl@`?qjT@N2yJA5Lc+GYa}*>^gpHLn)Mpov{=rr@a-o(IT7+bS7j zfdPQzAp(UC=Gf(KL)C#!g#KpiI7dh+#0tmJnez3KoptIB1p1%%igL5q8@Uw;^Af(o z8g_ym2Fr}mY|Pl-rPPV9>%?bQ{vpHWSqzE;0n%=Fok@21S5L{KTT>p=DgB+lH{)mS z@}tUO*UU1mW;8bEvAjxe?nn9Ouux0wQY(K`G+Sw2uk!SEE}3u(;ycaJ*a*wIhBA`D zErD5<_^o%MkiKpc&s0XSeHsPZB<~yOV2+^dOFiG`M<%H5n~<|io+6wPll^(5?f%Ll zn0DE7Ud_}GG^)D)G~MMLHsA9I2-`H!En=5ONY8&7>cFe*X<^lSdO9T6L6j!v#Y6au zZ{o>^R-Z9X-9g5(6DLKP1MVFT-z+>eD)=OQCvbJb6D>%u1Gt`#Q|=B~4(_R<5t}rseg1X#V`Kn!*RYn19FHiY6kK zxgs5a>M(ieuh*g+rZy2~lg5J~v{4aEaOxChR0i@?F)vVV9d(tU{HH~LY}D%j1z(DI z#*vzf{iAUC__Gtaq9b??P1-sE{VtAtd1tW3Tg(uS0v9AFHDMT;NwUkvK~vaWr%hsf z2^ZGy-HuCxzHA)Ag%g;&+z$UE{keE1!Z1r{YcQO^CX(hTd?VVPGJFA9oV;5UL-;Ok z0Et}WkZpDo66*r8p}b@5$E<4TD+>9}TZ9p@qFniRbM?nAdhu#&kL%r0m^;O8S1*1g zlmulCtOWNKur$i%Hx2I)_5iUw)&=x*E#FEu+}1Hrx@l`pEcpu2;RgU!X3AqzW-O1w_A z>l6XNFh94bVQpivun{hlBFBlcAC*4D-Iv=bxnAa`{vi4aPE3CJ4uq?bqtWqt(b;F4 zcO_%qD)swTmoF`1B5OEa^oZ>#5y}-ZhmHkRCsi%16-89-hM{3N0f9D`78tmjx^*0L z`R@LynA5WH)P)`;fM?#aOLT$yn<5vI&-`;6!Vzs=JoThJA4e}4WtW*0VOEHlAf_M# zYDz_jb+{)~*v*pZL~z*FiZXdVAq1ParzYkb=60a?)xigC7dbOPZ$q`FdSw`~ptT&+ zMV?_D-0H=-uEIKlf$yuNNja$07(ac2=)8B4EKLCyKa^JSO5;svWj9s+-4H_btXW^J z7D!@gvT}U&7qEoVH?u=OTA_&)PeY+3*-o!Lu&d@e>L{z70FCv-oe zxjFgx zoegnMsix8g9a8Rq9%H@e3*1X}meRY~o($X!`E?1x{!=<>_6Yb2b`leZc!o3Uw{>_= zaK#N9?v_!h9nKlOd7+*hI7Afre}F%8^%JU)7m?;Alc!O?^XLac$9iYmSMKmDIZzDt z&dA3w8pYsqd^brJjXL%J_VI#3nDyK#x|F>O7?}TTK=*d5o$%G2R<*buI=E2Cve3d2 zOo2xY9r7fv9Se$dKvZJ6*8s~6qhLnR>EO#snAfrA!B;Kjtd**J_}zzP!f6Lh9w3r7 zOj;0BlbBc8SZ1CRq()0BJ?YoSG9zhV{N$@T(ETqz7}yerMx{@st=G(crNa)S2#2>o=dD%YuikEY`ZHK( z!zISZKlsAYfpw(;yd#M>LVyQ(T=r`u@bZ|Nqi$Yu-Q*a_Ao185p@Ddp-*lMUD3AM+AAH_DSlKL(y=ICI0HLz6l6DK9L5Q?6&W zr#Jaj^Q#bMPqV2peQ}Rv5;>7BSP`=_YO)FjBxNc7DoTIN1+xugiCkU(V+eMa>^E z`*GEo0QHbezHlJS@RB8%xl{&&HfdcAxsCCqFj{B&{+ygS-I7I?(0vxq^v01i%T*rH z&G1r_Q;9E_Z{$u;pL~hk%`~mtV^EKzp0?7 zxj{253s4MnLm3-w^`K-tz-T#B=8Vn1VFUe28TK0SI^K%1e7RGKW)(_y6BVA~Tk&~N z!Go0WRD*gAx&Ep-A{;ccC)io}R8_>9+N{?h5dU41_g!TVK^NeaIoWV)1ff6ZNku)m z?8@3R?+&jYu5WV<_68GD)D>_vEXF4?mMJ<_x9Koig4XbPyc|I`-gGC^$Ie)Mp%nOK zs7;dT%7>7o=E1ay?aOl19aXOd@=XTIJfa;2hR>Z7)m)5;S7R@H6AzV$SW@o+p+m-? zx>IP#8CCyZB z9B*OJ9t=TV0g8$VqmpLEw}v49_1t69Xw(m%PkOW4&8CBwvi9cYbEASno(Io0k`4-! zk)~dxgUs!>qC3TMwtnu1ywCx8%n}L&(wwsBHbD5G&6?=gOM)8;L0>$o<@e2v=lRT{9L`fQ>bQc=4@6x zb&HQFi>la-1@e-pI|RyLIa2)B50-;fLNU%j8!@SW%1$INJoLwB2bVi)=z=rNBvOLs zr0D^fD%Jy8=^E52;~jsy0T^aHep+m*h+sxJ()&8*JBKQ-`eJdg{0k2E7cgwyN6|o} zt(+a583ZX3L=mh^zl9 uk-H(yjjLXnn?JpytN;LGsw(pU0h3Fj&IACccDrvrFb#_W000000a;q#w2%(~ diff --git a/data/tmc_ex_adlb.rda b/data/tmc_ex_adlb.rda index 3e7eaf3c3241dc5f5f3fb7030b444a801cd50146..5db98e893b4ec8c9cdcce9b504e1f4fc5410b566 100644 GIT binary patch literal 71332 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 Sk73k4Fb#_W000000a;pZ44wc0 literal 71228 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 aqwCTtL~=Em!Ph@lN@&@X$hpMr(ZII7QsK; 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 S#ce-6Fb#_W000000a;ob3bxw- diff --git a/data/tmc_ex_admh.rda b/data/tmc_ex_admh.rda index 520e7749255f5aeb8b7d662cb9fafdcef50ad899..cdc992b9330a24e1bb801812c8c6fe476f7be00f 100644 GIT binary patch literal 15028 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

IMZ{?Pp)wviyi_g6scU<`!gt- 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

g3wnz?c#&Ttg!GM&Rr+Y1_ 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