From 374342a021ae2b80ffd07977e9fa78b9b4532f82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?zxBIB=20Lech=C3=B3n=2CMiguel=20=28MED=20BDS=29=20EXTERNAL?= Date: Fri, 11 Oct 2024 17:59:13 +0200 Subject: [PATCH 01/31] Formalize interface with papo. --- R/mod_main_view.R | 16 ++++ tests/testthat/test-message_papo.R | 127 +++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 tests/testthat/test-message_papo.R diff --git a/R/mod_main_view.R b/R/mod_main_view.R index 724c7a0..4c50454 100644 --- a/R/mod_main_view.R +++ b/R/mod_main_view.R @@ -358,6 +358,22 @@ mod_main_view_server <- function(module_id, initial_data, changed, subject }) + testing <- isTRUE(getOption("shiny.testmode")) + if (testing) { + subject_id_orig <- subject_id + + trigger <- shiny::reactiveVal(0) + shiny::observeEvent(input[["debug_select_subject"]], trigger(trigger() + 1)) + subject_id <- shiny::reactive({ + res <- NULL + if (trigger()) { + res <- shiny::isolate(input[["debug_select_subject"]]) + } else { + res <- subject_id_orig() + } + return(res) + }) + } # For exchange with receiver module return( diff --git a/tests/testthat/test-message_papo.R b/tests/testthat/test-message_papo.R new file mode 100644 index 0000000..9e60491 --- /dev/null +++ b/tests/testthat/test-message_papo.R @@ -0,0 +1,127 @@ +# YT#VH33e387131d296de57ba6b9be8368c156#VH00000000000000000000000000000000# +# This is a test template for modules that select a subject ID and send it to dv.papo. + +# In order to fit it to your module, it needs three pieces of information: +# 1) An instance of the module you want to test, parameterized to produce valid output and not trigger a `shiny::req`. +mod <- mod_clinical_timelines( + module_id = "mod", + basic_info = list( + subject_level_dataset_name = "adsl", trt_start_var = "TRTSDT", trt_end_var = "TRTEDT", icf_date_var = "RFICDT" + ), + mapping = list( + adsl = list( + "Treatment Start" = list( + start_dt_var = "TRTSDT", end_dt_var = NULL, start_dy_var = NULL, end_dy_var = NULL, detail_var = NULL + ), + "Treatment End" = list( + start_dt_var = "TRTEDT", end_dt_var = NULL, start_dy_var = NULL, end_dy_var = NULL, detail_var = NULL + ), + "Informed Consent" = list( + start_dt_var = "RFICDT", end_dt_var = NULL, start_dy_var = NULL, end_dy_var = NULL, detail_var = NULL + ) + ), + adae = list( + "Adverse Events" = list( + start_dt_var = "AESTDTC", end_dt_var = "AEENDTC", start_dy_var = NULL, end_dy_var = NULL, detail_var = "AEDECOD" + ) + ) + ), + drug_admin = list( + dataset_name = "exp", start_var = "EXSTDTC", end_var = "EXENDTC", detail_var = "EXTRT", + label = "Drug Administration", dose_var = "EXDOSE", dose_unit_var = "EXDOSU" + ), + subjid_var = "USUBJID", + filter = list( + ae_filter = list( + dataset_name = "adae", label = "Adverse Events", soc_var = "AESOC", serious_ae_var = "AESER", + pref_term_var = "AEDECOD", drug_rel_ae_var = "AERELFLG" + ) + ), + ms = 50, + default_plot_settings = list(x_param = "day", start_day = -5, boxheight_val = 60) +) + +# 2) Data matching the previous parameterization. +data <- dv.clinlines:::prep_dummy_data() + +# 3) Fully namespaced input ID that, when set to a subject ID value, should make the module send dv.papo a message. +trigger_input_id <- "mod-main_view-debug_select_subject" + +# This portion of the test template defines the expected protocol for sending a message to dv.papo and is shared across +# all modules that do so. The first line on this file is a hash of the contents of this `local` section. Its purpose +# is to maintain all copies of this portion of the file synchronized. +# See https://github.com/dull-systems/yours_truelib for more details. +test_harness <- local({ + datasets <- shiny::reactive(data) + + afmm <- list( + unfiltered_dataset = datasets, + filtered_dataset = datasets, + module_output = function() list(), + utils = list(switch2 = function(id) NULL), + dataset_metadata = list(name = shiny::reactive("dummy_dataset_name")) + ) + + app_ui <- function() { + shiny::fluidPage(mod[["ui"]](mod[["module_id"]])) + } + + app_server <- function(input, output, session) { + ret_value <- mod[["server"]](afmm) + + ret_value_update_count <- shiny::reactiveVal(0) + shiny::observeEvent(ret_value[["subj_id"]](), ret_value_update_count(ret_value_update_count() + 1)) + + shiny::exportTestValues( + ret_value = try(ret_value[["subj_id"]]()), # try because of https://github.com/rstudio/shiny/issues/3768 + update_count = ret_value_update_count() + ) + return(ret_value) + } + + app <- shiny::shinyApp( + ui = app_ui, + server = function(input, output, session) { + ret_value <- app_server(input, output, session) + + ret_value_update_count <- shiny::reactiveVal(0) + shiny::observeEvent(ret_value[["subj_id"]](), ret_value_update_count(ret_value_update_count() + 1)) + + shiny::exportTestValues( + ret_value = try(ret_value[["subj_id"]]()), # try because of https://github.com/rstudio/shiny/issues/3768 + update_count = ret_value_update_count() + ) + } + ) + + test_that("module adheres to send_subject_id_to_papo protocol", { + app <- shinytest2::AppDriver$new(app, name = "test_send_subject_id_to_papo_protocol") + + app$wait_for_idle() + + # Module starts and sends no message + exports <- app$get_values()[["export"]] + testthat::expect_equal(exports[["update_count"]], 0) + + trigger_subject_selection <- function(subject_id) { + set_input_params <- append( + as.list(setNames(subject_id, trigger_input_id)), + list(allow_no_input_binding_ = TRUE, priority_ = "event") + ) + do.call(app$set_inputs, set_input_params) + } + + # Module sends exactly one message per trigger event, even if subject does not change + subject_ids <- c("A", "A", "B") + for (i in seq_along(subject_ids)) { + trigger_subject_selection(subject_ids[[i]]) + + exports <- app$get_values()[["export"]] + # Module outputs selection once + testthat::expect_equal(exports[["ret_value"]], subject_ids[[i]]) + testthat::expect_equal(exports[["update_count"]], i) + } + + app$stop() + }) +}) From 94f97bf5eac04b504d6cea92ac093ff11d74da89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?zxBIB=20Lech=C3=B3n=2CMiguel=20=28MED=20BDS=29=20EXTERNAL?= Date: Sat, 12 Oct 2024 09:11:27 +0200 Subject: [PATCH 02/31] Isolate common portions of papo interface test. --- tests/testthat/message_papo-common.R | 81 ++++++++++++++++++++++++++++ tests/testthat/test-message_papo.R | 80 +-------------------------- 2 files changed, 82 insertions(+), 79 deletions(-) create mode 100644 tests/testthat/message_papo-common.R diff --git a/tests/testthat/message_papo-common.R b/tests/testthat/message_papo-common.R new file mode 100644 index 0000000..b265cd3 --- /dev/null +++ b/tests/testthat/message_papo-common.R @@ -0,0 +1,81 @@ +# YT#VH33e387131d296de57ba6b9be8368c156#VH00000000000000000000000000000000# +# This is a test template for modules that select a subject ID and send it to dv.papo. + +# This portion of the test template defines the expected protocol for sending a message to dv.papo and is shared across +# all modules that do so. The first line on this file is a hash of the contents of this `local` section. Its purpose +# is to maintain all copies of this portion of the file synchronized. +# See https://github.com/dull-systems/yours_truelib for more details. +test_harness <- local({ + datasets <- shiny::reactive(data) + + afmm <- list( + unfiltered_dataset = datasets, + filtered_dataset = datasets, + module_output = function() list(), + utils = list(switch2 = function(id) NULL), + dataset_metadata = list(name = shiny::reactive("dummy_dataset_name")) + ) + + app_ui <- function() { + shiny::fluidPage(mod[["ui"]](mod[["module_id"]])) + } + + app_server <- function(input, output, session) { + ret_value <- mod[["server"]](afmm) + + ret_value_update_count <- shiny::reactiveVal(0) + shiny::observeEvent(ret_value[["subj_id"]](), ret_value_update_count(ret_value_update_count() + 1)) + + shiny::exportTestValues( + ret_value = try(ret_value[["subj_id"]]()), # try because of https://github.com/rstudio/shiny/issues/3768 + update_count = ret_value_update_count() + ) + return(ret_value) + } + + app <- shiny::shinyApp( + ui = app_ui, + server = function(input, output, session) { + ret_value <- app_server(input, output, session) + + ret_value_update_count <- shiny::reactiveVal(0) + shiny::observeEvent(ret_value[["subj_id"]](), ret_value_update_count(ret_value_update_count() + 1)) + + shiny::exportTestValues( + ret_value = try(ret_value[["subj_id"]]()), # try because of https://github.com/rstudio/shiny/issues/3768 + update_count = ret_value_update_count() + ) + } + ) + + test_that("module adheres to send_subject_id_to_papo protocol", { + app <- shinytest2::AppDriver$new(app, name = "test_send_subject_id_to_papo_protocol") + + app$wait_for_idle() + + # Module starts and sends no message + exports <- app$get_values()[["export"]] + testthat::expect_equal(exports[["update_count"]], 0) + + trigger_subject_selection <- function(subject_id) { + set_input_params <- append( + as.list(setNames(subject_id, trigger_input_id)), + list(allow_no_input_binding_ = TRUE, priority_ = "event") + ) + do.call(app$set_inputs, set_input_params) + } + + # Module sends exactly one message per trigger event, even if subject does not change + subject_ids <- c("A", "A", "B") + for (i in seq_along(subject_ids)) { + trigger_subject_selection(subject_ids[[i]]) + + exports <- app$get_values()[["export"]] + # Module outputs selection once + testthat::expect_equal(exports[["ret_value"]], subject_ids[[i]]) + testthat::expect_equal(exports[["update_count"]], i) + } + + app$stop() + }) +}) diff --git a/tests/testthat/test-message_papo.R b/tests/testthat/test-message_papo.R index 9e60491..fc7fec8 100644 --- a/tests/testthat/test-message_papo.R +++ b/tests/testthat/test-message_papo.R @@ -1,4 +1,3 @@ -# YT#VH33e387131d296de57ba6b9be8368c156#VH00000000000000000000000000000000# # This is a test template for modules that select a subject ID and send it to dv.papo. # In order to fit it to your module, it needs three pieces of information: @@ -47,81 +46,4 @@ data <- dv.clinlines:::prep_dummy_data() # 3) Fully namespaced input ID that, when set to a subject ID value, should make the module send dv.papo a message. trigger_input_id <- "mod-main_view-debug_select_subject" -# This portion of the test template defines the expected protocol for sending a message to dv.papo and is shared across -# all modules that do so. The first line on this file is a hash of the contents of this `local` section. Its purpose -# is to maintain all copies of this portion of the file synchronized. -# See https://github.com/dull-systems/yours_truelib for more details. -test_harness <- local({ - datasets <- shiny::reactive(data) - - afmm <- list( - unfiltered_dataset = datasets, - filtered_dataset = datasets, - module_output = function() list(), - utils = list(switch2 = function(id) NULL), - dataset_metadata = list(name = shiny::reactive("dummy_dataset_name")) - ) - - app_ui <- function() { - shiny::fluidPage(mod[["ui"]](mod[["module_id"]])) - } - - app_server <- function(input, output, session) { - ret_value <- mod[["server"]](afmm) - - ret_value_update_count <- shiny::reactiveVal(0) - shiny::observeEvent(ret_value[["subj_id"]](), ret_value_update_count(ret_value_update_count() + 1)) - - shiny::exportTestValues( - ret_value = try(ret_value[["subj_id"]]()), # try because of https://github.com/rstudio/shiny/issues/3768 - update_count = ret_value_update_count() - ) - return(ret_value) - } - - app <- shiny::shinyApp( - ui = app_ui, - server = function(input, output, session) { - ret_value <- app_server(input, output, session) - - ret_value_update_count <- shiny::reactiveVal(0) - shiny::observeEvent(ret_value[["subj_id"]](), ret_value_update_count(ret_value_update_count() + 1)) - - shiny::exportTestValues( - ret_value = try(ret_value[["subj_id"]]()), # try because of https://github.com/rstudio/shiny/issues/3768 - update_count = ret_value_update_count() - ) - } - ) - - test_that("module adheres to send_subject_id_to_papo protocol", { - app <- shinytest2::AppDriver$new(app, name = "test_send_subject_id_to_papo_protocol") - - app$wait_for_idle() - - # Module starts and sends no message - exports <- app$get_values()[["export"]] - testthat::expect_equal(exports[["update_count"]], 0) - - trigger_subject_selection <- function(subject_id) { - set_input_params <- append( - as.list(setNames(subject_id, trigger_input_id)), - list(allow_no_input_binding_ = TRUE, priority_ = "event") - ) - do.call(app$set_inputs, set_input_params) - } - - # Module sends exactly one message per trigger event, even if subject does not change - subject_ids <- c("A", "A", "B") - for (i in seq_along(subject_ids)) { - trigger_subject_selection(subject_ids[[i]]) - - exports <- app$get_values()[["export"]] - # Module outputs selection once - testthat::expect_equal(exports[["ret_value"]], subject_ids[[i]]) - testthat::expect_equal(exports[["update_count"]], i) - } - - app$stop() - }) -}) +source("message_papo-common.R", local = TRUE) From 4e25d25c992e3215987591ae474d86145300ea8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?zxBIB=20Lech=C3=B3n=2CMiguel=20=28MED=20BDS=29=20EXTERNAL?= Date: Mon, 14 Oct 2024 09:29:50 +0200 Subject: [PATCH 03/31] Remove duplicates. --- tests/testthat/message_papo-common.R | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/tests/testthat/message_papo-common.R b/tests/testthat/message_papo-common.R index b265cd3..0fc47c9 100644 --- a/tests/testthat/message_papo-common.R +++ b/tests/testthat/message_papo-common.R @@ -1,4 +1,4 @@ -# YT#VH33e387131d296de57ba6b9be8368c156#VH00000000000000000000000000000000# +# YT#VH5dd69916e41809c4f840a95f8558a4f8#VH00000000000000000000000000000000# # This is a test template for modules that select a subject ID and send it to dv.papo. # This portion of the test template defines the expected protocol for sending a message to dv.papo and is shared across @@ -33,20 +33,7 @@ test_harness <- local({ return(ret_value) } - app <- shiny::shinyApp( - ui = app_ui, - server = function(input, output, session) { - ret_value <- app_server(input, output, session) - - ret_value_update_count <- shiny::reactiveVal(0) - shiny::observeEvent(ret_value[["subj_id"]](), ret_value_update_count(ret_value_update_count() + 1)) - - shiny::exportTestValues( - ret_value = try(ret_value[["subj_id"]]()), # try because of https://github.com/rstudio/shiny/issues/3768 - update_count = ret_value_update_count() - ) - } - ) + app <- shiny::shinyApp(ui = app_ui, server = app_server) test_that("module adheres to send_subject_id_to_papo protocol", { app <- shinytest2::AppDriver$new(app, name = "test_send_subject_id_to_papo_protocol") From 79bf4a3ba43022ffb70ae397a9cbef982d099d41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?zxBIB=20Lech=C3=B3n=2CMiguel=20=28MED=20BDS=29=20EXTERNAL?= Date: Mon, 14 Oct 2024 09:58:18 +0200 Subject: [PATCH 04/31] Simplify papo test harness. --- tests/testthat/message_papo-common.R | 68 ---------------------------- tests/testthat/setup.R | 67 +++++++++++++++++++++++++++ tests/testthat/test-message_papo.R | 11 +---- 3 files changed, 68 insertions(+), 78 deletions(-) delete mode 100644 tests/testthat/message_papo-common.R diff --git a/tests/testthat/message_papo-common.R b/tests/testthat/message_papo-common.R deleted file mode 100644 index 0fc47c9..0000000 --- a/tests/testthat/message_papo-common.R +++ /dev/null @@ -1,68 +0,0 @@ -# YT#VH5dd69916e41809c4f840a95f8558a4f8#VH00000000000000000000000000000000# -# This is a test template for modules that select a subject ID and send it to dv.papo. - -# This portion of the test template defines the expected protocol for sending a message to dv.papo and is shared across -# all modules that do so. The first line on this file is a hash of the contents of this `local` section. Its purpose -# is to maintain all copies of this portion of the file synchronized. -# See https://github.com/dull-systems/yours_truelib for more details. -test_harness <- local({ - datasets <- shiny::reactive(data) - - afmm <- list( - unfiltered_dataset = datasets, - filtered_dataset = datasets, - module_output = function() list(), - utils = list(switch2 = function(id) NULL), - dataset_metadata = list(name = shiny::reactive("dummy_dataset_name")) - ) - - app_ui <- function() { - shiny::fluidPage(mod[["ui"]](mod[["module_id"]])) - } - - app_server <- function(input, output, session) { - ret_value <- mod[["server"]](afmm) - - ret_value_update_count <- shiny::reactiveVal(0) - shiny::observeEvent(ret_value[["subj_id"]](), ret_value_update_count(ret_value_update_count() + 1)) - - shiny::exportTestValues( - ret_value = try(ret_value[["subj_id"]]()), # try because of https://github.com/rstudio/shiny/issues/3768 - update_count = ret_value_update_count() - ) - return(ret_value) - } - - app <- shiny::shinyApp(ui = app_ui, server = app_server) - - test_that("module adheres to send_subject_id_to_papo protocol", { - app <- shinytest2::AppDriver$new(app, name = "test_send_subject_id_to_papo_protocol") - - app$wait_for_idle() - - # Module starts and sends no message - exports <- app$get_values()[["export"]] - testthat::expect_equal(exports[["update_count"]], 0) - - trigger_subject_selection <- function(subject_id) { - set_input_params <- append( - as.list(setNames(subject_id, trigger_input_id)), - list(allow_no_input_binding_ = TRUE, priority_ = "event") - ) - do.call(app$set_inputs, set_input_params) - } - - # Module sends exactly one message per trigger event, even if subject does not change - subject_ids <- c("A", "A", "B") - for (i in seq_along(subject_ids)) { - trigger_subject_selection(subject_ids[[i]]) - - exports <- app$get_values()[["export"]] - # Module outputs selection once - testthat::expect_equal(exports[["ret_value"]], subject_ids[[i]]) - testthat::expect_equal(exports[["update_count"]], i) - } - - app$stop() - }) -}) diff --git a/tests/testthat/setup.R b/tests/testthat/setup.R index c3e3334..14eff56 100644 --- a/tests/testthat/setup.R +++ b/tests/testthat/setup.R @@ -11,3 +11,70 @@ vdoc <- local({ }) specs <- vdoc[["specs"]] # validation (F) + +#' Test harness for communication with `dv.papo`. +#' +#' @param mod Parameterized instance of the module to test. Should produce valid output and not trigger a `shiny::req`. +#' @param data Data matching the previous parameterization. +#' @param trigger_input_id Fully namespaced input ID that, when set to a subject ID value, should make the module send `dv.papo` a message. +test_communication_with_papo <- function(mod, data, trigger_input_id) { + datasets <- shiny::reactive(data) + + afmm <- list( + unfiltered_dataset = datasets, + filtered_dataset = datasets, + module_output = function() list(), + utils = list(switch2 = function(id) NULL), + dataset_metadata = list(name = shiny::reactive("dummy_dataset_name")) + ) + + app_ui <- function() { + shiny::fluidPage(mod[["ui"]](mod[["module_id"]])) + } + + app_server <- function(input, output, session) { + ret_value <- mod[["server"]](afmm) + + ret_value_update_count <- shiny::reactiveVal(0) + shiny::observeEvent(ret_value[["subj_id"]](), ret_value_update_count(ret_value_update_count() + 1)) + + shiny::exportTestValues( + ret_value = try(ret_value[["subj_id"]]()), # try because of https://github.com/rstudio/shiny/issues/3768 + update_count = ret_value_update_count() + ) + return(ret_value) + } + + app <- shiny::shinyApp(ui = app_ui, server = app_server) + + test_that("module adheres to send_subject_id_to_papo protocol", { + app <- shinytest2::AppDriver$new(app, name = "test_send_subject_id_to_papo_protocol") + + app$wait_for_idle() + + # Module starts and sends no message + exports <- app$get_values()[["export"]] + testthat::expect_equal(exports[["update_count"]], 0) + + trigger_subject_selection <- function(subject_id) { + set_input_params <- append( + as.list(setNames(subject_id, trigger_input_id)), + list(allow_no_input_binding_ = TRUE, priority_ = "event") + ) + do.call(app$set_inputs, set_input_params) + } + + # Module sends exactly one message per trigger event, even if subject does not change + subject_ids <- c("A", "A", "B") + for (i in seq_along(subject_ids)) { + trigger_subject_selection(subject_ids[[i]]) + + exports <- app$get_values()[["export"]] + # Module outputs selection once + testthat::expect_equal(exports[["ret_value"]], subject_ids[[i]]) + testthat::expect_equal(exports[["update_count"]], i) + } + + app$stop() + }) +} diff --git a/tests/testthat/test-message_papo.R b/tests/testthat/test-message_papo.R index fc7fec8..055983f 100644 --- a/tests/testthat/test-message_papo.R +++ b/tests/testthat/test-message_papo.R @@ -1,7 +1,3 @@ -# This is a test template for modules that select a subject ID and send it to dv.papo. - -# In order to fit it to your module, it needs three pieces of information: -# 1) An instance of the module you want to test, parameterized to produce valid output and not trigger a `shiny::req`. mod <- mod_clinical_timelines( module_id = "mod", basic_info = list( @@ -39,11 +35,6 @@ mod <- mod_clinical_timelines( ms = 50, default_plot_settings = list(x_param = "day", start_day = -5, boxheight_val = 60) ) - -# 2) Data matching the previous parameterization. data <- dv.clinlines:::prep_dummy_data() - -# 3) Fully namespaced input ID that, when set to a subject ID value, should make the module send dv.papo a message. trigger_input_id <- "mod-main_view-debug_select_subject" - -source("message_papo-common.R", local = TRUE) +test_communication_with_papo(mod, data, trigger_input_id) From f13c571f5551118496bb4773ba677aa2cbcb2d3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?zxBIB=20Lech=C3=B3n=2CMiguel=20=28MED=20BDS=29=20EXTERNAL?= Date: Mon, 14 Oct 2024 11:16:11 +0200 Subject: [PATCH 05/31] Tweaks suggested by PR. --- tests/testthat/setup.R | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/testthat/setup.R b/tests/testthat/setup.R index 14eff56..89daec6 100644 --- a/tests/testthat/setup.R +++ b/tests/testthat/setup.R @@ -16,7 +16,8 @@ specs <- vdoc[["specs"]] #' #' @param mod Parameterized instance of the module to test. Should produce valid output and not trigger a `shiny::req`. #' @param data Data matching the previous parameterization. -#' @param trigger_input_id Fully namespaced input ID that, when set to a subject ID value, should make the module send `dv.papo` a message. +#' @param trigger_input_id Fully namespaced input ID that, when set to a subject ID value, +#' should make the module send `dv.papo` a message. test_communication_with_papo <- function(mod, data, trigger_input_id) { datasets <- shiny::reactive(data) @@ -68,6 +69,7 @@ test_communication_with_papo <- function(mod, data, trigger_input_id) { subject_ids <- c("A", "A", "B") for (i in seq_along(subject_ids)) { trigger_subject_selection(subject_ids[[i]]) + app$wait_for_idle() exports <- app$get_values()[["export"]] # Module outputs selection once From 677823fcf48c9b000c9b6f252c994ea0b8a1140a Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Wed, 23 Oct 2024 07:53:55 +0100 Subject: [PATCH 06/31] multiple drugs per patient - POC --- DESCRIPTION | 2 +- R/data_prep.R | 7 ++++--- R/prep_dummy_data.R | 8 ++++++++ R/server_functions_main_view.R | 16 ++++++++++++++-- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 3ba0127..f44e57f 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: dv.clinlines Title: DaVinci's Clinical Timelines -Version: 1.0.4 +Version: 1.0.4-01 Authors@R: c( person("Boehringer-Ingelheim Pharma GmbH & Co.KG", role = c("cph", "fnd")), diff --git a/R/data_prep.R b/R/data_prep.R index 431693f..f0c3fa2 100644 --- a/R/data_prep.R +++ b/R/data_prep.R @@ -328,7 +328,7 @@ set_exp_intervals <- function(data_list, mapping = default_drug_admin(), subjid_ data <- data_list[[mapping$dataset_name]] data <- data %>% - dplyr::group_by(get(subjid_var)) %>% + dplyr::group_by(get(subjid_var), "EXTRT") %>% dplyr::mutate( exp_dose = dplyr::case_when( is.na(dplyr::lag(get(col_list$dose_var))) ~ "start/equal", @@ -351,9 +351,10 @@ set_exp_intervals <- function(data_list, mapping = default_drug_admin(), subjid_ ) ) %>% dplyr::select( - tidyselect::all_of(c(subjid_var, cols[1:2], "set_id", "exp_dose", "detail_var")) + tidyselect::all_of(c(subjid_var, cols[1:2], "set_id", "exp_dose", "detail_var", "EXTRT")) ) %>% - tibble::add_column(group = rep(col_list$label)) %>% + dplyr::mutate(group = EXTRT) %>% + #tibble::add_column(group = rep(col_list$label)) %>% dplyr::rename( start_exp = tidyselect::all_of(col_list$start_var), end_exp = tidyselect::all_of(col_list$end_var) diff --git a/R/prep_dummy_data.R b/R/prep_dummy_data.R index 26a458d..467df46 100644 --- a/R/prep_dummy_data.R +++ b/R/prep_dummy_data.R @@ -42,6 +42,14 @@ prep_dummy_data <- function(n = 200) { dplyr::filter(.data$USUBJID %in% adsl_info$USUBJID) exp_info <- pharmaverseadam::adex %>% + dplyr::distinct(USUBJID, EXTRT, EXDOSE, EXDOSU, EXSTDTC, EXENDTC, .keep_all = TRUE) + + exp_info <- rbind(exp_info[1,], exp_info) + exp_info[1, "EXTRT"] <- "another drug" + exp_info[1, "EXSTDTC"] <- "2013-12-01" + exp_info[1, "EXENDTC"] <- "2013-12-30" + + exp_info <- exp_info %>% dplyr::mutate( EXSTDTC = lubridate::ymd_hm(.data$EXSTDTC, truncated = 2), EXENDTC = lubridate::ymd_hm(.data$EXENDTC, truncated = 2), diff --git a/R/server_functions_main_view.R b/R/server_functions_main_view.R index 89ce114..a9146d9 100644 --- a/R/server_functions_main_view.R +++ b/R/server_functions_main_view.R @@ -214,10 +214,22 @@ create_main_plot <- function(work_data, names(shapes) <- x symbol_color <- colors[unique(work_data[!is.na(work_data$xmin_exp), ]$group)] + symbol_colors <- tibble::tibble(group = work_data$group) %>% + dplyr::mutate( + group = dplyr::case_when( + group == "PLACEBO" ~ symbol_color["PLACEBO"], + group == "XANOMELINE" ~ symbol_color["XANOMELINE"], + group == "another drug" ~ symbol_color["another drug"], + .default = NA + ) + ) + symbol_colors <- symbol_colors[[1]] + # Add drug administration events main_p <- main_p + ggplot2::geom_linerange( - ggplot2::aes(xmin = .data[["xmin_exp"]], xmax = .data[["xmax_exp"]]), + ggplot2::aes(xmin = .data[["xmin_exp"]], xmax = .data[["xmax_exp"]], fill = group), + color = symbol_colors, position = ggplot2::position_nudge(y = 0.35), linewidth = 2 / 140 * height, na.rm = TRUE @@ -225,7 +237,7 @@ create_main_plot <- function(work_data, ggplot2::geom_point( ggplot2::aes(x = .data[[point_exp]], shape = .data[["exp_dose"]]), na.rm = TRUE, - fill = ifelse(length(symbol_color) > 0, symbol_color, "black"), + fill = symbol_colors, #ifelse(length(symbol_color) > 0, symbol_color, "black"), color = "black", position = ggplot2::position_nudge(y = 0.35), size = height / 20 From 8b2fcea938bc81c452d4d5746433e9d97cc53235 Mon Sep 17 00:00:00 2001 From: "Matthias,Korbinian (MED BDS) BIP-DE-B" Date: Mon, 18 Nov 2024 13:58:40 +0000 Subject: [PATCH 07/31] Display multiple drugs per subject POC --- R/data_prep.R | 6 +-- R/prep_dummy_data.R | 8 +-- R/server_functions_main_view.R | 94 ++++++++++++++++++++++++++++------ 3 files changed, 84 insertions(+), 24 deletions(-) diff --git a/R/data_prep.R b/R/data_prep.R index f0c3fa2..583c99c 100644 --- a/R/data_prep.R +++ b/R/data_prep.R @@ -328,7 +328,7 @@ set_exp_intervals <- function(data_list, mapping = default_drug_admin(), subjid_ data <- data_list[[mapping$dataset_name]] data <- data %>% - dplyr::group_by(get(subjid_var), "EXTRT") %>% + dplyr::group_by(get(subjid_var), col_list$detail_var ) %>% #EXTRT dplyr::mutate( exp_dose = dplyr::case_when( is.na(dplyr::lag(get(col_list$dose_var))) ~ "start/equal", @@ -351,9 +351,9 @@ set_exp_intervals <- function(data_list, mapping = default_drug_admin(), subjid_ ) ) %>% dplyr::select( - tidyselect::all_of(c(subjid_var, cols[1:2], "set_id", "exp_dose", "detail_var", "EXTRT")) + tidyselect::all_of(c(subjid_var, cols[1:2], "set_id", "exp_dose", "detail_var", col_list$detail_var)) #"EXTRT" ) %>% - dplyr::mutate(group = EXTRT) %>% + dplyr::mutate(group = dplyr::if_else(!is.na(.data[[col_list$detail_var]]), paste("Drug Administration:", .data[[col_list$detail_var]]), NA)) %>% #EXTRT #tibble::add_column(group = rep(col_list$label)) %>% dplyr::rename( start_exp = tidyselect::all_of(col_list$start_var), diff --git a/R/prep_dummy_data.R b/R/prep_dummy_data.R index 467df46..add4dba 100644 --- a/R/prep_dummy_data.R +++ b/R/prep_dummy_data.R @@ -44,10 +44,10 @@ prep_dummy_data <- function(n = 200) { exp_info <- pharmaverseadam::adex %>% dplyr::distinct(USUBJID, EXTRT, EXDOSE, EXDOSU, EXSTDTC, EXENDTC, .keep_all = TRUE) - exp_info <- rbind(exp_info[1,], exp_info) - exp_info[1, "EXTRT"] <- "another drug" - exp_info[1, "EXSTDTC"] <- "2013-12-01" - exp_info[1, "EXENDTC"] <- "2013-12-30" + # exp_info <- rbind(exp_info[1,], exp_info) + # exp_info[1, "EXTRT"] <- "another drug" + # exp_info[1, "EXSTDTC"] <- "2013-12-01" + # exp_info[1, "EXENDTC"] <- "2013-12-30" exp_info <- exp_info %>% dplyr::mutate( diff --git a/R/server_functions_main_view.R b/R/server_functions_main_view.R index a9146d9..fa2d2e1 100644 --- a/R/server_functions_main_view.R +++ b/R/server_functions_main_view.R @@ -192,14 +192,16 @@ create_main_plot <- function(work_data, position = ggplot2::position_dodge2(0.9), size = 2 / 140 * height, shape = 15, # square - na.rm = TRUE + na.rm = TRUE#, + #show.legend = FALSE ) + # Draw timepoints ggplot2::geom_point( ggplot2::aes(x = .data[["timepoints"]]), position = ggplot2::position_jitter(height = 0.1, width = 0), size = height / 20, - na.rm = TRUE + na.rm = TRUE#, + #show.legend = FALSE ) + x_scale @@ -214,17 +216,46 @@ create_main_plot <- function(work_data, names(shapes) <- x symbol_color <- colors[unique(work_data[!is.na(work_data$xmin_exp), ]$group)] - symbol_colors <- tibble::tibble(group = work_data$group) %>% - dplyr::mutate( - group = dplyr::case_when( - group == "PLACEBO" ~ symbol_color["PLACEBO"], - group == "XANOMELINE" ~ symbol_color["XANOMELINE"], - group == "another drug" ~ symbol_color["another drug"], - .default = NA - ) - ) - symbol_colors <- symbol_colors[[1]] + trt_per_subject <- work_data |> + dplyr::filter(startsWith(.data[["group"]], "Drug Administration:")) |> + dplyr::group_by(subject_id) |> + dplyr::distinct(group) |> + dplyr::count() + + if (any(trt_per_subject$n > 1)) { + position <- 0.5 - (length(symbol_color) + 1)*0.1 + for (x in seq_along(symbol_color)) { + data <- main_p$data |> + dplyr::filter( + .data[["group"]] == names(symbol_color)[x] + ) + pos <- position + 0.1*x + main_p <- main_p + + ggplot2::geom_linerange( + data = data, + ggplot2::aes(xmin = .data[["xmin_exp"]], xmax = .data[["xmax_exp"]], fill = group), + color = symbol_color[x], + position = ggplot2::position_nudge(y = pos),#0.35), + linewidth = 2 / 140 * height, + na.rm = TRUE + )+ + ggplot2::geom_point( + data = data, + ggplot2::aes(x = .data[[point_exp]], shape = .data[["exp_dose"]]), + na.rm = TRUE, + fill = symbol_color[x], #ifelse(length(symbol_color) > 0, symbol_color, "black"), + color = "black", + position = ggplot2::position_nudge(y = pos),#0.35), + size = height / 20 + ) + } + } else { + + + symbol_colors <- sapply(work_data$group, function(x) { + ifelse(x %in% names(symbol_color), symbol_color[[x]], NA) + }, USE.NAMES = FALSE) # Add drug administration events main_p <- main_p + ggplot2::geom_linerange( @@ -242,6 +273,7 @@ create_main_plot <- function(work_data, position = ggplot2::position_nudge(y = 0.35), size = height / 20 ) + } if (length(shapes) > 0) { main_p <- main_p + @@ -249,7 +281,7 @@ create_main_plot <- function(work_data, name = "Dose Change:", values = shapes, na.translate = FALSE, - breaks = x + breaks = x, ) } @@ -366,10 +398,38 @@ create_ggdata_y <- function(p, hover) { dplyr::mutate(y = as.numeric(.data[["y"]])) %>% # to silence dplyr warning dplyr::filter(dplyr::between(.data[["y"]], range_hover_y[1], range_hover_y[2])) - # Drug_admin is always layer 4 - interval_exp_data <- ggdata$data[[4]] %>% - dplyr::mutate(y = as.numeric(.data[["y"]])) %>% # to silence dplyr warning - dplyr::filter(dplyr::between(.data[["y"]], range_hover_y[1], range_hover_y[2])) + + + if (length(ggdata$data) > 4) { + df_list <- lapply(4:length(ggdata$data), function(x) { + dataset_names <- names(ggdata$data[[x]]) + if ("y" %in% dataset_names && !("shape" %in% dataset_names)) { + ret_data <- ggdata$data[[x]] %>% + dplyr::mutate(y = as.numeric(.data[["y"]])) %>% # to silence dplyr warning + dplyr::filter(dplyr::between(.data[["y"]], range_hover_y[1], range_hover_y[2])) + + if (nrow(ret_data) > 0) { + ret_data + } else { + NULL + } + } + }) + + if (length(purrr::compact(df_list)) > 0) { + interval_exp_data <- purrr::compact(df_list)[[1]] + } else { + interval_exp_data <- ggdata$data[[4]] %>% + dplyr::mutate(y = as.numeric(.data[["y"]])) %>% # to silence dplyr warning + dplyr::filter(dplyr::between(.data[["y"]], range_hover_y[1], range_hover_y[2])) + } + + } else { + # Drug_admin is always layer 4 + interval_exp_data <- ggdata$data[[4]] %>% + dplyr::mutate(y = as.numeric(.data[["y"]])) %>% # to silence dplyr warning + dplyr::filter(dplyr::between(.data[["y"]], range_hover_y[1], range_hover_y[2])) + } return(list(interval_data, timepoint_data, interval_point_data, interval_exp_data)) } From e06dd005197f51470e2081a16eeabc24a93b4545 Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Tue, 19 Nov 2024 15:01:08 +0000 Subject: [PATCH 08/31] Fix start/equal symbols and shape legend --- R/data_prep.R | 2 +- R/server_functions_main_view.R | 72 +++++++++++++++++----------------- 2 files changed, 36 insertions(+), 38 deletions(-) diff --git a/R/data_prep.R b/R/data_prep.R index 583c99c..98a0b06 100644 --- a/R/data_prep.R +++ b/R/data_prep.R @@ -328,7 +328,7 @@ set_exp_intervals <- function(data_list, mapping = default_drug_admin(), subjid_ data <- data_list[[mapping$dataset_name]] data <- data %>% - dplyr::group_by(get(subjid_var), col_list$detail_var ) %>% #EXTRT + dplyr::group_by(get(subjid_var), get(col_list$detail_var)) %>% #EXTRT dplyr::mutate( exp_dose = dplyr::case_when( is.na(dplyr::lag(get(col_list$dose_var))) ~ "start/equal", diff --git a/R/server_functions_main_view.R b/R/server_functions_main_view.R index fa2d2e1..1147848 100644 --- a/R/server_functions_main_view.R +++ b/R/server_functions_main_view.R @@ -191,17 +191,15 @@ create_main_plot <- function(work_data, ggplot2::aes(x = .data[["interval_points"]]), position = ggplot2::position_dodge2(0.9), size = 2 / 140 * height, - shape = 15, # square - na.rm = TRUE#, - #show.legend = FALSE + shape = 15, + na.rm = TRUE ) + # Draw timepoints ggplot2::geom_point( ggplot2::aes(x = .data[["timepoints"]]), position = ggplot2::position_jitter(height = 0.1, width = 0), size = height / 20, - na.rm = TRUE#, - #show.legend = FALSE + na.rm = TRUE ) + x_scale @@ -223,19 +221,22 @@ create_main_plot <- function(work_data, dplyr::count() if (any(trt_per_subject$n > 1)) { - position <- 0.5 - (length(symbol_color) + 1)*0.1 - for (x in seq_along(symbol_color)) { + position <- 0.5 - (length(symbol_color) + 1) * 0.1 + for (i in seq_along(symbol_color)) { data <- main_p$data |> dplyr::filter( - .data[["group"]] == names(symbol_color)[x] + .data[["group"]] == names(symbol_color)[i] ) - pos <- position + 0.1*x + # Transform symbol_color[i] into a vector to fix legend + # (ggplot2 doing ggplot2 things...) + symbol_colors <- rep(symbol_color[i], nrow(data)) + pos <- position + 0.1 * i main_p <- main_p + ggplot2::geom_linerange( data = data, ggplot2::aes(xmin = .data[["xmin_exp"]], xmax = .data[["xmax_exp"]], fill = group), - color = symbol_color[x], - position = ggplot2::position_nudge(y = pos),#0.35), + color = symbol_colors, + position = ggplot2::position_nudge(y = pos), linewidth = 2 / 140 * height, na.rm = TRUE )+ @@ -243,36 +244,33 @@ create_main_plot <- function(work_data, data = data, ggplot2::aes(x = .data[[point_exp]], shape = .data[["exp_dose"]]), na.rm = TRUE, - fill = symbol_color[x], #ifelse(length(symbol_color) > 0, symbol_color, "black"), + fill = symbol_colors, color = "black", - position = ggplot2::position_nudge(y = pos),#0.35), - size = height / 20 + position = ggplot2::position_nudge(y = pos) ) } } else { + symbol_colors <- sapply(work_data$group, function(x) { + ifelse(x %in% names(symbol_color), symbol_color[[x]], NA) + }, USE.NAMES = FALSE) - - - symbol_colors <- sapply(work_data$group, function(x) { - ifelse(x %in% names(symbol_color), symbol_color[[x]], NA) - }, USE.NAMES = FALSE) - # Add drug administration events - main_p <- main_p + - ggplot2::geom_linerange( - ggplot2::aes(xmin = .data[["xmin_exp"]], xmax = .data[["xmax_exp"]], fill = group), - color = symbol_colors, - position = ggplot2::position_nudge(y = 0.35), - linewidth = 2 / 140 * height, - na.rm = TRUE - ) + - ggplot2::geom_point( - ggplot2::aes(x = .data[[point_exp]], shape = .data[["exp_dose"]]), - na.rm = TRUE, - fill = symbol_colors, #ifelse(length(symbol_color) > 0, symbol_color, "black"), - color = "black", - position = ggplot2::position_nudge(y = 0.35), - size = height / 20 - ) + # Add drug administration events + main_p <- main_p + + ggplot2::geom_linerange( + ggplot2::aes(xmin = .data[["xmin_exp"]], xmax = .data[["xmax_exp"]], fill = group), + color = symbol_colors, + position = ggplot2::position_nudge(y = 0.35), + linewidth = 2 / 140 * height, + na.rm = TRUE + ) + + ggplot2::geom_point( + ggplot2::aes(x = .data[[point_exp]], shape = .data[["exp_dose"]]), + na.rm = TRUE, + fill = symbol_colors, + color = "black", + position = ggplot2::position_nudge(y = 0.35), + size = height / 20 + ) } if (length(shapes) > 0) { @@ -281,7 +279,7 @@ create_main_plot <- function(work_data, name = "Dose Change:", values = shapes, na.translate = FALSE, - breaks = x, + breaks = x ) } From 06985b4033ba1bb3d904b11116630b9484d06e79 Mon Sep 17 00:00:00 2001 From: "Matthias,Korbinian (MED BDS) BIP-DE-B" Date: Mon, 25 Nov 2024 07:50:34 +0000 Subject: [PATCH 09/31] Add size to geom_point --- R/server_functions_main_view.R | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/R/server_functions_main_view.R b/R/server_functions_main_view.R index 1147848..c5934d8 100644 --- a/R/server_functions_main_view.R +++ b/R/server_functions_main_view.R @@ -246,7 +246,8 @@ create_main_plot <- function(work_data, na.rm = TRUE, fill = symbol_colors, color = "black", - position = ggplot2::position_nudge(y = pos) + position = ggplot2::position_nudge(y = pos), + size = height / 20 ) } } else { From a25619ea1dea7f8fe7ad9f07db4310ac679d7806 Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Tue, 26 Nov 2024 15:17:28 +0000 Subject: [PATCH 10/31] add color_palette argument --- R/mock_with_mm.R | 10 +++++++++- R/mod_clinical_timelines.R | 8 +++++++- R/server_functions_main_view.R | 30 +++++++++++++++++++++++++----- 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/R/mock_with_mm.R b/R/mock_with_mm.R index 631360b..faa1040 100644 --- a/R/mock_with_mm.R +++ b/R/mock_with_mm.R @@ -83,7 +83,15 @@ mock_with_mm_app <- function() { x_param = "day", start_day = -5, boxheight_val = 60 - ) + )#, + # color_palette = list( + # "Treatment End" = "blue", + # "Treatment Start" = "red", + # "Drug Administration: PLACEBO" = "yellow", + # "Drug Administration: XANOMELINE" = "green", + # "Informed Consent" = "black", + # "Adverse Events" = "brown" + # ) ) ) diff --git a/R/mod_clinical_timelines.R b/R/mod_clinical_timelines.R index 66650b7..295f996 100644 --- a/R/mod_clinical_timelines.R +++ b/R/mod_clinical_timelines.R @@ -105,6 +105,7 @@ mod_clinical_timelines_server <- function(module_id, filter = NULL, subjid_var = "USUBJID", start_day = NULL, + color_palette = NULL, ms = 1000, receiver_id = NULL, afmm_param = NULL) { @@ -154,6 +155,7 @@ mod_clinical_timelines_server <- function(module_id, checkmate::assert_string(receiver_id, min.chars = 1, null.ok = TRUE, add = ac) checkmate::assert_list(afmm_param, null.ok = TRUE, add = ac) checkmate::reportAssertions(ac) + check_valid_color(color_palette) shiny::moduleServer( module_id, @@ -201,7 +203,9 @@ mod_clinical_timelines_server <- function(module_id, # Set a fixed color for each group colors_groups <- shiny::reactive({ - if (nrow(pre_data()) > 0) color_lookup(unique(pre_data()$group)) + if (nrow(pre_data()) > 0) { + color_lookup(unique(pre_data()$group), color_palette) + } }) # Add adverse event data that are relevant for filtering @@ -443,6 +447,7 @@ mod_clinical_timelines <- function(module_id, start_day = NULL, boxheight_val = 60 ), + color_palette = NULL, ms = 1000, receiver_id = NULL) { # Check validity of arguments that won't be checked in UI/server @@ -481,6 +486,7 @@ mod_clinical_timelines <- function(module_id, filter = filter, subjid_var = subjid_var, start_day = default_plot_settings$start_day, + color_palette = color_palette, ms = ms, receiver_id = receiver_id, afmm_param = list(utils = afmm$utils, module_names = afmm$module_names) diff --git a/R/server_functions_main_view.R b/R/server_functions_main_view.R index c5934d8..3e5498c 100644 --- a/R/server_functions_main_view.R +++ b/R/server_functions_main_view.R @@ -1,3 +1,15 @@ +check_valid_color <- function(color_palette) { + + hex_colors <- color_palette[grepl('^#', color_palette)] + no_colors <- hex_colors[!grepl("^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$", hex_colors)] + other_colors <- color_palette[!grepl('^#', color_palette)] + no_colors <- c(no_colors, other_colors[!other_colors %in% colors()]) + + if (length(no_colors) > 0) { + stop(paste("Invalid color(s) in color_palette:", paste(no_colors, collapse = ", "))) + } +} + #' Create color lookup table #' #' \code{color_lookup} returns a named vector of hex colors. @@ -9,12 +21,20 @@ #' @return A named vector of hexcode colors. #' @keywords internal #' -color_lookup <- function(groups) { - colors_groups <- scales::hue_pal()(length(groups)) +color_lookup <- function(groups, color_palette) { + + if (is.null(color_palette)) { + colors_groups <- scales::hue_pal()(length(groups)) - # Avoid that neighbor intervals get similar colors - set.seed(20220202) - names(colors_groups) <- sample(groups) + # Avoid that neighbor intervals get similar colors + set.seed(20220202) + names(colors_groups) <- sample(groups) + } else { + missing_groups <- groups[!groups %in% names(color_palette)] + grey_vec <- rep("grey", length(missing_groups)) + names(grey_vec) <- missing_groups + colors_groups <- c(color_palette, grey_vec) + } return(colors_groups) } From d35a9b71f1b78ee13fe7ff268c0eef676e15aae0 Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Wed, 27 Nov 2024 09:12:09 +0000 Subject: [PATCH 11/31] Refine color_palette checks --- R/mock_with_mm.R | 2 +- R/mod_clinical_timelines.R | 6 ++++++ R/server_functions_main_view.R | 13 ++++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/R/mock_with_mm.R b/R/mock_with_mm.R index faa1040..089af80 100644 --- a/R/mock_with_mm.R +++ b/R/mock_with_mm.R @@ -84,7 +84,7 @@ mock_with_mm_app <- function() { start_day = -5, boxheight_val = 60 )#, - # color_palette = list( + # color_palette = c( # "Treatment End" = "blue", # "Treatment Start" = "red", # "Drug Administration: PLACEBO" = "yellow", diff --git a/R/mod_clinical_timelines.R b/R/mod_clinical_timelines.R index 295f996..1bc2653 100644 --- a/R/mod_clinical_timelines.R +++ b/R/mod_clinical_timelines.R @@ -154,6 +154,8 @@ mod_clinical_timelines_server <- function(module_id, checkmate::assert_numeric(ms, len = 1, add = ac) checkmate::assert_string(receiver_id, min.chars = 1, null.ok = TRUE, add = ac) checkmate::assert_list(afmm_param, null.ok = TRUE, add = ac) + checkmate::assert_character(color_palette, add = ac) + checkmate::assert_character(names(color_palette), unique = TRUE, add = ac) checkmate::reportAssertions(ac) check_valid_color(color_palette) @@ -298,7 +300,11 @@ mod_clinical_timelines_server <- function(module_id, #' (defaults to NULL, using the day of the earliest event to be displayed), #' \code{boxheight_val} contains a value between 30 and 150 defining the initial height of #' the individual timeline plot boxes at app launch (defaults to 60). +#' @param color_palette `[character(1+) | NULL]` #' +#' A named vector that specifies the colors for drawing events or intervals. +#' Each name in the vector should correspond to an entry in the legend. +#' If \code{NULL} (default), the default color palette is used. #' @param ms `[numeric(1)]` #' #' Single numeric value indicating how many milliseconds to wait before the plot diff --git a/R/server_functions_main_view.R b/R/server_functions_main_view.R index 3e5498c..32e1c0c 100644 --- a/R/server_functions_main_view.R +++ b/R/server_functions_main_view.R @@ -1,7 +1,17 @@ +#' Check if colors are valid +#' +#' Executes an error action in case of wrong color definitions. +#' +#' @param color_palette Vector containing strings that are meant to specify +#' a color, either as 6-digit hex color starting with the # symbol, or as +#' R color string like received when executing `colors()`. +#' +#' @keywords internal +#' check_valid_color <- function(color_palette) { hex_colors <- color_palette[grepl('^#', color_palette)] - no_colors <- hex_colors[!grepl("^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$", hex_colors)] + no_colors <- hex_colors[!grepl("^#([A-Fa-f0-9]{6})$", hex_colors)] other_colors <- color_palette[!grepl('^#', color_palette)] no_colors <- c(no_colors, other_colors[!other_colors %in% colors()]) @@ -10,6 +20,7 @@ check_valid_color <- function(color_palette) { } } + #' Create color lookup table #' #' \code{color_lookup} returns a named vector of hex colors. From 885360beaea76e51f16e2fba6b758bfba0d07664 Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Wed, 27 Nov 2024 10:12:02 +0000 Subject: [PATCH 12/31] Update mod call to enable users to specify trt_var --- R/data_prep.R | 25 +++++++++++++++++-------- R/helpers.R | 18 +++++++++++------- R/mock_with_mm.R | 1 + R/mod_clinical_timelines.R | 25 +++++++++++++++++-------- R/prep_dummy_data.R | 1 + README.md | 1 + vignettes/ae-filter.Rmd | 1 + vignettes/clinlines.Rmd | 12 ++++++++---- vignettes/communication.Rmd | 1 + 9 files changed, 58 insertions(+), 27 deletions(-) diff --git a/R/data_prep.R b/R/data_prep.R index 98a0b06..ae5dea4 100644 --- a/R/data_prep.R +++ b/R/data_prep.R @@ -19,9 +19,11 @@ prep_data <- function(data_list, drug_admin = default_drug_admin(), subjid_var = "USUBJID", filter = NULL) { + if (is.null(drug_admin)) { empty_drug_admin <- data.frame( subjects = character(), + treatment = character(), start = lubridate::ymd_hm(), end = lubridate::ymd_hm(), details = character(), @@ -34,6 +36,7 @@ prep_data <- function(data_list, drug_admin <- list( dataset_name = "no_da", + trt_var = "character", start_var = "start", end_var = "end", detail_var = "details", @@ -324,11 +327,14 @@ set_events_intern <- function(data_list, mapping = default_mapping(), subjid_var set_exp_intervals <- function(data_list, mapping = default_drug_admin(), subjid_var) { col_list <- mapping[!names(mapping) %in% c("dataset_name")] - cols <- c(col_list$start_var, col_list$end_var, col_list$detail_var) + cols <- c(col_list$start_var, col_list$end_var, col_list$detail_var, col_list$trt_var) data <- data_list[[mapping$dataset_name]] + check_names(data, cols, subjid_var) + check_date_type(data, c(col_list$start_var, col_list$end_var)) + data <- data %>% - dplyr::group_by(get(subjid_var), get(col_list$detail_var)) %>% #EXTRT + dplyr::group_by(get(subjid_var), get(col_list$trt_var)) %>% dplyr::mutate( exp_dose = dplyr::case_when( is.na(dplyr::lag(get(col_list$dose_var))) ~ "start/equal", @@ -339,9 +345,6 @@ set_exp_intervals <- function(data_list, mapping = default_drug_admin(), subjid_ ) %>% dplyr::ungroup() - check_names(data, cols, subjid_var) - check_date_type(data, c(col_list$start_var, col_list$end_var)) - interval_df <- data %>% dplyr::mutate( detail_var = paste( @@ -349,12 +352,18 @@ set_exp_intervals <- function(data_list, mapping = default_drug_admin(), subjid_ .data[[col_list$dose_var]], .data[[col_list$dose_unit_var]] ) + # trt_var = .data[[col_list$trt_var]] ) %>% dplyr::select( - tidyselect::all_of(c(subjid_var, cols[1:2], "set_id", "exp_dose", "detail_var", col_list$detail_var)) #"EXTRT" + tidyselect::all_of(c(subjid_var, cols[1:2], "set_id", "exp_dose", "detail_var", col_list$trt_var)) + ) %>% + dplyr::mutate( + group = dplyr::if_else( + !is.na(.data[[col_list$detail_var]]), + paste("Drug Administration:", .data[[col_list$trt_var]]), + NA + ) ) %>% - dplyr::mutate(group = dplyr::if_else(!is.na(.data[[col_list$detail_var]]), paste("Drug Administration:", .data[[col_list$detail_var]]), NA)) %>% #EXTRT - #tibble::add_column(group = rep(col_list$label)) %>% dplyr::rename( start_exp = tidyselect::all_of(col_list$start_var), end_exp = tidyselect::all_of(col_list$end_var) diff --git a/R/helpers.R b/R/helpers.R index 70deefb..740886c 100644 --- a/R/helpers.R +++ b/R/helpers.R @@ -77,25 +77,28 @@ set_event <- function(start_dt_var, #' #' @param dataset_name Character name of the data frame that holds drug administration data #' (e.g. ex domain) as it is called in the \code{data_list} parameter. +#' @param trt_var Character name of the variable that contains the treatment name. +#' Must be present in the data frame mentioned in the \code(dataset_name) element. #' @param start_var Character name of the variable that contains the start dates -#' (e.g. exposure start dates). Must be present in the data frame mentioned in the name -#' element. +#' (e.g. exposure start dates). Must be present in the data frame mentioned in the +#' \code(dataset_name) element. #' @param end_var Character name of the variable that contains the end dates -#' (e.g. exposure start dates). Must be present in the data frame mentioned in the name -#' element. +#' (e.g. exposure start dates). Must be present in the data frame mentioned in the +#' \code(dataset_name) element. #' @param detail_var Character name of the variable that contains the treatment -#' information. Must exist in the dataset mentioned in the name element. +#' information. Must exist in the dataset mentioned in the \code(dataset_name) element. #' @param label Free-text character label for the drug administration event. #' @param dose_var Character name of the variable that contains the dosis level -#' information. Must exist in the dataset mentioned in the name element. +#' information. Must exist in the dataset mentioned in the \code(dataset_name) element. #' @param dose_unit_var Character name of the variable that contains the dosis unit. -#' Must exist in the dataset mentioned in the name element. +#' Must exist in the dataset mentioned in the \code(dataset_name) element. #' #' @return A list that could directly be used as input for the \code{drug_admin} parameter #' of \code{mod_clinical_timelines()} and \code{mod_clinical_timelines_server()}. #' @export #' set_drug_admin <- function(dataset_name, + trt_var, start_var, end_var, detail_var, @@ -105,6 +108,7 @@ set_drug_admin <- function(dataset_name, return( list( dataset_name = dataset_name, + trt_var = trt_var, start_var = start_var, end_var = end_var, detail_var = detail_var, diff --git a/R/mock_with_mm.R b/R/mock_with_mm.R index 089af80..e35f052 100644 --- a/R/mock_with_mm.R +++ b/R/mock_with_mm.R @@ -60,6 +60,7 @@ mock_with_mm_app <- function() { ), drug_admin = list( dataset_name = "exp", + trt_var = "EXTRT", start_var = "EXSTDTC", end_var = "EXENDTC", detail_var = "EXTRT", diff --git a/R/mod_clinical_timelines.R b/R/mod_clinical_timelines.R index 1bc2653..d5d7d1c 100644 --- a/R/mod_clinical_timelines.R +++ b/R/mod_clinical_timelines.R @@ -138,7 +138,13 @@ mod_clinical_timelines_server <- function(module_id, checkmate::assert_list(drug_admin, types = "character", null.ok = TRUE, add = ac) checkmate::assert_subset( names(drug_admin), - choices = c("dataset_name", "start_var", "end_var", "detail_var", "label", "dose_var", "dose_unit_var"), + choices = c( + "dataset_name", + "trt_var", + "start_var", "end_var", + "detail_var", "label", + "dose_var", "dose_unit_var" + ), add = ac ) checkmate::assert_list(filter, types = "list", null.ok = TRUE, add = ac) @@ -154,8 +160,8 @@ mod_clinical_timelines_server <- function(module_id, checkmate::assert_numeric(ms, len = 1, add = ac) checkmate::assert_string(receiver_id, min.chars = 1, null.ok = TRUE, add = ac) checkmate::assert_list(afmm_param, null.ok = TRUE, add = ac) - checkmate::assert_character(color_palette, add = ac) - checkmate::assert_character(names(color_palette), unique = TRUE, add = ac) + checkmate::assert_character(color_palette, null.ok = TRUE, add = ac) + checkmate::assert_character(names(color_palette), null.ok = TRUE, unique = TRUE, add = ac) checkmate::reportAssertions(ac) check_valid_color(color_palette) @@ -387,19 +393,22 @@ mod_clinical_timelines_server <- function(module_id, #' \item{\code{dataset_name}: Character name of the dataset that holds drug administration data #' (e.g. ex domain), as it is called in the datalist that is provided to the #' \pkg{modulemanager}.} +#' \item{\code{trt_var}: Character name of the variable that contains the +#' treatment name which must be present in the dataset mentioned in the +#' \code{dataset_name} element.} #' \item{\code{start_var}: Character name of the variable that contains the start dates #' (e.g. exposure start dates) which must be present in the dataset mentioned in the -#' \code{name} element.} +#' \code{dataset_name} element.} #' \item{\code{end_var}: Character name of the variable that contains the end dates #' (e.g. exposure end dates) which must be present in the dataset mentioned in the -#' \code{name} element.} +#' \code{dataset_name} element.} #' \item{\code{detail_var}: Character name of the variable that contains the treatment -#' information. Must exist in the dataset mentioned in the \code{name} element.} +#' information. Must exist in the dataset mentioned in the \code{dataset_name} element.} #' \item{\code{label}: Free-text character label for the drug administration event.} #' \item{\code{dose_var}: Character name of the variable that contains the dosis level -#' information. Must exist in the dataset mentioned in the \code{name} element.} +#' information. Must exist in the dataset mentioned in the \code{dataset_name} element.} #' \item{\code{dose_unit_var}: Character name of the variable that contains the dosis -#' unit. Must exist in the dataset mentioned in the \code{name} element.} +#' unit. Must exist in the dataset mentioned in the \code{dataset_name} element.} #' } #' #' \cr diff --git a/R/prep_dummy_data.R b/R/prep_dummy_data.R index add4dba..84f6530 100644 --- a/R/prep_dummy_data.R +++ b/R/prep_dummy_data.R @@ -143,6 +143,7 @@ default_drug_admin <- function() { return( list( dataset_name = "exp", + trt_var = "EXTRT", start_var = "EXSTDTC", end_var = "EXENDTC", detail_var = "EXTRT", diff --git a/README.md b/README.md index ab68910..877e322 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,7 @@ module_list <- list( ), drug_admin = list( dataset_name = "exp", + trt_var = "EXTRT", start_var = "EXSTDTC", end_var = "EXENDTC", detail_var = "EXTRT", diff --git a/vignettes/ae-filter.Rmd b/vignettes/ae-filter.Rmd index 76d3af4..b5c7e8d 100644 --- a/vignettes/ae-filter.Rmd +++ b/vignettes/ae-filter.Rmd @@ -98,6 +98,7 @@ module_list <- list( ), drug_admin = list( dataset_name = "exp", + trt_var = "EXTRT", start_var = "EXSTDTC", end_var = "EXENDTC", detail_var = "EXTRT", diff --git a/vignettes/clinlines.Rmd b/vignettes/clinlines.Rmd index 6f87b2c..9661111 100644 --- a/vignettes/clinlines.Rmd +++ b/vignettes/clinlines.Rmd @@ -117,16 +117,18 @@ These second level lists contain the variable names that are needed to plot the - `drug_admin`: A list of named character strings that describes which variables to use to display drug administration events. If not NULL, it must contain the following elements: - `dataset_name`: Character name of the dataset that holds drug administration data (e.g. ex domain), as it is called in the datalist that is provided to the modulemanager. + + - `trt_var`: Character name of the variable that contains the treatment name which must be present in the dataset mentioned in the `dataset_name` element. - - `start_var`: Character name of the variable that contains the start dates (e.g. exposure start dates) which must be present in the dataset mentioned in the name element. + - `start_var`: Character name of the variable that contains the start dates (e.g. exposure start dates) which must be present in the dataset mentioned in the `dataset_name` element. - - `end_var`: Character name of the variable that contains the end dates (e.g. exposure end dates) which must be present in the dataset mentioned in the name element. + - `end_var`: Character name of the variable that contains the end dates (e.g. exposure end dates) which must be present in the dataset mentioned in the `dataset_name` element. - - `detail_var`: Character name of the variable that contains the treatment information. Must exist in the dataset mentioned in the name element. + - `detail_var`: Character name of the variable that contains the treatment information. Must exist in the dataset mentioned in the `dataset_name` element. - `label`: Free-text character label for the drug administration event. - - `dose_var`: Character name of the variable that contains the dosis level information. Must exist in the dataset mentioned in the name element. + - `dose_var`: Character name of the variable that contains the dosis level information. Must exist in the dataset mentioned in the `dataset_name` element. - `dose_unit_var`: Character name of the variable that contains the dosis unit. Must exist in the dataset mentioned in the name element. @@ -218,6 +220,7 @@ module_list <- list( ), drug_admin = set_drug_admin( dataset_name = "adex", + trt_var = "EXTRT", start_var = "EXSTDTC", end_var = "EXENDTC", detail_var = "EXTRT", @@ -307,6 +310,7 @@ module_list <- list( ), drug_admin = set_drug_admin( dataset_name = "adex", + trt_var = "EXTRT", start_var = "EXSTDTC", end_var = "EXENDTC", detail_var = "EXTRT", diff --git a/vignettes/communication.Rmd b/vignettes/communication.Rmd index 273a8b5..aec3ac6 100644 --- a/vignettes/communication.Rmd +++ b/vignettes/communication.Rmd @@ -45,6 +45,7 @@ module_list <- list( ), drug_admin = set_drug_admin( dataset_name = "adex", + trt_var = "EXTRT", start_var = "EXSTDTC", end_var = "EXENDTC", detail_var = "EXTRT", From 59482e63fe374ab2304218a106cb6f0d0651d092 Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Wed, 27 Nov 2024 11:14:10 +0000 Subject: [PATCH 13/31] fix unit tests --- R/data_prep.R | 13 ++++++------- tests/testthat/apps/bmk_app/app.R | 1 + tests/testthat/apps/large_app/app.R | 1 + tests/testthat/apps/mm_app/app.R | 1 + tests/testthat/test-data_prep.R | 18 ++++++++++++++---- tests/testthat/test-helpers.R | 4 ++-- tests/testthat/test-prep_dummy_data.R | 1 + .../testthat/test-server_functions_main_view.R | 8 ++++---- 8 files changed, 30 insertions(+), 17 deletions(-) diff --git a/R/data_prep.R b/R/data_prep.R index ae5dea4..f2087f5 100644 --- a/R/data_prep.R +++ b/R/data_prep.R @@ -36,7 +36,7 @@ prep_data <- function(data_list, drug_admin <- list( dataset_name = "no_da", - trt_var = "character", + trt_var = "treatment", start_var = "start", end_var = "end", detail_var = "details", @@ -344,23 +344,22 @@ set_exp_intervals <- function(data_list, mapping = default_drug_admin(), subjid_ ) ) %>% dplyr::ungroup() - interval_df <- data %>% dplyr::mutate( detail_var = paste( .data[[col_list$detail_var]], "-", .data[[col_list$dose_var]], .data[[col_list$dose_unit_var]] - ) - # trt_var = .data[[col_list$trt_var]] + ), + trt_var = .data[[col_list$trt_var]] ) %>% dplyr::select( - tidyselect::all_of(c(subjid_var, cols[1:2], "set_id", "exp_dose", "detail_var", col_list$trt_var)) + tidyselect::all_of(c(subjid_var, cols[1:2], "set_id", "exp_dose", "detail_var", "trt_var")) ) %>% dplyr::mutate( group = dplyr::if_else( - !is.na(.data[[col_list$detail_var]]), - paste("Drug Administration:", .data[[col_list$trt_var]]), + !is.na(.data[["trt_var"]]), + paste("Drug Administration:", .data[["trt_var"]]), NA ) ) %>% diff --git a/tests/testthat/apps/bmk_app/app.R b/tests/testthat/apps/bmk_app/app.R index 4761d17..2f78e33 100644 --- a/tests/testthat/apps/bmk_app/app.R +++ b/tests/testthat/apps/bmk_app/app.R @@ -63,6 +63,7 @@ bmk_server <- function(input, output, session) { ), drug_admin = list( dataset_name = "exp", + trt_var = "EXTRT", start_var = "EXSTDTC", end_var = "EXENDTC", detail_var = "EXTRT", diff --git a/tests/testthat/apps/large_app/app.R b/tests/testthat/apps/large_app/app.R index 84f8ab3..8b2317b 100644 --- a/tests/testthat/apps/large_app/app.R +++ b/tests/testthat/apps/large_app/app.R @@ -78,6 +78,7 @@ clinlines <- dv.clinlines::mod_clinical_timelines( ), drug_admin = list( dataset_name = "exp", + trt_var = "EXTRT", start_var = "EXSTDTC", end_var = "EXENDTC", detail_var = "EXTRT", diff --git a/tests/testthat/apps/mm_app/app.R b/tests/testthat/apps/mm_app/app.R index 025b04d..bf62ae7 100644 --- a/tests/testthat/apps/mm_app/app.R +++ b/tests/testthat/apps/mm_app/app.R @@ -47,6 +47,7 @@ clinlines <- dv.clinlines::mod_clinical_timelines( ), drug_admin = list( dataset_name = "exp", + trt_var = "EXTRT", start_var = "EXSTDTC", end_var = "EXENDTC", detail_var = "EXTRT", diff --git a/tests/testthat/test-data_prep.R b/tests/testthat/test-data_prep.R index 53d1182..cd4c877 100644 --- a/tests/testthat/test-data_prep.R +++ b/tests/testthat/test-data_prep.R @@ -61,7 +61,7 @@ test_that( expected <- c( "subject_id", "set_id", "group", "set", "start_dt_var", "end_dt_var", "detail_var", "TRTSDT", "TRTEDT", "arrow_right", "earliest", "start_dy_var", "end_dy_var", - "resetted", "start_exp", "end_exp", "start_exp_day", "end_exp_day", + "resetted", "trt_var", "start_exp", "end_exp", "start_exp_day", "end_exp_day", "exp_dose", "start_missing", "end_missing", "arrow_left", "date_min", "day_min" ) expected_w_filter <- c(expected, "AESER", "AESOC", "AEDECOD", "AESTDTC", "AEENDTC") @@ -160,7 +160,17 @@ test_that("set_exo_intervals() returns a data.frame with fixed column names", { df_exp <- set_exp_intervals(data_list, subjid_var = "USUBJID") expect_true("data.frame" %in% class(df_exp)) - expect_named(df_exp, c("subject_id", "start_exp", "end_exp", "set_id", "exp_dose", "detail_var", "group", "set")) + expect_named(df_exp, c( + "subject_id", + "start_exp", + "end_exp", + "set_id", + "exp_dose", + "detail_var", + "trt_var", + "group", + "set" + )) }) @@ -199,7 +209,7 @@ test_that("set_events_intern() adds flags for arrows and missing values", { # Tests for combine_data() ---- test_that("combine_data() names output columns correctly", { expected <- c( - "subject_id", "group", "start_dt_var", "end_dt_var", "detail_var", + "subject_id", "group", "trt_var", "start_dt_var", "end_dt_var", "detail_var", "TRTSDT", "TRTEDT", "earliest", "set", "set_id", "start_exp", "end_exp", "exp_dose", "arrow_right", "start_missing", "end_missing", "arrow_left" ) @@ -221,7 +231,7 @@ test_that("complete_events() returns date columns as type date", { test_that("complete_events() names output columns correctly", { expected <- c( - "subject_id", "group", "start_dt_var", "end_dt_var", "detail_var", + "subject_id", "group", "trt_var", "start_dt_var", "end_dt_var", "detail_var", "TRTSDT", "TRTEDT", "earliest", "set", "set_id", "arrow_right", "start_dy_var", "end_dy_var", "start_exp", "end_exp", "resetted", "start_exp_day", "end_exp_day", "exp_dose", "start_missing", "end_missing", "arrow_left" diff --git a/tests/testthat/test-helpers.R b/tests/testthat/test-helpers.R index 4536d3c..49e5cf9 100644 --- a/tests/testthat/test-helpers.R +++ b/tests/testthat/test-helpers.R @@ -33,11 +33,11 @@ test_that("set_event() returns a named list", { # Tests for set_drug_admin() ---- test_that("set_drug_admin() returns a named list", { outcome <- set_drug_admin( - dataset_name = "exp", start_var = "start date", end_var = "end date", + dataset_name = "exp", trt_var = "treatment", start_var = "start date", end_var = "end date", label = "some label", detail_var = "some details", dose_var = "dose", dose_unit_var = "unit" ) expected <- list( - dataset_name = "exp", start_var = "start date", end_var = "end date", + dataset_name = "exp", trt_var = "treatment", start_var = "start date", end_var = "end date", detail_var = "some details", label = "some label", dose_var = "dose", dose_unit_var = "unit" ) expect_equal(outcome, expected) diff --git a/tests/testthat/test-prep_dummy_data.R b/tests/testthat/test-prep_dummy_data.R index 2a562b1..7bb2898 100644 --- a/tests/testthat/test-prep_dummy_data.R +++ b/tests/testthat/test-prep_dummy_data.R @@ -57,6 +57,7 @@ test_that("default_drug_admin() returns a named list with default settings", { outcome <- default_drug_admin() expected <- list( dataset_name = "exp", + trt_var = "EXTRT", start_var = "EXSTDTC", end_var = "EXENDTC", detail_var = "EXTRT", diff --git a/tests/testthat/test-server_functions_main_view.R b/tests/testthat/test-server_functions_main_view.R index 5b68eb0..353e0b9 100644 --- a/tests/testthat/test-server_functions_main_view.R +++ b/tests/testthat/test-server_functions_main_view.R @@ -97,7 +97,7 @@ df <- prep_data( ) ) -colors <- color_lookup(unique(df$group)) +colors <- color_lookup(unique(df$group), NULL) time_range <- lubridate::ymd_hm(c("2012-08-05 12:00", "2022-01-03 12:35")) p_df <- create_plot_data(df, time_range, unique(df$group)) p <- create_main_plot(p_df, "earliest", time_range, colors, 50, "subject_id") @@ -312,7 +312,7 @@ test_that("create_main_plot() returns a plot object for plottable settings", { ## create data for testServer tests df <- prep_data(add_ids(prep_dummy_data(n = 2))) ## create color vector for testServer tests -colors <- color_lookup(c("Treatment Start", "Adverse Events")) +colors <- color_lookup(c("Treatment Start", "Adverse Events"), NULL) ## set changed to an arbitrary value changed <- shiny::reactive(1) ## create function to be used for testServer tests @@ -481,7 +481,7 @@ test_that( vdoc[["add_spec"]](specs$plot_specs$drug_admin_event), { df <- prep_data(add_ids(prep_dummy_data(n = 3))) - colors <- color_lookup(c("Drug Administration", "Treatment Start")) + colors <- color_lookup(c("Drug Administration", "Treatment Start"), NULL) shiny::testServer( server_func, @@ -517,6 +517,6 @@ test_that( # Tests for color_lookup() ---- test_that("color_lookup() returns a named vector of hex colors" %>% vdoc[["add_spec"]](specs$plot_specs$colors), { - colors <- color_lookup(c("a", "b")) + colors <- color_lookup(c("a", "b"), NULL) expect_named(colors, c("a", "b"), ignore.order = TRUE) }) From d9ce092e26c52f9319b091503a5cde6e9baa0c2c Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Wed, 27 Nov 2024 12:43:29 +0000 Subject: [PATCH 14/31] Add tests for customizable colors --- NEWS.md | 5 +++++ inst/validation/specs.R | 1 + .../testthat/test-server_functions_main_view.R | 17 ++++++++++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 19817b4..850371c 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,8 @@ +# dv.clinlines 1.0.5 + +* Display drug administration information in different colors, depending on the treatment name. +* Allowing for customized color palettes. + # dv.clinlines 1.0.4 * Adapt basic_info, filter, and drug_admin parameter to adhere module standard diff --git a/inst/validation/specs.R b/inst/validation/specs.R index 271cff6..8890518 100644 --- a/inst/validation/specs.R +++ b/inst/validation/specs.R @@ -11,6 +11,7 @@ plot_specs <- specs_list( "event_types" = "The plot displays events that reflect a milestone (timepoint) as bullet, and events that reflect a time period (interval) as horizontal line on the timeline.", "drug_admin_event" = "Drug administration events additionally indicate trough different marker shapes if the drug dose changed compared to the last administration (equal, decrease, increase).", "colors" = "Events are displayed in a type specific color. A legend indicates which color refers to which event type.", + "customizable_colors" = "Event/interval colors can be customized.", "hovering" = "The plot provides a hover-over function in the sense that hovering with the mouse over a subject row triggers a tooltip to appear to list events in direct proximity to the mouse position, including event type, date(s) and further details (e.g. preferred term, medication name, …).", "errors" = "If the plot cannot be generated, the module displays an informative message why this is the case and how to proceed." ) diff --git a/tests/testthat/test-server_functions_main_view.R b/tests/testthat/test-server_functions_main_view.R index 353e0b9..4195e77 100644 --- a/tests/testthat/test-server_functions_main_view.R +++ b/tests/testthat/test-server_functions_main_view.R @@ -515,8 +515,23 @@ test_that( # Tests for color_lookup() ---- -test_that("color_lookup() returns a named vector of hex colors" %>% +test_that("color_lookup() returns a named vector of hex colors as default colors" %>% vdoc[["add_spec"]](specs$plot_specs$colors), { colors <- color_lookup(c("a", "b"), NULL) expect_named(colors, c("a", "b"), ignore.order = TRUE) }) + +test_that("color_lookup() returns a customized color palette as is" %>% + vdoc[["add_spec"]](specs$plot_specs$customizable_colors), { + color_palette <- c("a" = "blue", "b" = "red") + colors <- color_lookup(c("a", "b"), color_palette) + expect_equal(colors, color_palette) +}) + +test_that("color_lookup() adds grey for missing events in customized color palette" %>% + vdoc[["add_spec"]](specs$plot_specs$customizable_colors), { + color_palette <- c("a" = "blue") + colors <- color_lookup(c("a", "b"), color_palette) + expected <- c("a" = "blue", b = "grey") + expect_equal(colors, expected) +}) From def9193f209e5a20d7ac87fa16b879161524e71d Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Fri, 29 Nov 2024 08:33:02 +0000 Subject: [PATCH 15/31] Add test for check_valid_color() function --- tests/testthat/test-server_functions_main_view.R | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/testthat/test-server_functions_main_view.R b/tests/testthat/test-server_functions_main_view.R index 4195e77..a8180ca 100644 --- a/tests/testthat/test-server_functions_main_view.R +++ b/tests/testthat/test-server_functions_main_view.R @@ -514,6 +514,21 @@ test_that( ) +# Tests for check_valid_color() ---- +test_that("check_valid_color() detects invalid colors", { + color_palette <- c( + "#1afe56", # hex color with 6 numbers/letters: valid + "#AAFFBB", # hex color with 6 letters: valid + "#225577", # hex color with 6 numbers: valid + "#1e", # hex color with only 2 numbers/letters: invalid + "#lmnopq", # hex color with 6 invalid letters: invalid + "blue", # R color: valid + "no_color" # no R color: invalid + ) + expect_error(check_valid_color(color_palette), "^.*#1e, #lmnopq, no_color.*$") +}) + + # Tests for color_lookup() ---- test_that("color_lookup() returns a named vector of hex colors as default colors" %>% vdoc[["add_spec"]](specs$plot_specs$colors), { From 8a409ffa0d5c85f4036becc7e247e507d2836d45 Mon Sep 17 00:00:00 2001 From: "Matthias,Korbinian (MED BDS) BIP-DE-B" Date: Thu, 5 Dec 2024 09:40:47 +0000 Subject: [PATCH 16/31] Fix tooltip --- R/prep_dummy_data.R | 2 +- R/server_functions_main_view.R | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/R/prep_dummy_data.R b/R/prep_dummy_data.R index 84f6530..64b3717 100644 --- a/R/prep_dummy_data.R +++ b/R/prep_dummy_data.R @@ -65,7 +65,7 @@ prep_dummy_data <- function(n = 200) { subject_id = .data$USUBJID ) - return(list(adsl = adsl_info, adae = adae_info, adcm = adcm_info, exp = exp_info, exp2 = exp_empty)) + return(list(adsl = adsl_info, adae = adae_info, adcm = adcm_info, exp = exp_info))#, exp2 = exp_empty)) } diff --git a/R/server_functions_main_view.R b/R/server_functions_main_view.R index 32e1c0c..4f77b5a 100644 --- a/R/server_functions_main_view.R +++ b/R/server_functions_main_view.R @@ -658,7 +658,7 @@ get_groups <- function(ggdata_y, color_map, x_range) { dplyr::mutate( # Assign event names based on the color event = purrr::map_chr( - .data[["colour"]], ~ names(color_map[which(color_map == .x)]) + .data[["colour"]], ~ ifelse(.x != "", names(color_map[which(color_map == .x)]), NA) ), xmin = as.numeric(.data[["xmin"]]), # to silence dplyr warning xmax = as.numeric(.data[["xmax"]]) From f2af6a57d60adb19c78ffa85b1691111dd4d369f Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Tue, 10 Dec 2024 07:57:46 +0000 Subject: [PATCH 17/31] update switch2 to switch2mod --- DESCRIPTION | 3 +-- R/mod_clinical_timelines.R | 2 +- R/server_functions_main_view.R | 6 +++--- tests/testthat/setup.R | 2 +- tests/testthat/test-data_prep.R | 2 +- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index f44e57f..c683d09 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -21,7 +21,6 @@ Imports: bslib (>= 0.6.1), checkmate (>= 2.3.1), dplyr (>= 1.1.0), - dv.manager (>= 2.1.0), ggplot2 (>= 3.4.4), lubridate (>= 1.9.3), magrittr (>= 2.0.3), @@ -47,6 +46,6 @@ Suggests: Config/testthat/edition: 3 Roxygen: list(markdown = TRUE) RoxygenNote: 7.3.1 -Remotes: boehringer-ingelheim/dv.manager@v2.1.2 +Remotes: boehringer-ingelheim/dv.manager@v2.1.4 VignetteBuilder: knitr diff --git a/R/mod_clinical_timelines.R b/R/mod_clinical_timelines.R index d5d7d1c..7ea04af 100644 --- a/R/mod_clinical_timelines.R +++ b/R/mod_clinical_timelines.R @@ -251,7 +251,7 @@ mod_clinical_timelines_server <- function(module_id, type = "message" ) } else if (!is.null(receiver_id)) { - afmm_param$utils$switch2(afmm_param$module_names[[receiver_id]]) + afmm_param$utils$switch2mod(receiver_id) } }) diff --git a/R/server_functions_main_view.R b/R/server_functions_main_view.R index 4f77b5a..7f6fec1 100644 --- a/R/server_functions_main_view.R +++ b/R/server_functions_main_view.R @@ -10,9 +10,9 @@ #' check_valid_color <- function(color_palette) { - hex_colors <- color_palette[grepl('^#', color_palette)] + hex_colors <- color_palette[grepl("^#", color_palette)] no_colors <- hex_colors[!grepl("^#([A-Fa-f0-9]{6})$", hex_colors)] - other_colors <- color_palette[!grepl('^#', color_palette)] + other_colors <- color_palette[!grepl("^#", color_palette)] no_colors <- c(no_colors, other_colors[!other_colors %in% colors()]) if (length(no_colors) > 0) { @@ -270,7 +270,7 @@ create_main_plot <- function(work_data, position = ggplot2::position_nudge(y = pos), linewidth = 2 / 140 * height, na.rm = TRUE - )+ + ) + ggplot2::geom_point( data = data, ggplot2::aes(x = .data[[point_exp]], shape = .data[["exp_dose"]]), diff --git a/tests/testthat/setup.R b/tests/testthat/setup.R index 89daec6..a5fe4bf 100644 --- a/tests/testthat/setup.R +++ b/tests/testthat/setup.R @@ -25,7 +25,7 @@ test_communication_with_papo <- function(mod, data, trigger_input_id) { unfiltered_dataset = datasets, filtered_dataset = datasets, module_output = function() list(), - utils = list(switch2 = function(id) NULL), + utils = list(switch2mod = function(id) NULL), dataset_metadata = list(name = shiny::reactive("dummy_dataset_name")) ) diff --git a/tests/testthat/test-data_prep.R b/tests/testthat/test-data_prep.R index cd4c877..9531f89 100644 --- a/tests/testthat/test-data_prep.R +++ b/tests/testthat/test-data_prep.R @@ -27,7 +27,7 @@ combined_data <- combine_data( # Tests for add_ids() ---- test_that("add_ids() returns a named list", { - expect_named(data_list, c("adsl", "adae", "adcm", "exp", "exp2"), ignore.order = TRUE) + expect_named(data_list, c("adsl", "adae", "adcm", "exp"), ignore.order = TRUE) expect_type(data_list, "list") }) From a6a192ee8187449ca63a8178468d353bfe05c60d Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Tue, 10 Dec 2024 09:39:43 +0000 Subject: [PATCH 18/31] update mock apps --- R/mock_clinical_timelines.R | 3 +++ R/mock_with_mm.R | 6 ++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/R/mock_clinical_timelines.R b/R/mock_clinical_timelines.R index 89ee5cf..517942e 100644 --- a/R/mock_clinical_timelines.R +++ b/R/mock_clinical_timelines.R @@ -69,6 +69,7 @@ mock_clinical_timelines_server <- function(input, output, session) { ), drug_admin = list( dataset_name = "exp", + trt_var = "EXTRT", start_var = "EXSTDTC", end_var = "EXENDTC", detail_var = "EXTRT", @@ -87,6 +88,7 @@ mock_clinical_timelines_server <- function(input, output, session) { drug_rel_ae_var = "AEREL" ) ), + start_day = -5, ms = 50 ) } @@ -98,6 +100,7 @@ mock_clinical_timelines_server <- function(input, output, session) { #' \code{mock_clinical_timelines_app()} runs the \pkg{dv.clinlines} module #' with dummy data. Local adverse event filters included. #' +#' @export mock_clinical_timelines_app <- function() { shiny::shinyApp( ui = mock_clinical_timelines_UI, diff --git a/R/mock_with_mm.R b/R/mock_with_mm.R index e35f052..54a2703 100644 --- a/R/mock_with_mm.R +++ b/R/mock_with_mm.R @@ -4,8 +4,6 @@ #' module manager surface. Displays data from the \pkg{pharmaverseadam} package. #' #' @export -#' @keywords internal -#' mock_with_mm_app <- function() { # Specifiy dataset list for modulemanager dataset_list <- list( @@ -90,8 +88,8 @@ mock_with_mm_app <- function() { # "Treatment Start" = "red", # "Drug Administration: PLACEBO" = "yellow", # "Drug Administration: XANOMELINE" = "green", - # "Informed Consent" = "black", - # "Adverse Events" = "brown" + # "Informed Consent" = "purple", + # "Adverse Events" = "orange" # ) ) ) From 7719e81a253d1a3bdf49155ce2e37ceaf48e6b47 Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Tue, 10 Dec 2024 09:51:09 +0000 Subject: [PATCH 19/31] Update NEWS file. --- NEWS.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 850371c..5a834cb 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,7 +1,9 @@ # dv.clinlines 1.0.5 * Display drug administration information in different colors, depending on the treatment name. -* Allowing for customized color palettes. +* Allow for customized color palettes. +* Use dv.manager's switch2mod() instead of deprecated switch2() function. +* Export mock app. # dv.clinlines 1.0.4 From c19fe285545e5ebf74a869834cdf41d8788f997c Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Tue, 10 Dec 2024 15:27:17 +0000 Subject: [PATCH 20/31] fix legend label issue when drug_admin = NULL; fix error when only timepoints are specified --- R/mock_with_mm.R | 4 +- R/mod_main_view.R | 14 +- R/server_functions_main_view.R | 126 +++++++++--------- tests/testthat/test-mod_clinical_timelines.R | 32 +++++ .../test-server_functions_main_view.R | 10 +- 5 files changed, 118 insertions(+), 68 deletions(-) diff --git a/R/mock_with_mm.R b/R/mock_with_mm.R index 54a2703..77a6d9d 100644 --- a/R/mock_with_mm.R +++ b/R/mock_with_mm.R @@ -5,14 +5,14 @@ #' #' @export mock_with_mm_app <- function() { - # Specifiy dataset list for modulemanager + # Specifiy dataset list for module manager dataset_list <- list( dummyData1 = prep_dummy_data(20), dummyData2 = prep_dummy_data(200) ) - # Define module list for modulemanager + # Define module list for module manager module_list <- list( "Clinical Timelines" = mod_clinical_timelines( module_id = "mod1", diff --git a/R/mod_main_view.R b/R/mod_main_view.R index 4c50454..60718c8 100644 --- a/R/mod_main_view.R +++ b/R/mod_main_view.R @@ -194,9 +194,19 @@ mod_main_view_server <- function(module_id, initial_data, changed, cache$date_day_range <<- list( date = c( min(initial_data()$date_min), - max(c(initial_data()$end_dt_var, initial_data()$end_exp), na.rm = TRUE) + max(c( + initial_data()$start_dt_var, + initial_data()$end_dt_var, + initial_data()$start_exp, + initial_data()$end_exp + ), na.rm = TRUE) ), - day = c(start_day, max(c(initial_data()$end_dy_var, initial_data()$end_exp_day), na.rm = TRUE)) + day = c(start_day, max(c( + initial_data()$start_dy_var, + initial_data()$end_dy_var, + initial_data()$start_exp_day, + initial_data()$end_exp_day + ), na.rm = TRUE)) ) } diff --git a/R/server_functions_main_view.R b/R/server_functions_main_view.R index 7f6fec1..d16e0ae 100644 --- a/R/server_functions_main_view.R +++ b/R/server_functions_main_view.R @@ -234,85 +234,87 @@ create_main_plot <- function(work_data, ) + x_scale + # Only if Drug Administration is defined + if (!all(is.na(work_data$trt_var))) { + x <- sort(unique(stats::na.omit(work_data$exp_dose))) + + shapes <- dplyr::case_when( + x == "decrease" ~ 25, + x == "increase" ~ 24, + x == "start/equal" ~ 23 + ) + names(shapes) <- x + symbol_color <- colors[unique(work_data[!is.na(work_data$xmin_exp), ]$group)] + + trt_per_subject <- work_data |> + dplyr::filter(startsWith(.data[["group"]], "Drug Administration:")) |> + dplyr::group_by(subject_id) |> + dplyr::distinct(group) |> + dplyr::count() + + if (any(trt_per_subject$n > 1)) { + position <- 0.5 - (length(symbol_color) + 1) * 0.1 + for (i in seq_along(symbol_color)) { + data <- main_p$data |> + dplyr::filter( + .data[["group"]] == names(symbol_color)[i] + ) + # Transform symbol_color[i] into a vector to fix legend + # (ggplot2 doing ggplot2 things...) + symbol_colors <- rep(symbol_color[i], nrow(data)) + pos <- position + 0.1 * i + main_p <- main_p + + ggplot2::geom_linerange( + data = data, + ggplot2::aes(xmin = .data[["xmin_exp"]], xmax = .data[["xmax_exp"]], fill = group), + color = symbol_colors, + position = ggplot2::position_nudge(y = pos), + linewidth = 2 / 140 * height, + na.rm = TRUE + ) + + ggplot2::geom_point( + data = data, + ggplot2::aes(x = .data[[point_exp]], shape = .data[["exp_dose"]]), + na.rm = TRUE, + fill = symbol_colors, + color = "black", + position = ggplot2::position_nudge(y = pos), + size = height / 20 + ) + } + } else { + symbol_colors <- sapply(work_data$group, function(x) { + ifelse(x %in% names(symbol_color), symbol_color[[x]], NA) + }, USE.NAMES = FALSE) - x <- sort(unique(stats::na.omit(work_data$exp_dose))) - - shapes <- dplyr::case_when( - x == "decrease" ~ 25, - x == "increase" ~ 24, - x == "start/equal" ~ 23 - ) - names(shapes) <- x - symbol_color <- colors[unique(work_data[!is.na(work_data$xmin_exp), ]$group)] - - trt_per_subject <- work_data |> - dplyr::filter(startsWith(.data[["group"]], "Drug Administration:")) |> - dplyr::group_by(subject_id) |> - dplyr::distinct(group) |> - dplyr::count() - - if (any(trt_per_subject$n > 1)) { - position <- 0.5 - (length(symbol_color) + 1) * 0.1 - for (i in seq_along(symbol_color)) { - data <- main_p$data |> - dplyr::filter( - .data[["group"]] == names(symbol_color)[i] - ) - # Transform symbol_color[i] into a vector to fix legend - # (ggplot2 doing ggplot2 things...) - symbol_colors <- rep(symbol_color[i], nrow(data)) - pos <- position + 0.1 * i + # Add drug administration events main_p <- main_p + ggplot2::geom_linerange( - data = data, ggplot2::aes(xmin = .data[["xmin_exp"]], xmax = .data[["xmax_exp"]], fill = group), color = symbol_colors, - position = ggplot2::position_nudge(y = pos), + position = ggplot2::position_nudge(y = 0.35), linewidth = 2 / 140 * height, na.rm = TRUE ) + ggplot2::geom_point( - data = data, ggplot2::aes(x = .data[[point_exp]], shape = .data[["exp_dose"]]), na.rm = TRUE, fill = symbol_colors, color = "black", - position = ggplot2::position_nudge(y = pos), + position = ggplot2::position_nudge(y = 0.35), size = height / 20 ) } - } else { - symbol_colors <- sapply(work_data$group, function(x) { - ifelse(x %in% names(symbol_color), symbol_color[[x]], NA) - }, USE.NAMES = FALSE) - - # Add drug administration events - main_p <- main_p + - ggplot2::geom_linerange( - ggplot2::aes(xmin = .data[["xmin_exp"]], xmax = .data[["xmax_exp"]], fill = group), - color = symbol_colors, - position = ggplot2::position_nudge(y = 0.35), - linewidth = 2 / 140 * height, - na.rm = TRUE - ) + - ggplot2::geom_point( - ggplot2::aes(x = .data[[point_exp]], shape = .data[["exp_dose"]]), - na.rm = TRUE, - fill = symbol_colors, - color = "black", - position = ggplot2::position_nudge(y = 0.35), - size = height / 20 - ) - } - if (length(shapes) > 0) { - main_p <- main_p + - ggplot2::scale_shape_manual( - name = "Dose Change:", - values = shapes, - na.translate = FALSE, - breaks = x - ) + if (length(shapes) > 0) { + main_p <- main_p + + ggplot2::scale_shape_manual( + name = "Dose Change:", + values = shapes, + na.translate = FALSE, + breaks = x + ) + } } # Add arrows for open intervals diff --git a/tests/testthat/test-mod_clinical_timelines.R b/tests/testthat/test-mod_clinical_timelines.R index 61c6d94..3d7e578 100644 --- a/tests/testthat/test-mod_clinical_timelines.R +++ b/tests/testthat/test-mod_clinical_timelines.R @@ -69,6 +69,38 @@ test_that("mod_main_view_server() returns the subject ID the user clicked on" %> ) }) +test_that( + "mod_main_view_server() runs even if there is no drug admin information", + { + df <- prep_dummy_data(n = 2) + df <- data_list[names(data_list) != "exp"] + + server_func <- function(id, data_name, dataset_list) { + mod_clinical_timelines_server( + module_id = id, + data_name = data_name, + dataset_list = dataset_list, + drug_admin = NULL + ) + } + + expect_no_error( + shiny::testServer( + server_func, + args = list( + id = "test", + data_name = shiny::reactive("test"), + dataset_list = shiny::reactive(df) + ), + { + session$flushReact() + } + ) + ) + } +) + + # Tests using mm_app app_dir <- "./apps/mm_app" diff --git a/tests/testthat/test-server_functions_main_view.R b/tests/testthat/test-server_functions_main_view.R index a8180ca..13341db 100644 --- a/tests/testthat/test-server_functions_main_view.R +++ b/tests/testthat/test-server_functions_main_view.R @@ -481,7 +481,10 @@ test_that( vdoc[["add_spec"]](specs$plot_specs$drug_admin_event), { df <- prep_data(add_ids(prep_dummy_data(n = 3))) - colors <- color_lookup(c("Drug Administration", "Treatment Start"), NULL) + colors <- color_lookup( + c(paste("Drug Administration:", c("PLACEBO", "XANOMELINE")), "Treatment Start"), + NULL + ) shiny::testServer( server_func, @@ -502,7 +505,10 @@ test_that( x_scale = "date", y_sort = "alphanum", height = 50, - filter_event = c("Treatment Start", "Drug Administration") + filter_event = c( + "Treatment Start", + paste("Drug Administration:", c("PLACEBO", "XANOMELINE")) + ) ) session$flushReact() From 69e79ebe3a3234de7ebae1d0852d6f17c0e9147b Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Wed, 11 Dec 2024 07:17:05 +0000 Subject: [PATCH 21/31] tests: update snapshot and get rid of warnings --- R/server_functions_main_view.R | 2 +- tests/testthat/_snaps/server_functions_main_view.md | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/R/server_functions_main_view.R b/R/server_functions_main_view.R index d16e0ae..1562bab 100644 --- a/R/server_functions_main_view.R +++ b/R/server_functions_main_view.R @@ -290,7 +290,7 @@ create_main_plot <- function(work_data, # Add drug administration events main_p <- main_p + ggplot2::geom_linerange( - ggplot2::aes(xmin = .data[["xmin_exp"]], xmax = .data[["xmax_exp"]], fill = group), + ggplot2::aes(xmin = .data[["xmin_exp"]], xmax = .data[["xmax_exp"]]), color = symbol_colors, position = ggplot2::position_nudge(y = 0.35), linewidth = 2 / 140 * height, diff --git a/tests/testthat/_snaps/server_functions_main_view.md b/tests/testthat/_snaps/server_functions_main_view.md index 80831a3..b1ab64e 100644 --- a/tests/testthat/_snaps/server_functions_main_view.md +++ b/tests/testthat/_snaps/server_functions_main_view.md @@ -104,7 +104,8 @@ [1] 50 $filter_event - [1] "Treatment Start" "Drug Administration" + [1] "Treatment Start" "Drug Administration: PLACEBO" + [3] "Drug Administration: XANOMELINE" $time_range [1] "2012-08-15 00:00:00 UTC" "2015-01-01 01:00:00 UTC" From d3a85116b6c3cb5246af0550e698a8aeb9784a9a Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Wed, 11 Dec 2024 07:22:20 +0000 Subject: [PATCH 22/31] solve commented_code_linter findings --- R/mock_with_mm.R | 4 +++- R/prep_dummy_data.R | 5 ----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/R/mock_with_mm.R b/R/mock_with_mm.R index 77a6d9d..a0d25c2 100644 --- a/R/mock_with_mm.R +++ b/R/mock_with_mm.R @@ -82,7 +82,8 @@ mock_with_mm_app <- function() { x_param = "day", start_day = -5, boxheight_val = 60 - )#, + ) + # nolint start: commented_code_linter # color_palette = c( # "Treatment End" = "blue", # "Treatment Start" = "red", @@ -91,6 +92,7 @@ mock_with_mm_app <- function() { # "Informed Consent" = "purple", # "Adverse Events" = "orange" # ) + # nolint end ) ) diff --git a/R/prep_dummy_data.R b/R/prep_dummy_data.R index 64b3717..011efa2 100644 --- a/R/prep_dummy_data.R +++ b/R/prep_dummy_data.R @@ -44,11 +44,6 @@ prep_dummy_data <- function(n = 200) { exp_info <- pharmaverseadam::adex %>% dplyr::distinct(USUBJID, EXTRT, EXDOSE, EXDOSU, EXSTDTC, EXENDTC, .keep_all = TRUE) - # exp_info <- rbind(exp_info[1,], exp_info) - # exp_info[1, "EXTRT"] <- "another drug" - # exp_info[1, "EXSTDTC"] <- "2013-12-01" - # exp_info[1, "EXENDTC"] <- "2013-12-30" - exp_info <- exp_info %>% dplyr::mutate( EXSTDTC = lubridate::ymd_hm(.data$EXSTDTC, truncated = 2), From 88b76961bdb0306c2534f3df0d16e813200c4b76 Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Wed, 11 Dec 2024 07:53:20 +0000 Subject: [PATCH 23/31] update documentation --- DESCRIPTION | 3 +-- NAMESPACE | 1 + NEWS.md | 1 + R/mock_clinical_timelines.R | 2 +- man/check_valid_color.Rd | 17 +++++++++++++++++ man/color_lookup.Rd | 2 +- man/figures/clin-tl_main_view.PNG | Bin 65085 -> 230420 bytes man/mock_with_mm_app.Rd | 1 - man/mod_clinical_timelines.Rd | 20 +++++++++++++++----- man/mod_clinical_timelines_server.Rd | 20 +++++++++++++++----- man/prep_data.Rd | 13 ++++++++----- man/set_drug_admin.Rd | 18 +++++++++++------- vignettes/clinlines.Rmd | 7 ++++++- 13 files changed, 77 insertions(+), 28 deletions(-) create mode 100644 man/check_valid_color.Rd diff --git a/DESCRIPTION b/DESCRIPTION index c683d09..40bad31 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -45,7 +45,6 @@ Suggests: testthat (>= 3.2.1) Config/testthat/edition: 3 Roxygen: list(markdown = TRUE) -RoxygenNote: 7.3.1 +RoxygenNote: 7.3.2 Remotes: boehringer-ingelheim/dv.manager@v2.1.4 VignetteBuilder: knitr - diff --git a/NAMESPACE b/NAMESPACE index 1563a74..60a44a1 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -4,6 +4,7 @@ export("%>%") export(default_basic_info) export(default_drug_admin) export(default_mapping) +export(mock_clinical_timelines_app) export(mock_with_mm_app) export(mod_clinical_timelines) export(mod_clinical_timelines_UI) diff --git a/NEWS.md b/NEWS.md index 5a834cb..caf8437 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,6 +4,7 @@ * Allow for customized color palettes. * Use dv.manager's switch2mod() instead of deprecated switch2() function. * Export mock app. +* Fix error occurring in case only timepoints (i.e., no intervals) are specified. # dv.clinlines 1.0.4 diff --git a/R/mock_clinical_timelines.R b/R/mock_clinical_timelines.R index 517942e..aa2829e 100644 --- a/R/mock_clinical_timelines.R +++ b/R/mock_clinical_timelines.R @@ -10,7 +10,7 @@ mock_clinical_timelines_UI <- function(id = NULL) { # nolint ui <- shiny::fluidPage( theme = bslib::bs_theme(version = "4"), - shiny::tags$h1("BI Clinical Timelines", class = "mod-title"), + shiny::tags$h1("DaVinci's Clinical Timelines Module", class = "mod-title"), mod_clinical_timelines_UI( ns("clin_tl"), list("serious_ae_var", "soc_var", "pref_term_var", "drug_rel_ae_var") diff --git a/man/check_valid_color.Rd b/man/check_valid_color.Rd new file mode 100644 index 0000000..01d5abc --- /dev/null +++ b/man/check_valid_color.Rd @@ -0,0 +1,17 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/server_functions_main_view.R +\name{check_valid_color} +\alias{check_valid_color} +\title{Check if colors are valid} +\usage{ +check_valid_color(color_palette) +} +\arguments{ +\item{color_palette}{Vector containing strings that are meant to specify +a color, either as 6-digit hex color starting with the # symbol, or as +R color string like received when executing \code{colors()}.} +} +\description{ +Executes an error action in case of wrong color definitions. +} +\keyword{internal} diff --git a/man/color_lookup.Rd b/man/color_lookup.Rd index 9ac368d..7892a1d 100644 --- a/man/color_lookup.Rd +++ b/man/color_lookup.Rd @@ -4,7 +4,7 @@ \alias{color_lookup} \title{Create color lookup table} \usage{ -color_lookup(groups) +color_lookup(groups, color_palette) } \arguments{ \item{groups}{Character vector of unique event types of the data to be diff --git a/man/figures/clin-tl_main_view.PNG b/man/figures/clin-tl_main_view.PNG index b045e5bf2a6b80ba090fb3a868e9aefc4ea5bda7..c67d30b1e3735c5d4ae49da5c61cac06fd38b00b 100644 GIT binary patch literal 230420 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 M^Gp7;%!iu)2L%PQ-v9sr literal 65085 zcmeFZ2~bnn*Ds1a*@{X#04f6APAH=|FbE{t&LH5#7$7PjB7`u=OcHGcRD?7lpdzFd z1IiSEkN|QoNl?7i1s z`?sdO*3RuyPRCX*-?&^&O>O0g?6@2>!h+^teZan%b(yg?kAd`P@%UP0?}U@WFF2KH~~urE$Oo z{rQQb9zSZ9#qSVjYC0P;5|W(&e6_e$1zOF&w|>stM3)_04K1#@|9_YN1uxq=h9~C~ z`s%`X)zSvp1ZuBWohK@uP{fsSTKb@VtvVe$KHm3cbalF@nGiU2cL z%YYCH&iP8SqOv#FpplY8fBtUBD)MT%8!iSJ)7DTy_!%0e!jHLrS-fk49f-9rU3SjB zUfK{T@Hdd&W{ivMX{{PbxLf0$kwON($IFD@5j6zO>F+Hd)^CEK9O8RVl&KEH)OjxA z=)8`N2|^#^{Orx=cN&Sz$8|d&$GM5RpJq3>YTxle|9a+dee`6*(AaQ5qpt*GTqhGC zS6b%DKj3%I4ihMWQwrQFa=nT=Icku%GTTOPC<-r#&(6*rGML~51nS6QPu^?mdR{zx zh7~2>6rCOoJ&nlUHHB-N2zF!TrDl@i*WXy2Nm!3>AkbpOSsx;MmxMH{Wpq=&+{VOA!I@yQgDP~zFVd2k1I4RQudCV%wsOA9a*uA-z{aadV ziMmq8rD#%o{7@nEV_fU#iL!WRKA@l*EJ8l>sy$#xh^6xySXiL%Y+(Fs!}kL`XA;CY zs?}KQ%2^=mk0x}VYi6?XN?Q^{lyCefHC9j00@E;Powx1*OtE z(8l`tK)Hs(FUCcrf67ahKTr^DSB>slWbo%dy#irF`-GVAS$(%3>J`hO2(eU)HJXMCWnAfAzI=8J z)n59pkQ3246~z&kf39frI{vAFFW<4K8?Grv>xqinGB>iGwovu<@^5k6dWNgR;T7(z zC;>d3kDfDVw8Pr!Sd6|Y^GVqK7{&05#UrA`v(uuw_4mGNq8?m*Ht9E89Y|cb6m8V{ z;<`Oh>|AGAcPY^3h|lVf`S%$*nN>Nb+VPHo@tgh`_{3jC!JKg)3S2 z3aF~rq3d_blgAD@9b&6fUp160BRDX=UnYUEeCi~rrL)?xO+%t_(o2(Iw|0b^DWYPc z)!FtJwnR)$(!tDWcI_toOxQ2&4&@V|wFA6-pH%_KK!oqT9-gEue0ESeIT~Mx`(FOY z&4THYaB0#H!v+N-IA6DRjj65Z{M=kT+M;fBXfR+oJVJp@(n(?HQzfq^XOa@Vz{Ssk z<`}Rk#PNM(+g%>5UW$Z=s=M2vI7?OV+~*?la$4L@+bE$~;#mXa3Nr!|CO2k_9R|2M z)TWq^e)U+6syq|`v~YWvib+RUS-gZ$T(hzpHQYPdBo@UEr)JP6*`eaw4g*)Jdb*>c z60{uQ#ZAhnIx4z8rql-_M}NNn<-g4{4g|(;lZ%0DVKlJCs6ZBPhF~PeD_!Fi8GTa+ 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

