From c03c2beacdba4de914d5fd50213c7844f7191254 Mon Sep 17 00:00:00 2001 From: LittleBeannie Date: Mon, 10 Aug 2026 10:52:58 -0400 Subject: [PATCH 1/7] Update the R files --- R/boxly.R | 48 ++++++++++++++++--- R/meta_boxly.R | 116 ---------------------------------------------- R/prepare_boxly.R | 49 +++++++++++++++++--- 3 files changed, 84 insertions(+), 129 deletions(-) delete mode 100644 R/meta_boxly.R diff --git a/R/boxly.R b/R/boxly.R index bd49b5d..a5073b8 100644 --- a/R/boxly.R +++ b/R/boxly.R @@ -41,14 +41,50 @@ #' @examples #' # Only run this example in interactive R sessions #' if (interactive()) { -#' library(metalite) +#' analysis_plan <- metalite::plan( +#' analysis = "boxly", +#' population = "apat", +#' observation = "wk12", +#' parameter = "SODIUM;BILI" +#' ) #' -#' meta_boxly( -#' boxly_adsl, -#' boxly_adlb, -#' population_term = "apat", -#' observation_term = "wk12" +#' meta <- metalite::meta_adam( +#' population = boxly_adsl, +#' observation = boxly_adlb #' ) |> +#' metalite::define_plan(analysis_plan) |> +#' metalite::define_population( +#' name = "apat", +#' group = "TRTA", +#' subset = SAFFL == "Y", +#' label = "Safety Population" +#' ) |> +#' metalite::define_observation( +#' name = "wk12", +#' group = "TRTA", +#' var = "PARAM", +#' subset = AVISITN <= 12 & !is.na(CHG), +#' label = "Weeks 0 to 12" +#' ) |> +#' metalite::define_parameter( +#' name = "SODIUM", +#' label = "Sodium (mmol/L)", +#' subset = PARAMCD == "SODIUM" +#' ) |> +#' metalite::define_parameter( +#' name = "BILI", +#' label = "Bilirubin (mg/dL)", +#' subset = PARAMCD == "BILI" +#' ) |> +#' metalite::define_analysis( +#' name = "boxly", +#' label = "Interactive Box Plot", +#' x = "AVISITN", +#' y = "CHG" +#' ) |> +#' metalite::meta_build() +#' +#' meta |> #' prepare_boxly() |> #' boxly() #' } diff --git a/R/meta_boxly.R b/R/meta_boxly.R deleted file mode 100644 index 09e8201..0000000 --- a/R/meta_boxly.R +++ /dev/null @@ -1,116 +0,0 @@ -# Copyright (c) 2023 Merck & Co., Inc., Rahway, NJ, USA and its affiliates. -# All rights reserved. -# -# This file is part of the boxly program. -# -# boxly is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -#' Create an example metadata object -#' -#' @param dataset_adsl ADSL source dataset. -#' @param dataset_param Observation level source dataset for boxplot. -#' @param population_term A character value of population term name. -#' @param population_subset An unquoted condition for selecting the -#' populations from ADSL dataset. -#' @param observation_term A character value of observation term name. -#' @param observation_subset An unquoted condition for selecting the -#' observations from `dataset_param` dataset. -#' @param parameters A chracter vector of parameters defined in `dataset_param$PARAMCD` -#' -#' @return A metalite object. -#' -#' @export -#' -#' @examples -#' -#' meta_boxly( -#' boxly_adsl, -#' boxly_adlb, -#' population_term = "apat", -#' observation_term = "wk12" -#' ) -meta_boxly <- function( - dataset_adsl, - dataset_param, - population_term, - population_subset = SAFFL == "Y", - observation_term, - observation_subset = SAFFL == "Y", - parameters = unique(dataset_param$PARAMCD) -) { - # Input Checking - require_param <- c("PARAM", "PARAMCD", "AVISITN", "CHG") - - if (!all(require_param %in% names(dataset_param))) { - dataset_param_diff <- paste(setdiff(names(dataset_param), require_param), collapse = ";") - stop("Missing Standard Variable in dataset_param: ", dataset_param_diff) - } - - if (!all(parameters %in% dataset_param$PARAMCD)) { - param_diff <- paste(setdiff(parameters, unique(dataset_param$PARAMCD)), collapse = ";") - stop("Mismatch parameters in dataset_param$PARAMCD: ", param_diff) - } - - # Analysis Plan - parameter_term <- paste(parameters, collapse = ";") - - plan <- metalite::plan( - analysis = "boxly", - population = population_term, - observation = observation_term, - parameter = parameter_term - ) - - # Define metalite object - meta <- metalite::meta_adam( - population = dataset_adsl, - observation = dataset_param - ) |> - metalite::define_plan(plan = plan) |> - metalite::define_population( - name = population_term, - group = "TRTA", - subset = !!rlang::enquo(population_subset), - label = "" - ) |> - metalite::define_observation( - name = observation_term, - group = "TRTA", - var = "PARAM", - subset = !!rlang::enquo(observation_subset), - label = "" - ) |> - metalite::define_analysis( - name = "boxly", - label = "Interactive Box Plot", - x = "AVISITN", - y = "CHG" - ) - - # Add parameter definition - u_param <- unique(dataset_param[, c("PARAM", "PARAMCD")]) - u_param <- u_param[u_param[["PARAMCD"]] %in% parameters, ] - - for (i in seq(parameters)) { - term <- paste0("PARAMCD == '", u_param[["PARAMCD"]][i], "'") - meta <- meta |> - metalite::define_parameter( - name = u_param[["PARAMCD"]][i], - label = u_param[["PARAM"]][i], - subset = str2lang(term) - ) - } - - metalite::meta_build(meta) -} diff --git a/R/prepare_boxly.R b/R/prepare_boxly.R index 15f6ea9..4f77dbd 100644 --- a/R/prepare_boxly.R +++ b/R/prepare_boxly.R @@ -34,14 +34,49 @@ #' @export #' #' @examples -#' library(metalite) -#' -#' meta <- meta_boxly( -#' boxly_adsl, -#' boxly_adlb, -#' population_term = "apat", -#' observation_term = "wk12" +#' analysis_plan <- metalite::plan( +#' analysis = "boxly", +#' population = "apat", +#' observation = "wk12", +#' parameter = "SODIUM;BILI" #' ) +#' +#' meta <- metalite::meta_adam( +#' population = boxly_adsl, +#' observation = boxly_adlb +#' ) |> +#' metalite::define_plan(analysis_plan) |> +#' metalite::define_population( +#' name = "apat", +#' group = "TRTA", +#' subset = SAFFL == "Y", +#' label = "Safety Population" +#' ) |> +#' metalite::define_observation( +#' name = "wk12", +#' group = "TRTA", +#' var = "PARAM", +#' subset = AVISITN <= 12 & !is.na(CHG), +#' label = "Weeks 0 to 12" +#' ) |> +#' metalite::define_parameter( +#' name = "SODIUM", +#' label = "Sodium (mmol/L)", +#' subset = PARAMCD == "SODIUM" +#' ) |> +#' metalite::define_parameter( +#' name = "BILI", +#' label = "Bilirubin (mg/dL)", +#' subset = PARAMCD == "BILI" +#' ) |> +#' metalite::define_analysis( +#' name = "boxly", +#' label = "Interactive Box Plot", +#' x = "AVISITN", +#' y = "CHG" +#' ) |> +#' metalite::meta_build() +#' #' prepare_boxly(meta) #' #' @return Metadata list with plotting dataset From 188e5f368cf4532e2dfd9e7186487215fdf4749b Mon Sep 17 00:00:00 2001 From: LittleBeannie Date: Mon, 10 Aug 2026 10:53:14 -0400 Subject: [PATCH 2/7] Update the testthat files --- tests/testthat/helper-meta_boxly.R | 54 +++++++++++++++++++ .../test-independant-testing-prepare_boxly.R | 5 +- .../testthat/test-independent-testing-boxly.R | 10 ++-- .../test-independent-testing-meta_boxly.R | 35 ------------ 4 files changed, 60 insertions(+), 44 deletions(-) create mode 100644 tests/testthat/helper-meta_boxly.R delete mode 100644 tests/testthat/test-independent-testing-meta_boxly.R diff --git a/tests/testthat/helper-meta_boxly.R b/tests/testthat/helper-meta_boxly.R new file mode 100644 index 0000000..e37b7fc --- /dev/null +++ b/tests/testthat/helper-meta_boxly.R @@ -0,0 +1,54 @@ +meta_boxly_test <- function( + dataset_adsl, + dataset_param, + population_term, + observation_term, + parameters = unique(dataset_param$PARAMCD) +) { + analysis_plan <- metalite::plan( + analysis = "boxly", + population = population_term, + observation = observation_term, + parameter = paste(parameters, collapse = ";") + ) + + meta <- metalite::meta_adam( + population = dataset_adsl, + observation = dataset_param + ) |> + metalite::define_plan(plan = analysis_plan) |> + metalite::define_population( + name = population_term, + group = "TRTA", + subset = SAFFL == "Y", + label = "" + ) |> + metalite::define_observation( + name = observation_term, + group = "TRTA", + var = "PARAM", + subset = AVISITN <= 12 & !is.na(CHG), + label = "" + ) |> + metalite::define_analysis( + name = "boxly", + label = "Interactive Box Plot", + x = "AVISITN", + y = "CHG" + ) + + parameter_data <- unique(dataset_param[, c("PARAM", "PARAMCD")]) + parameter_data <- parameter_data[parameter_data[["PARAMCD"]] %in% parameters, ] + + for (index in seq(parameters)) { + term <- paste0("PARAMCD == '", parameter_data[["PARAMCD"]][index], "'") + meta <- meta |> + metalite::define_parameter( + name = parameter_data[["PARAMCD"]][index], + label = parameter_data[["PARAM"]][index], + subset = str2lang(term) + ) + } + + metalite::meta_build(meta) +} \ No newline at end of file diff --git a/tests/testthat/test-independant-testing-prepare_boxly.R b/tests/testthat/test-independant-testing-prepare_boxly.R index 79485a2..975284d 100644 --- a/tests/testthat/test-independant-testing-prepare_boxly.R +++ b/tests/testthat/test-independant-testing-prepare_boxly.R @@ -17,12 +17,11 @@ # along with this program. If not, see . test_that("Its class is 'outdata'", { - meta <- meta_boxly( + meta <- meta_boxly_test( boxly_adsl, boxly_adlb, population_term = "apat", - observation_term = "wk12", - observation_subset = AVISITN <= 12 & !is.na(CHG) + observation_term = "wk12" ) output <- suppressMessages(prepare_boxly(meta)) diff --git a/tests/testthat/test-independent-testing-boxly.R b/tests/testthat/test-independent-testing-boxly.R index 3f8c857..01cae63 100644 --- a/tests/testthat/test-independent-testing-boxly.R +++ b/tests/testthat/test-independent-testing-boxly.R @@ -17,12 +17,11 @@ # along with this program. If not, see . test_that("validation of boxly plot Case 1", { - meta <- meta_boxly( + meta <- meta_boxly_test( boxly_adsl, boxly_adlb, population_term = "apat", - observation_term = "wk12", - observation_subset = AVISITN <= 12 & !is.na(CHG) + observation_term = "wk12" ) x <- suppressMessages(prepare_boxly(meta)) @@ -57,12 +56,11 @@ test_that("validation of boxly plot Case 1", { }) test_that("validation of boxly plot Case 2", { - meta <- meta_boxly( + meta <- meta_boxly_test( boxly_adsl, boxly_adlb, population_term = "apat", - observation_term = "wk12", - observation_subset = AVISITN <= 12 & !is.na(CHG) + observation_term = "wk12" ) x <- suppressMessages(prepare_boxly(meta)) diff --git a/tests/testthat/test-independent-testing-meta_boxly.R b/tests/testthat/test-independent-testing-meta_boxly.R deleted file mode 100644 index 2f45f72..0000000 --- a/tests/testthat/test-independent-testing-meta_boxly.R +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (c) 2023 Merck & Co., Inc., Rahway, NJ, USA and its affiliates. -# All rights reserved. -# -# This file is part of the boxly program. -# -# boxly is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -test_that("meta_boxly() structure", { - x <- meta_boxly( - boxly_adsl, - boxly_adlb, - population_term = "apat", - observation_term = "wk12", - observation_subset = AVISITN <= 12 & !is.na(CHG) - ) - - expect_equal(class(x), "meta_adam") - expect_equal(class(x$data_population), "data.frame") - expect_equal(class(x$data_observation), c("tbl_df", "tbl", "data.frame")) - expect_equal(class(x$population), "list") - expect_equal(class(x$observation), "list") - expect_equal(class(x$parameter), "list") - expect_equal(class(x$analysis), "list") -}) From 409e710cccf7ee1e8dd5d4dd3853ebcae0aa519f Mon Sep 17 00:00:00 2001 From: LittleBeannie Date: Mon, 10 Aug 2026 10:53:32 -0400 Subject: [PATCH 3/7] Update the Rmd files --- man/prepare_boxly.Rd | 49 +++++++++-- vignettes/boxly-cran.Rmd | 49 +++++++++-- vignettes/boxly.Rmd | 164 ++++++++++++++++++++++++++++++----- vignettes/design-pattern.Rmd | 55 ++++++++++-- vignettes/hover-label.Rmd | 130 ++++++++++++++++++++++----- 5 files changed, 389 insertions(+), 58 deletions(-) diff --git a/man/prepare_boxly.Rd b/man/prepare_boxly.Rd index 8318bb6..1050d87 100644 --- a/man/prepare_boxly.Rd +++ b/man/prepare_boxly.Rd @@ -39,14 +39,49 @@ Metadata list with plotting dataset Prepare data for interactive box plot } \examples{ -library(metalite) - -meta <- meta_boxly( - boxly_adsl, - boxly_adlb, - population_term = "apat", - observation_term = "wk12" +analysis_plan <- metalite::plan( + analysis = "boxly", + population = "apat", + observation = "wk12", + parameter = "SODIUM;BILI" ) + +meta <- metalite::meta_adam( + population = boxly_adsl, + observation = boxly_adlb +) |> + metalite::define_plan(analysis_plan) |> + metalite::define_population( + name = "apat", + group = "TRTA", + subset = SAFFL == "Y", + label = "Safety Population" + ) |> + metalite::define_observation( + name = "wk12", + group = "TRTA", + var = "PARAM", + subset = AVISITN <= 12 & !is.na(CHG), + label = "Weeks 0 to 12" + ) |> + metalite::define_parameter( + name = "SODIUM", + label = "Sodium (mmol/L)", + subset = PARAMCD == "SODIUM" + ) |> + metalite::define_parameter( + name = "BILI", + label = "Bilirubin (mg/dL)", + subset = PARAMCD == "BILI" + ) |> + metalite::define_analysis( + name = "boxly", + label = "Interactive Box Plot", + x = "AVISITN", + y = "CHG" + ) |> + metalite::meta_build() + prepare_boxly(meta) } diff --git a/vignettes/boxly-cran.Rmd b/vignettes/boxly-cran.Rmd index 833e79f..cb53cdf 100644 --- a/vignettes/boxly-cran.Rmd +++ b/vignettes/boxly-cran.Rmd @@ -12,13 +12,50 @@ Please see for the full documentation. ```{r, eval = FALSE} library("boxly") -meta_boxly( - boxly_adsl, - boxly_adlb, - population_term = "apat", - observation_term = "wk12", - observation_subset = AVISITN <= 12 & !is.na(CHG) +analysis_plan <- metalite::plan( + analysis = "boxly", + population = "apat", + observation = "wk12", + parameter = "SODIUM;BILI" +) + +meta <- metalite::meta_adam( + population = boxly_adsl, + observation = boxly_adlb ) |> + metalite::define_plan(analysis_plan) |> + metalite::define_population( + name = "apat", + group = "TRTA", + subset = SAFFL == "Y", + label = "Safety Population" + ) |> + metalite::define_observation( + name = "wk12", + group = "TRTA", + var = "PARAM", + subset = AVISITN <= 12 & !is.na(CHG), + label = "Weeks 0 to 12" + ) |> + metalite::define_parameter( + name = "SODIUM", + label = "Sodium (mmol/L)", + subset = PARAMCD == "SODIUM" + ) |> + metalite::define_parameter( + name = "BILI", + label = "Bilirubin (mg/dL)", + subset = PARAMCD == "BILI" + ) |> + metalite::define_analysis( + name = "boxly", + label = "Interactive Box Plot", + x = "AVISITN", + y = "CHG" + ) |> + metalite::meta_build() + +meta |> prepare_boxly() |> boxly() ``` diff --git a/vignettes/boxly.Rmd b/vignettes/boxly.Rmd index 50c6d9b..de0ad8d 100644 --- a/vignettes/boxly.Rmd +++ b/vignettes/boxly.Rmd @@ -42,23 +42,63 @@ Some common interactive features of the box plots include: Creating the box plot using this package involves the below steps: - - Create a list of metadata (Ex: meta) using `meta_boxly()` + - Create a metadata object using the metalite package - Call `prepare_boxly()` function to prepare the metadata as required by the user - Call `boxly()` function to create the interactive plot ## Example 1: Interactive Box Plot Using Labs Data -Step1: Create a list of metadata (Ex: meta) using `meta_boxly()` +Step 1: Create a metadata object using the metalite package ```{r} -meta <- meta_boxly( - boxly_adsl, - boxly_adlb, - population_term = "apat", - observation_term = "wk12", - observation_subset = AVISITN <= 12 & !is.na(CHG) +analysis_plan <- metalite::plan( + analysis = "boxly", + population = "apat", + observation = "wk12", + parameter = "SODIUM;K;CL" ) + +meta <- metalite::meta_adam( + population = boxly_adsl, + observation = boxly_adlb +) |> + metalite::define_plan(analysis_plan) |> + metalite::define_population( + name = "apat", + group = "TRTA", + subset = SAFFL == "Y", + label = "Safety Population" + ) |> + metalite::define_observation( + name = "wk12", + group = "TRTA", + var = "PARAM", + subset = AVISITN <= 12 & !is.na(CHG), + label = "Weeks 0 to 12" + ) |> + metalite::define_parameter( + name = "SODIUM", + label = "Sodium (mmol/L)", + subset = PARAMCD == "SODIUM" + ) |> + metalite::define_parameter( + name = "K", + label = "Potassium (mmol/L)", + subset = PARAMCD == "K" + ) |> + metalite::define_parameter( + name = "CL", + label = "Chloride (mmol/L)", + subset = PARAMCD == "CL" + ) |> + metalite::define_analysis( + name = "boxly", + label = "Interactive Box Plot", + x = "AVISITN", + y = "CHG" + ) |> + metalite::meta_build() ``` Step2: Call `prepare_boxly()` function to prepare the metadata as required by the user @@ -77,13 +117,55 @@ boxly(outdata) ## Example 2: Interactive Box Plot Using Vital Signs Data ```{r} -meta_boxly( - boxly_adsl, - boxly_advs, - population_term = "apat", - observation_term = "wk12", - observation_subset = AVISITN <= 12 & !is.na(CHG) +analysis_plan <- metalite::plan( + analysis = "boxly", + population = "apat", + observation = "wk12", + parameter = "DIABP;PULSE;SYSBP" +) + +meta <- metalite::meta_adam( + population = boxly_adsl, + observation = boxly_advs ) |> + metalite::define_plan(analysis_plan) |> + metalite::define_population( + name = "apat", + group = "TRTA", + subset = SAFFL == "Y", + label = "Safety Population" + ) |> + metalite::define_observation( + name = "wk12", + group = "TRTA", + var = "PARAM", + subset = AVISITN <= 12 & !is.na(CHG), + label = "Weeks 0 to 12" + ) |> + metalite::define_parameter( + name = "DIABP", + label = "Diastolic Blood Pressure (mmHg)", + subset = PARAMCD == "DIABP" + ) |> + metalite::define_parameter( + name = "PULSE", + label = "Pulse Rate (BEATS/MIN)", + subset = PARAMCD == "PULSE" + ) |> + metalite::define_parameter( + name = "SYSBP", + label = "Systolic Blood Pressure (mmHg)", + subset = PARAMCD == "SYSBP" + ) |> + metalite::define_analysis( + name = "boxly", + label = "Interactive Box Plot", + x = "AVISITN", + y = "CHG" + ) |> + metalite::meta_build() + +meta |> prepare_boxly() |> boxly() ``` @@ -91,13 +173,55 @@ meta_boxly( ## Example 3: Interactive Box Plot Using ECG Data ```{r} -meta_boxly( - boxly_adsl, - boxly_adeg, - population_term = "apat", - observation_term = "wk12", - observation_subset = AVISITN <= 12 & !is.na(CHG) +analysis_plan <- metalite::plan( + analysis = "boxly", + population = "apat", + observation = "wk12", + parameter = "ARATE;PR;QRS" +) + +meta <- metalite::meta_adam( + population = boxly_adsl, + observation = boxly_adeg ) |> + metalite::define_plan(analysis_plan) |> + metalite::define_population( + name = "apat", + group = "TRTA", + subset = SAFFL == "Y", + label = "Safety Population" + ) |> + metalite::define_observation( + name = "wk12", + group = "TRTA", + var = "PARAM", + subset = AVISITN <= 12 & !is.na(CHG), + label = "Weeks 0 to 12" + ) |> + metalite::define_parameter( + name = "ARATE", + label = "Atrial Rate (beats/min)", + subset = PARAMCD == "ARATE" + ) |> + metalite::define_parameter( + name = "PR", + label = "PR Interval (msec)", + subset = PARAMCD == "PR" + ) |> + metalite::define_parameter( + name = "QRS", + label = "QRS Interval (msec)", + subset = PARAMCD == "QRS" + ) |> + metalite::define_analysis( + name = "boxly", + label = "Interactive Box Plot", + x = "AVISITN", + y = "CHG" + ) |> + metalite::meta_build() + +meta |> prepare_boxly() |> boxly() ``` diff --git a/vignettes/design-pattern.Rmd b/vignettes/design-pattern.Rmd index d2e7841..6e77cad 100644 --- a/vignettes/design-pattern.Rmd +++ b/vignettes/design-pattern.Rmd @@ -56,15 +56,62 @@ As an interactive visualization tool, boxly contains several interactive feature # Input data structure and attributes Metadata which is generated by metalite package is required as input. -`meta_boxly()` is generated in the boxly package for illustration purpose. -Users should create metadata with similar structure. +Users should create metadata with the population, observation, parameter, and +analysis definitions required for their box plot. ```{r} library(boxly) ``` ```{r} -meta <- meta_boxly() +analysis_plan <- metalite::plan( + analysis = "lb_boxly", + population = "apat", + observation = "wk12", + parameter = "sodium;bili;urate" +) + +meta <- metalite::meta_adam( + population = boxly_adsl, + observation = boxly_adlb +) |> + metalite::define_plan(analysis_plan) |> + metalite::define_population( + name = "apat", + group = "TRTA", + subset = SAFFL == "Y", + label = "Safety Population" + ) |> + metalite::define_observation( + name = "wk12", + group = "TRTA", + var = "PARAM", + subset = AVISITN <= 12 & !is.na(CHG), + label = "Weeks 0 to 12" + ) |> + metalite::define_parameter( + name = "sodium", + label = "Sodium (mmol/L)", + subset = PARAMCD == "SODIUM" + ) |> + metalite::define_parameter( + name = "bili", + label = "Bilirubin (umol/L)", + subset = PARAMCD == "BILI" + ) |> + metalite::define_parameter( + name = "urate", + label = "Urate (umol/L)", + subset = PARAMCD == "URATE" + ) |> + metalite::define_analysis( + name = "lb_boxly", + label = "Interactive Box Plot", + x = "AVISITN", + y = "CHG" + ) |> + metalite::meta_build() + meta ``` @@ -81,7 +128,6 @@ Here is the structure for the expected output list of `prepare_boxly()`: outdata <- prepare_boxly(meta, population = "apat", observation = "wk12", - parameter = "sodium;bili;urate", analysis = "lb_boxly" ) outdata @@ -121,7 +167,6 @@ The second block is an combined interactive visualization tool which contains a p_list <- prepare_boxly(meta, population = "apat", observation = "wk12", - parameter = "sodium;bili;urate", analysis = "lb_boxly" ) |> boxly() diff --git a/vignettes/hover-label.Rmd b/vignettes/hover-label.Rmd index 104b2d7..bfea78e 100644 --- a/vignettes/hover-label.Rmd +++ b/vignettes/hover-label.Rmd @@ -79,16 +79,46 @@ In this example, we plan to add more hover labels for outliers. library(boxly) ``` -Step1: Create a list of metadata using `meta_boxly()`. Using Lab data as example. +Step 1: Create metadata using the metalite package. Using Lab data as example. ```{r} -meta <- meta_boxly( - boxly_adsl, - boxly_adlb, - population_term = "apat", - observation_term = "wk12", - observation_subset = AVISITN <= 12 & !is.na(CHG) +analysis_plan <- metalite::plan( + analysis = "boxly", + population = "apat", + observation = "wk12", + parameter = "SODIUM" ) + +meta <- metalite::meta_adam( + population = boxly_adsl, + observation = boxly_adlb +) |> + metalite::define_plan(analysis_plan) |> + metalite::define_population( + name = "apat", + group = "TRTA", + subset = SAFFL == "Y", + label = "Safety Population" + ) |> + metalite::define_observation( + name = "wk12", + group = "TRTA", + var = "PARAM", + subset = AVISITN <= 12 & !is.na(CHG), + label = "Weeks 0 to 12" + ) |> + metalite::define_parameter( + name = "SODIUM", + label = "Sodium (mmol/L)", + subset = PARAMCD == "SODIUM" + ) |> + metalite::define_analysis( + name = "boxly", + label = "Interactive Box Plot", + x = "AVISITN", + y = "CHG" + ) |> + metalite::meta_build() ``` Step2: Call `prepare_boxly()` function to prepare the metadata as required by the user. In this example, we plan to add Baseline Value and Analysis Date, so besides the default "USUBJID" and "CHG"(as y axis label collected from meta mapping object),"BASE" and "ADT" are also included in the `hover_var_outlier`. @@ -124,16 +154,46 @@ Here, you will notice "Participant ID", "Parameter value","Base Value"and "Analy In this example, we plan to only display number of participant, Q1, mean, median, Q3 for the hover label of box. -Step1: Create a list of metadata using `meta_boxly()`. Using Vital Sign data as example. +Step 1: Create metadata using the metalite package. Using Vital Sign data as example. ```{r} -meta_boxly( - boxly_adsl, - boxly_advs, - population_term = "apat", - observation_term = "wk12", - observation_subset = AVISITN <= 12 & !is.na(CHG) +analysis_plan <- metalite::plan( + analysis = "boxly", + population = "apat", + observation = "wk12", + parameter = "PULSE" ) + +meta <- metalite::meta_adam( + population = boxly_adsl, + observation = boxly_advs +) |> + metalite::define_plan(analysis_plan) |> + metalite::define_population( + name = "apat", + group = "TRTA", + subset = SAFFL == "Y", + label = "Safety Population" + ) |> + metalite::define_observation( + name = "wk12", + group = "TRTA", + var = "PARAM", + subset = AVISITN <= 12 & !is.na(CHG), + label = "Weeks 0 to 12" + ) |> + metalite::define_parameter( + name = "PULSE", + label = "Pulse Rate (BEATS/MIN)", + subset = PARAMCD == "PULSE" + ) |> + metalite::define_analysis( + name = "boxly", + label = "Interactive Box Plot", + x = "AVISITN", + y = "CHG" + ) |> + metalite::meta_build() ``` Step2: Call `prepare_boxly()` function to prepare the metadata as required by the user. In this step, we did not change `hover_var_outlier`, so the hover label for the outlier will display the default value "Participant ID" and "Parameter value" for "USUBJID" and "CHG". @@ -155,13 +215,43 @@ Here, you will notice that only number of participant, Q1, mean, median, Q3 are In this example, we plan to combine Example 1 and Example 2 to customize label of outlier and label of box at the same step. Using ECG data as example. ```{r} -meta_boxly( - boxly_adsl, - boxly_adeg, - population_term = "apat", - observation_term = "wk12", - observation_subset = AVISITN <= 12 & !is.na(CHG) +analysis_plan <- metalite::plan( + analysis = "boxly", + population = "apat", + observation = "wk12", + parameter = "QTCF" ) + +meta <- metalite::meta_adam( + population = boxly_adsl, + observation = boxly_adeg +) |> + metalite::define_plan(analysis_plan) |> + metalite::define_population( + name = "apat", + group = "TRTA", + subset = SAFFL == "Y", + label = "Safety Population" + ) |> + metalite::define_observation( + name = "wk12", + group = "TRTA", + var = "PARAM", + subset = AVISITN <= 12 & !is.na(CHG), + label = "Weeks 0 to 12" + ) |> + metalite::define_parameter( + name = "QTCF", + label = "QTc Interval Fridericia (msec)", + subset = PARAMCD == "QTCF" + ) |> + metalite::define_analysis( + name = "boxly", + label = "Interactive Box Plot", + x = "AVISITN", + y = "CHG" + ) |> + metalite::meta_build() ``` ```{r} From 6f15f456970278800ba31fe8e13757e556e721f1 Mon Sep 17 00:00:00 2001 From: LittleBeannie Date: Mon, 10 Aug 2026 10:53:43 -0400 Subject: [PATCH 4/7] Update the Rd files --- man/boxly.Rd | 48 +++++++++++++++++++++++++++++++++++++++++------ man/meta_boxly.Rd | 48 ----------------------------------------------- 2 files changed, 42 insertions(+), 54 deletions(-) delete mode 100644 man/meta_boxly.Rd diff --git a/man/boxly.Rd b/man/boxly.Rd index 56cd912..78e1f35 100644 --- a/man/boxly.Rd +++ b/man/boxly.Rd @@ -43,14 +43,50 @@ Create an interactive box plot \examples{ # Only run this example in interactive R sessions if (interactive()) { - library(metalite) + analysis_plan <- metalite::plan( + analysis = "boxly", + population = "apat", + observation = "wk12", + parameter = "SODIUM;BILI" + ) - meta_boxly( - boxly_adsl, - boxly_adlb, - population_term = "apat", - observation_term = "wk12" + meta <- metalite::meta_adam( + population = boxly_adsl, + observation = boxly_adlb ) |> + metalite::define_plan(analysis_plan) |> + metalite::define_population( + name = "apat", + group = "TRTA", + subset = SAFFL == "Y", + label = "Safety Population" + ) |> + metalite::define_observation( + name = "wk12", + group = "TRTA", + var = "PARAM", + subset = AVISITN <= 12 & !is.na(CHG), + label = "Weeks 0 to 12" + ) |> + metalite::define_parameter( + name = "SODIUM", + label = "Sodium (mmol/L)", + subset = PARAMCD == "SODIUM" + ) |> + metalite::define_parameter( + name = "BILI", + label = "Bilirubin (mg/dL)", + subset = PARAMCD == "BILI" + ) |> + metalite::define_analysis( + name = "boxly", + label = "Interactive Box Plot", + x = "AVISITN", + y = "CHG" + ) |> + metalite::meta_build() + + meta |> prepare_boxly() |> boxly() } diff --git a/man/meta_boxly.Rd b/man/meta_boxly.Rd deleted file mode 100644 index 426631f..0000000 --- a/man/meta_boxly.Rd +++ /dev/null @@ -1,48 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/meta_boxly.R -\name{meta_boxly} -\alias{meta_boxly} -\title{Create an example metadata object} -\usage{ -meta_boxly( - dataset_adsl, - dataset_param, - population_term, - population_subset = SAFFL == "Y", - observation_term, - observation_subset = SAFFL == "Y", - parameters = unique(dataset_param$PARAMCD) -) -} -\arguments{ -\item{dataset_adsl}{ADSL source dataset.} - -\item{dataset_param}{Observation level source dataset for boxplot.} - -\item{population_term}{A character value of population term name.} - -\item{population_subset}{An unquoted condition for selecting the -populations from ADSL dataset.} - -\item{observation_term}{A character value of observation term name.} - -\item{observation_subset}{An unquoted condition for selecting the -observations from \code{dataset_param} dataset.} - -\item{parameters}{A chracter vector of parameters defined in \code{dataset_param$PARAMCD}} -} -\value{ -A metalite object. -} -\description{ -Create an example metadata object -} -\examples{ - -meta_boxly( - boxly_adsl, - boxly_adlb, - population_term = "apat", - observation_term = "wk12" -) -} From fb72c6655583f24448c6ab67c53a9139dde21aff Mon Sep 17 00:00:00 2001 From: LittleBeannie Date: Mon, 10 Aug 2026 10:54:04 -0400 Subject: [PATCH 5/7] Update the DESCRIPTION, NAMESPACE and README --- DESCRIPTION | 1 - NAMESPACE | 1 - README.md | 47 +++++++++++++++++++++++++++++++++++++++-------- _pkgdown.yml | 1 - 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 8d77c4f..5fcf565 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -23,7 +23,6 @@ Depends: Imports: DT, brew, - rlang, crosstalk, ggplot2, htmlwidgets, diff --git a/NAMESPACE b/NAMESPACE index 25fdeb9..8c18ee4 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,7 +1,6 @@ # Generated by roxygen2: do not edit by hand export(boxly) -export(meta_boxly) export(prepare_boxly) importFrom(ggplot2,.data) importFrom(ggplot2,aes) diff --git a/README.md b/README.md index 2cae6dc..51184a4 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,7 @@ inputs and outputs. The general workflow is: -1. Use `meta_boxly()` or metalite package to construct input metadata from ADaM datasets. - For example,. +1. Use the metalite package to construct input metadata from ADaM datasets. 1. Use `prepare_boxly()` to prepare datasets for interactive box plot. 1. Use `boxly()` to generate an interactive box plot. @@ -49,13 +48,45 @@ Here is a quick example using an example dataset: ```r library("boxly") -meta_boxly( - boxly_adsl, - boxly_adlb, - population_term = "apat", - observation_term = "wk12", - observation_subset = AVISITN <= 12 & !is.na(CHG) +analysis_plan <- metalite::plan( + analysis = "boxly", + population = "apat", + observation = "wk12", + parameter = "SODIUM" +) + +meta <- metalite::meta_adam( + population = boxly_adsl, + observation = boxly_adlb ) |> + metalite::define_plan(analysis_plan) |> + metalite::define_population( + name = "apat", + group = "TRTA", + subset = SAFFL == "Y", + label = "Safety Population" + ) |> + metalite::define_observation( + name = "wk12", + group = "TRTA", + var = "PARAM", + subset = AVISITN <= 12 & !is.na(CHG), + label = "Weeks 0 to 12" + ) |> + metalite::define_parameter( + name = "SODIUM", + label = "Sodium (mmol/L)", + subset = PARAMCD == "SODIUM" + ) |> + metalite::define_analysis( + name = "boxly", + label = "Interactive Box Plot", + x = "AVISITN", + y = "CHG" + ) |> + metalite::meta_build() + +meta |> prepare_boxly() |> boxly() ``` diff --git a/_pkgdown.yml b/_pkgdown.yml index 6f870bd..9eefabd 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -26,7 +26,6 @@ footer: reference: - title: Interactive box plot contents: - - meta_boxly - prepare_boxly - boxly - title: Example data From 0ae5f35df08c072b3890b7f10eefe515677deed4 Mon Sep 17 00:00:00 2001 From: LittleBeannie Date: Mon, 10 Aug 2026 14:55:55 +0000 Subject: [PATCH 6/7] Style code (GHA) --- tests/testthat/helper-meta_boxly.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testthat/helper-meta_boxly.R b/tests/testthat/helper-meta_boxly.R index e37b7fc..9625b70 100644 --- a/tests/testthat/helper-meta_boxly.R +++ b/tests/testthat/helper-meta_boxly.R @@ -51,4 +51,4 @@ meta_boxly_test <- function( } metalite::meta_build(meta) -} \ No newline at end of file +} From c03e40719ad7a0a56e79da38b74ad5ba882af0f8 Mon Sep 17 00:00:00 2001 From: "Fukuda, Hiroaki" Date: Wed, 26 Aug 2026 03:52:42 -0400 Subject: [PATCH 7/7] Run `devtools::buid_site()` for cheking --- pkgdown/favicon/apple-touch-icon.png | Bin 0 -> 6199 bytes pkgdown/favicon/favicon-96x96.png | Bin 0 -> 2987 bytes pkgdown/favicon/favicon.ico | Bin 0 -> 15086 bytes pkgdown/favicon/favicon.svg | 1 + pkgdown/favicon/site.webmanifest | 21 +++++++++++++++++++ pkgdown/favicon/web-app-manifest-192x192.png | Bin 0 -> 6644 bytes pkgdown/favicon/web-app-manifest-512x512.png | Bin 0 -> 26811 bytes 7 files changed, 22 insertions(+) create mode 100644 pkgdown/favicon/apple-touch-icon.png create mode 100644 pkgdown/favicon/favicon-96x96.png create mode 100644 pkgdown/favicon/favicon.ico create mode 100644 pkgdown/favicon/favicon.svg create mode 100644 pkgdown/favicon/site.webmanifest create mode 100644 pkgdown/favicon/web-app-manifest-192x192.png create mode 100644 pkgdown/favicon/web-app-manifest-512x512.png diff --git a/pkgdown/favicon/apple-touch-icon.png b/pkgdown/favicon/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b2c382b345bb322c67664a724548c3a2823553fc GIT binary patch literal 6199 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 literal 0 HcmV?d00001 diff --git a/pkgdown/favicon/favicon-96x96.png b/pkgdown/favicon/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..85a1f496de3e71cf515f225f09e7b88c5cf25115 GIT binary patch literal 2987 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 literal 0 HcmV?d00001 diff --git a/pkgdown/favicon/favicon.svg b/pkgdown/favicon/favicon.svg new file mode 100644 index 0000000..359d283 --- /dev/null +++ b/pkgdown/favicon/favicon.svg @@ -0,0 +1 @@ +RealFaviconGeneratorhttps://realfavicongenerator.net \ No newline at end of file diff --git a/pkgdown/favicon/site.webmanifest b/pkgdown/favicon/site.webmanifest new file mode 100644 index 0000000..4ebda26 --- /dev/null +++ b/pkgdown/favicon/site.webmanifest @@ -0,0 +1,21 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/web-app-manifest-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/web-app-manifest-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} \ No newline at end of file diff --git a/pkgdown/favicon/web-app-manifest-192x192.png b/pkgdown/favicon/web-app-manifest-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..aeb2ee2f35741e95df233ed1622fad42ff607a00 GIT binary patch literal 6644 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 JFHT@@{tsX$(qRAq literal 0 HcmV?d00001