_?cDFvpKM>u+148 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 diff --git a/man/mock_with_mm_app.Rd b/man/mock_with_mm_app.Rd index 4b54be6..0f1e406 100644 --- a/man/mock_with_mm_app.Rd +++ b/man/mock_with_mm_app.Rd @@ -10,4 +10,3 @@ mock_with_mm_app() Launches an example app that shows a Clinical Timelines module integrated in the module manager surface. Displays data from the \pkg{pharmaverseadam} package. } -\keyword{internal} diff --git a/man/mod_clinical_timelines.Rd b/man/mod_clinical_timelines.Rd index 63d78bc..c8b1cdc 100644 --- a/man/mod_clinical_timelines.Rd +++ b/man/mod_clinical_timelines.Rd @@ -12,6 +12,7 @@ mod_clinical_timelines( filter = NULL, subjid_var = "USUBJID", default_plot_settings = list(x_param = "day", start_day = NULL, boxheight_val = 60), + color_palette = NULL, ms = 1000, receiver_id = NULL ) @@ -60,6 +61,12 @@ contains an integer indicating the lower x-axis limit in case of study day displ \code{boxheight_val} contains a value between 30 and 150 defining the initial height of the individual timeline plot boxes at app launch (defaults to 60).} +\item{color_palette}{\verb{[character(1+) | NULL]} + +A named vector that specifies the colors for drawing events or intervals. +Each name in the vector should correspond to an entry in the legend. +If \code{NULL} (default), the default color palette is used.} + \item{ms}{\verb{[numeric(1)]} Single numeric value indicating how many milliseconds to wait before the plot @@ -153,19 +160,22 @@ If not NULL, the \code{drug_admin} list must contain the following elements: \item{\code{dataset_name}: Character name of the dataset that holds drug administration data (e.g. ex domain), as it is called in the datalist that is provided to the \pkg{modulemanager}.} +\item{\code{trt_var}: Character name of the variable that contains the +treatment name which must be present in the dataset mentioned in the +\code{dataset_name} element.} \item{\code{start_var}: Character name of the variable that contains the start dates (e.g. exposure start dates) which must be present in the dataset mentioned in the -\code{name} element.} +\code{dataset_name} element.} \item{\code{end_var}: Character name of the variable that contains the end dates (e.g. exposure end dates) which must be present in the dataset mentioned in the -\code{name} element.} +\code{dataset_name} element.} \item{\code{detail_var}: Character name of the variable that contains the treatment -information. Must exist in the dataset mentioned in the \code{name} element.} +information. Must exist in the dataset mentioned in the \code{dataset_name} element.} \item{\code{label}: Free-text character label for the drug administration event.} \item{\code{dose_var}: Character name of the variable that contains the dosis level -information. Must exist in the dataset mentioned in the \code{name} element.} +information. Must exist in the dataset mentioned in the \code{dataset_name} element.} \item{\code{dose_unit_var}: Character name of the variable that contains the dosis -unit. Must exist in the dataset mentioned in the \code{name} element.} +unit. Must exist in the dataset mentioned in the \code{dataset_name} element.} } \cr diff --git a/man/mod_clinical_timelines_server.Rd b/man/mod_clinical_timelines_server.Rd index c95da61..f331078 100644 --- a/man/mod_clinical_timelines_server.Rd +++ b/man/mod_clinical_timelines_server.Rd @@ -14,6 +14,7 @@ mod_clinical_timelines_server( filter = NULL, subjid_var = "USUBJID", start_day = NULL, + color_palette = NULL, ms = 1000, receiver_id = NULL, afmm_param = NULL @@ -69,6 +70,12 @@ all datasets (default is USUBJID). Must be a single value.} A single integer indicating the lower x-axis limit in case of study day display. Defaults to NULL, using the day of the earliest event to be displayed.} +\item{color_palette}{\verb{[character(1+) | NULL]} + +A named vector that specifies the colors for drawing events or intervals. +Each name in the vector should correspond to an entry in the legend. +If \code{NULL} (default), the default color palette is used.} + \item{ms}{\verb{[numeric(1)]} Single numeric value indicating how many milliseconds to wait before the plot @@ -165,19 +172,22 @@ If not NULL, the \code{drug_admin} list must contain the following elements: \item{\code{dataset_name}: Character name of the dataset that holds drug administration data (e.g. ex domain), as it is called in the datalist that is provided to the \pkg{modulemanager}.} +\item{\code{trt_var}: Character name of the variable that contains the +treatment name which must be present in the dataset mentioned in the +\code{dataset_name} element.} \item{\code{start_var}: Character name of the variable that contains the start dates (e.g. exposure start dates) which must be present in the dataset mentioned in the -\code{name} element.} +\code{dataset_name} element.} \item{\code{end_var}: Character name of the variable that contains the end dates (e.g. exposure end dates) which must be present in the dataset mentioned in the -\code{name} element.} +\code{dataset_name} element.} \item{\code{detail_var}: Character name of the variable that contains the treatment -information. Must exist in the dataset mentioned in the \code{name} element.} +information. Must exist in the dataset mentioned in the \code{dataset_name} element.} \item{\code{label}: Free-text character label for the drug administration event.} \item{\code{dose_var}: Character name of the variable that contains the dosis level -information. Must exist in the dataset mentioned in the \code{name} element.} +information. Must exist in the dataset mentioned in the \code{dataset_name} element.} \item{\code{dose_unit_var}: Character name of the variable that contains the dosis -unit. Must exist in the dataset mentioned in the \code{name} element.} +unit. Must exist in the dataset mentioned in the \code{dataset_name} element.} } \cr diff --git a/man/prep_data.Rd b/man/prep_data.Rd index e1eb690..eda40bb 100644 --- a/man/prep_data.Rd +++ b/man/prep_data.Rd @@ -125,19 +125,22 @@ If not NULL, the \code{drug_admin} list must contain the following elements: \item{\code{dataset_name}: Character name of the dataset that holds drug administration data (e.g. ex domain), as it is called in the datalist that is provided to the \pkg{modulemanager}.} +\item{\code{trt_var}: Character name of the variable that contains the +treatment name which must be present in the dataset mentioned in the +\code{dataset_name} element.} \item{\code{start_var}: Character name of the variable that contains the start dates (e.g. exposure start dates) which must be present in the dataset mentioned in the -\code{name} element.} +\code{dataset_name} element.} \item{\code{end_var}: Character name of the variable that contains the end dates (e.g. exposure end dates) which must be present in the dataset mentioned in the -\code{name} element.} +\code{dataset_name} element.} \item{\code{detail_var}: Character name of the variable that contains the treatment -information. Must exist in the dataset mentioned in the \code{name} element.} +information. Must exist in the dataset mentioned in the \code{dataset_name} element.} \item{\code{label}: Free-text character label for the drug administration event.} \item{\code{dose_var}: Character name of the variable that contains the dosis level -information. Must exist in the dataset mentioned in the \code{name} element.} +information. Must exist in the dataset mentioned in the \code{dataset_name} element.} \item{\code{dose_unit_var}: Character name of the variable that contains the dosis -unit. Must exist in the dataset mentioned in the \code{name} element.} +unit. Must exist in the dataset mentioned in the \code{dataset_name} element.} } \cr diff --git a/man/set_drug_admin.Rd b/man/set_drug_admin.Rd index 78a447b..4372329 100644 --- a/man/set_drug_admin.Rd +++ b/man/set_drug_admin.Rd @@ -6,6 +6,7 @@ \usage{ set_drug_admin( dataset_name, + trt_var, start_var, end_var, detail_var, @@ -18,24 +19,27 @@ set_drug_admin( \item{dataset_name}{Character name of the data frame that holds drug administration data (e.g. ex domain) as it is called in the \code{data_list} parameter.} +\item{trt_var}{Character name of the variable that contains the treatment name. +Must be present in the data frame mentioned in the \code(dataset_name) element.} + \item{start_var}{Character name of the variable that contains the start dates -(e.g. exposure start dates). Must be present in the data frame mentioned in the name -element.} +(e.g. exposure start dates). Must be present in the data frame mentioned in the +\code(dataset_name) element.} \item{end_var}{Character name of the variable that contains the end dates -(e.g. exposure start dates). Must be present in the data frame mentioned in the name -element.} +(e.g. exposure start dates). Must be present in the data frame mentioned in the +\code(dataset_name) element.} \item{detail_var}{Character name of the variable that contains the treatment -information. Must exist in the dataset mentioned in the name element.} +information. Must exist in the dataset mentioned in the \code(dataset_name) element.} \item{label}{Free-text character label for the drug administration event.} \item{dose_var}{Character name of the variable that contains the dosis level -information. Must exist in the dataset mentioned in the name element.} +information. Must exist in the dataset mentioned in the \code(dataset_name) element.} \item{dose_unit_var}{Character name of the variable that contains the dosis unit. -Must exist in the dataset mentioned in the name element.} +Must exist in the dataset mentioned in the \code(dataset_name) element.} } \value{ A list that could directly be used as input for the \code{drug_admin} parameter diff --git a/vignettes/clinlines.Rmd b/vignettes/clinlines.Rmd index 9661111..07b82fc 100644 --- a/vignettes/clinlines.Rmd +++ b/vignettes/clinlines.Rmd @@ -141,7 +141,12 @@ Optional parameters of `mod_clinical_timelines()` are: - `filter`: Defaults to `NULL`, which means no local filters for adverse event data will be offered within the module. Filters can be activated by providing their names through a list (see `vignette("ae-filter")`). -- `receiver_id`: Character string defining the ID of the module to which to send a subject ID. The corresponding module must exist in the module list. The default is NULL which disables communication. See `vignette("communication")` for further information. +- `receiver_id`: Optional character string defining the ID of the module to which to send a subject ID. The corresponding module must exist in the module list. The default is NULL which disables communication. See `vignette("communication")` for further information. + +- `default_plot_settings`: An optional named list containing three elements: `x_param` defines if the x axis shows the date or study days as default setting at app launch, `start_day` indicates the lower x-axis limit in case of study day display at app launch, and `boxheight_val` defines the initial height of the individual timeline plot boxes at app launch. + +- `color_palette`: An optional named vector that allows customizing the colors for drawing events or intervals. + An illustrative definition of a module list (containing only a Clinical Timelines module with only mandatory parameters) is shown below: From 1dbb39c5a0615d2d2e366324122d916876ffb942 Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Wed, 11 Dec 2024 08:04:39 +0000 Subject: [PATCH 24/31] update DESCRIPTION file to contain latest dv.manager version --- DESCRIPTION | 1 + 1 file changed, 1 insertion(+) diff --git a/DESCRIPTION b/DESCRIPTION index 40bad31..4c92454 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -21,6 +21,7 @@ Imports: bslib (>= 0.6.1), checkmate (>= 2.3.1), dplyr (>= 1.1.0), + dv.manager (>= 2.1.4), ggplot2 (>= 3.4.4), lubridate (>= 1.9.3), magrittr (>= 2.0.3), From 26f42da453de8a5d822aaae80d78106f8f88ab3e Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Wed, 11 Dec 2024 08:35:20 +0000 Subject: [PATCH 25/31] fix failing tests --- tests/testthat/test-mod_clinical_timelines.R | 4 ++-- tests/testthat/test-mod_main_view.R | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/tests/testthat/test-mod_clinical_timelines.R b/tests/testthat/test-mod_clinical_timelines.R index 3d7e578..74bdf7b 100644 --- a/tests/testthat/test-mod_clinical_timelines.R +++ b/tests/testthat/test-mod_clinical_timelines.R @@ -73,7 +73,7 @@ test_that( "mod_main_view_server() runs even if there is no drug admin information", { df <- prep_dummy_data(n = 2) - df <- data_list[names(data_list) != "exp"] + df <- df[names(df) != "exp"] server_func <- function(id, data_name, dataset_list) { mod_clinical_timelines_server( @@ -228,7 +228,7 @@ test_that("bookmarking works as intended" %>% vdoc[["add_spec"]](specs$integrati app$stop() }) -test_that("an informative error message gets displayed in case of the plot being to big" %>% +test_that("an informative error message gets displayed in case of the plot being too big" %>% vdoc[["add_spec"]](specs$plot_specs$errors), { app_dir <- "./apps/large_app" app <- shinytest2::AppDriver$new(app_dir = app_dir, name = "test_error_big_plot") diff --git a/tests/testthat/test-mod_main_view.R b/tests/testthat/test-mod_main_view.R index bcab016..f00cdd5 100644 --- a/tests/testthat/test-mod_main_view.R +++ b/tests/testthat/test-mod_main_view.R @@ -49,7 +49,7 @@ df <- prep_data( ) ) -colors <- shiny::reactive(color_lookup(unique(df$group))) +colors <- shiny::reactive(color_lookup(unique(df$group), NULL)) changed <- shiny::reactive(0) plot_click_li <- list( @@ -84,13 +84,12 @@ plot_click_li <- list( test_that("mod_main_view_server() returns the subject ID the user clicked on" %>% vdoc[["add_spec"]](specs$integration_specs$jumping), { - server_func <- function(id, initial_data, changed, colors_groups, ms = 100) { + server_func <- function(id, initial_data, changed, colors_groups) { mod_main_view_server( module_id = id, initial_data = initial_data, changed = changed, - colors_groups = colors_groups, - ms = ms + colors_groups = colors_groups ) } From 75cec1a8e5755260b0ead4ed54ee5050d4ef587d Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Wed, 11 Dec 2024 08:50:55 +0000 Subject: [PATCH 26/31] failing tests: increase wait_for_idle() timeout time --- tests/testthat/setup.R | 5 +++-- tests/testthat/test-mod_clinical_timelines.R | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/testthat/setup.R b/tests/testthat/setup.R index a5fe4bf..a30a7af 100644 --- a/tests/testthat/setup.R +++ b/tests/testthat/setup.R @@ -12,6 +12,7 @@ vdoc <- local({ specs <- vdoc[["specs"]] # validation (F) + #' Test harness for communication with `dv.papo`. #' #' @param mod Parameterized instance of the module to test. Should produce valid output and not trigger a `shiny::req`. @@ -51,7 +52,7 @@ test_communication_with_papo <- function(mod, data, trigger_input_id) { test_that("module adheres to send_subject_id_to_papo protocol", { app <- shinytest2::AppDriver$new(app, name = "test_send_subject_id_to_papo_protocol") - app$wait_for_idle() + app$wait_for_idle(timeout = 30000) # Module starts and sends no message exports <- app$get_values()[["export"]] @@ -69,7 +70,7 @@ test_communication_with_papo <- function(mod, data, trigger_input_id) { subject_ids <- c("A", "A", "B") for (i in seq_along(subject_ids)) { trigger_subject_selection(subject_ids[[i]]) - app$wait_for_idle() + app$wait_for_idle(timeout = 30000) exports <- app$get_values()[["export"]] # Module outputs selection once diff --git a/tests/testthat/test-mod_clinical_timelines.R b/tests/testthat/test-mod_clinical_timelines.R index 74bdf7b..92c8abc 100644 --- a/tests/testthat/test-mod_clinical_timelines.R +++ b/tests/testthat/test-mod_clinical_timelines.R @@ -232,7 +232,7 @@ test_that("an informative error message gets displayed in case of the plot being vdoc[["add_spec"]](specs$plot_specs$errors), { app_dir <- "./apps/large_app" app <- shinytest2::AppDriver$new(app_dir = app_dir, name = "test_error_big_plot") - app$wait_for_idle() + app$wait_for_idle(timeout = 30000) Sys.sleep(1) # wait for error message being replaced # Verify that original error occurs From 1f3a7d6f5d54dd10858ba1c025158c17f12cbbe4 Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Wed, 11 Dec 2024 11:28:02 +0000 Subject: [PATCH 27/31] update large test app to fix failing test --- R/prep_dummy_data.R | 6 ++-- tests/testthat/apps/large_app/app.R | 29 ++------------------ tests/testthat/setup.R | 4 +-- tests/testthat/test-mod_clinical_timelines.R | 2 +- 4 files changed, 8 insertions(+), 33 deletions(-) diff --git a/R/prep_dummy_data.R b/R/prep_dummy_data.R index 011efa2..0b555b6 100644 --- a/R/prep_dummy_data.R +++ b/R/prep_dummy_data.R @@ -42,9 +42,7 @@ prep_dummy_data <- function(n = 200) { dplyr::filter(.data$USUBJID %in% adsl_info$USUBJID) exp_info <- pharmaverseadam::adex %>% - dplyr::distinct(USUBJID, EXTRT, EXDOSE, EXDOSU, EXSTDTC, EXENDTC, .keep_all = TRUE) - - exp_info <- exp_info %>% + dplyr::distinct(USUBJID, EXTRT, EXDOSE, EXDOSU, EXSTDTC, EXENDTC, .keep_all = TRUE) %>% dplyr::mutate( EXSTDTC = lubridate::ymd_hm(.data$EXSTDTC, truncated = 2), EXENDTC = lubridate::ymd_hm(.data$EXENDTC, truncated = 2), @@ -60,7 +58,7 @@ prep_dummy_data <- function(n = 200) { subject_id = .data$USUBJID ) - return(list(adsl = adsl_info, adae = adae_info, adcm = adcm_info, exp = exp_info))#, exp2 = exp_empty)) + return(list(adsl = adsl_info, adae = adae_info, adcm = adcm_info, exp = exp_info)) } diff --git a/tests/testthat/apps/large_app/app.R b/tests/testthat/apps/large_app/app.R index 8b2317b..86b63ba 100644 --- a/tests/testthat/apps/large_app/app.R +++ b/tests/testthat/apps/large_app/app.R @@ -29,25 +29,11 @@ adsl <- adsl %>% adae <- adae %>% dplyr::mutate( AESTDTC = lubridate::ymd_hm(.data$ASTDT, truncated = 2), - AEENDTC = lubridate::ymd_hm(.data$AENDT, truncated = 2), - AERELFLG = dplyr::case_when( - AEREL %in% c("REMOTE", "NONE") ~ "N", - AEREL %in% c("POSSIBLE", "PROBABLE") ~ "Y", - TRUE ~ "" - ) + AEENDTC = lubridate::ymd_hm(.data$AENDT, truncated = 2) ) %>% dplyr::filter(.data$USUBJID %in% adsl$USUBJID) -exp <- pharmaverseadam::adex %>% - dplyr::mutate( - EXSTDTC = lubridate::ymd_hm(.data$EXSTDTC, truncated = 2), - EXENDTC = lubridate::ymd_hm(.data$EXENDTC, truncated = 2), - subject_id = .data$USUBJID - ) %>% - dplyr::filter(.data$USUBJID %in% adsl$USUBJID) - - -data_list <- list(adsl = adsl, adae = adae, exp = exp) +data_list <- list(adsl = adsl, adae = adae) # Define module @@ -76,16 +62,7 @@ clinlines <- dv.clinlines::mod_clinical_timelines( ) ) ), - drug_admin = list( - dataset_name = "exp", - trt_var = "EXTRT", - start_var = "EXSTDTC", - end_var = "EXENDTC", - detail_var = "EXTRT", - label = "Drug Administration", - dose_var = "EXDOSE", - dose_unit_var = "EXDOSU" - ), + drug_admin = NULL, subjid_var = "USUBJID" ) diff --git a/tests/testthat/setup.R b/tests/testthat/setup.R index a30a7af..344410b 100644 --- a/tests/testthat/setup.R +++ b/tests/testthat/setup.R @@ -52,7 +52,7 @@ test_communication_with_papo <- function(mod, data, trigger_input_id) { test_that("module adheres to send_subject_id_to_papo protocol", { app <- shinytest2::AppDriver$new(app, name = "test_send_subject_id_to_papo_protocol") - app$wait_for_idle(timeout = 30000) + app$wait_for_idle() # Module starts and sends no message exports <- app$get_values()[["export"]] @@ -70,7 +70,7 @@ test_communication_with_papo <- function(mod, data, trigger_input_id) { subject_ids <- c("A", "A", "B") for (i in seq_along(subject_ids)) { trigger_subject_selection(subject_ids[[i]]) - app$wait_for_idle(timeout = 30000) + app$wait_for_idle() exports <- app$get_values()[["export"]] # Module outputs selection once diff --git a/tests/testthat/test-mod_clinical_timelines.R b/tests/testthat/test-mod_clinical_timelines.R index 92c8abc..74bdf7b 100644 --- a/tests/testthat/test-mod_clinical_timelines.R +++ b/tests/testthat/test-mod_clinical_timelines.R @@ -232,7 +232,7 @@ test_that("an informative error message gets displayed in case of the plot being vdoc[["add_spec"]](specs$plot_specs$errors), { app_dir <- "./apps/large_app" app <- shinytest2::AppDriver$new(app_dir = app_dir, name = "test_error_big_plot") - app$wait_for_idle(timeout = 30000) + app$wait_for_idle() Sys.sleep(1) # wait for error message being replaced # Verify that original error occurs From 249f8b86a2ca0c548056b2e1f1e366a7ef945fba Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Wed, 11 Dec 2024 11:43:47 +0000 Subject: [PATCH 28/31] update papo jumping test --- tests/testthat/test-message_papo.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testthat/test-message_papo.R b/tests/testthat/test-message_papo.R index 055983f..f7f89b0 100644 --- a/tests/testthat/test-message_papo.R +++ b/tests/testthat/test-message_papo.R @@ -22,7 +22,7 @@ mod <- mod_clinical_timelines( ) ), drug_admin = list( - dataset_name = "exp", start_var = "EXSTDTC", end_var = "EXENDTC", detail_var = "EXTRT", + dataset_name = "exp", trt_var = "EXTRT", start_var = "EXSTDTC", end_var = "EXENDTC", detail_var = "EXTRT", label = "Drug Administration", dose_var = "EXDOSE", dose_unit_var = "EXDOSU" ), subjid_var = "USUBJID", From b24df9a77188c2f80cd66763978dbde8f9d84543 Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Wed, 11 Dec 2024 13:25:53 +0000 Subject: [PATCH 29/31] update version number --- DESCRIPTION | 2 +- NEWS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 4c92454..11e47e5 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: dv.clinlines Title: DaVinci's Clinical Timelines -Version: 1.0.4-01 +Version: 1.1.0 Authors@R: c( person("Boehringer-Ingelheim Pharma GmbH & Co.KG", role = c("cph", "fnd")), diff --git a/NEWS.md b/NEWS.md index caf8437..846b960 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# dv.clinlines 1.0.5 +# dv.clinlines 1.1.0 * Display drug administration information in different colors, depending on the treatment name. * Allow for customized color palettes. From 1b0cad76cd6c34a9575d14a35898b006600ceecd Mon Sep 17 00:00:00 2001 From: "Glauss,Isabel (MED BDS) BIP-DE-B" Date: Wed, 11 Dec 2024 14:35:57 +0000 Subject: [PATCH 30/31] add mock_with_mm_app to _pkgdown.yml --- _pkgdown.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/_pkgdown.yml b/_pkgdown.yml index b51b46f..84e132d 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -34,6 +34,7 @@ reference: - contents: - mod_clinical_timelines - mock_clinical_timelines_app + - mock_with_mm_app - set_basic_info - set_event - set_drug_admin From 60cd0b184545573777a4e8b0fe2edf63666a0dcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isabel=20Glau=C3=9F?= <64188972+iglauss@users.noreply.github.com> Date: Mon, 16 Dec 2024 08:42:40 +0100 Subject: [PATCH 31/31] Update R/data_prep.R: Replace hard coded label Co-authored-by: Korbinian Matthias <123395522+mattkorb@users.noreply.github.com> --- R/data_prep.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/data_prep.R b/R/data_prep.R index f2087f5..afbf57c 100644 --- a/R/data_prep.R +++ b/R/data_prep.R @@ -359,7 +359,7 @@ set_exp_intervals <- function(data_list, mapping = default_drug_admin(), subjid_ dplyr::mutate( group = dplyr::if_else( !is.na(.data[["trt_var"]]), - paste("Drug Administration:", .data[["trt_var"]]), + paste0(col_list$label, ": ", .data[["trt_var"]]), NA ) ) %>%