From 03fedf4642554dff3079a846da6700d29814bbfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?zxBIB=20Lech=C3=B3n=2CMiguel=20=28MED=20BDS=29=20EXTERNAL?= Date: Sun, 21 Jul 2024 09:04:31 +0200 Subject: [PATCH] Initial commit. --- .Rbuildignore | 12 + .github/CODEOWNERS | 1 + .github/workflows/ci.yml | 21 + .gitignore | 11 + .lintr.R | 21 + DESCRIPTION | 47 + LICENSE | 13 + NAMESPACE | 14 + NEWS.md | 62 + R/aaa_preface.R | 76 + R/check_papo_call_manual.R | 766 ++++++++++ R/create_plots.R | 259 ++++ R/data_prep.R | 112 ++ R/dressing_room.R | 1251 +++++++++++++++++ R/global_params.r | 16 + R/mock_patient_profile.R | 211 +++ R/mock_with_mm.R | 145 ++ R/mod_API.R | 116 ++ R/mod_listing.R | 222 +++ R/mod_patient_info.R | 61 + R/mod_patient_profile.R | 384 +++++ R/mod_plots.R | 487 +++++++ R/mod_signature.R | 171 +++ R/prep_safety_data.R | 66 + R/utils-misc.R | 65 + R/write_mod_signature.R | 79 ++ README.Rmd | 91 ++ README.md | 88 ++ _pkgdown.yml | 25 + inst/validation/results/.gitempty | 0 inst/validation/run_validation.R | 44 + inst/validation/specs.R | 35 + inst/validation/utils-validation.R | 155 ++ inst/validation/val_report.Rmd | 17 + inst/validation/val_report_child.Rmd | 209 +++ man/cash-.pack_of_constants.Rd | 20 + man/create_ae_cm_plot.Rd | 30 + man/create_lb_vs_plot.Rd | 50 + man/create_vlines.Rd | 22 + man/explorer_app.Rd | 19 + man/figures/demo.png | Bin 0 -> 105707 bytes man/figures/patient_profile_app.png | Bin 0 -> 79563 bytes man/get_labels.Rd | 25 + man/mock_patient_profile_UI.Rd | 18 + man/mock_patient_profile_app.Rd | 13 + man/mock_patient_profile_server.Rd | 15 + man/mock_with_mm_app.Rd | 13 + man/mod_patient_profile.Rd | 280 ++++ man/mod_patient_profile_UI.Rd | 22 + man/mod_patient_profile_params.Rd | 202 +++ man/mod_patient_profile_server.Rd | 204 +++ man/pack_of_constants.Rd | 46 + man/patient_info_UI.Rd | 19 + man/patient_info_server.Rd | 23 + man/patient_listing_UI.Rd | 16 + man/patient_listing_server.Rd | 34 + man/patient_plot_UI.Rd | 18 + man/patient_plot_server.Rd | 23 + man/prep_safety_data.Rd | 20 + man/pt_info_data_filter.Rd | 25 + tests/testthat.R | 6 + tests/testthat/apps/misconfigured_app/app.R | 9 + .../apps/patient_selector_switching/app.R | 129 ++ tests/testthat/apps/root/app.R | 19 + tests/testthat/setup.R | 177 +++ tests/testthat/test-all.R | 350 +++++ vignettes/.gitignore | 2 + vignettes/a00-papo.Rmd | 287 ++++ vignettes/a01-data_requirements.Rmd | 28 + vignettes/a02-communication.Rmd | 45 + vignettes/images/complete_display.jpg | Bin 0 -> 153829 bytes vignettes/images/info.png | Bin 0 -> 46342 bytes vignettes/images/listings.jpg | Bin 0 -> 65124 bytes vignettes/images/plots.jpg | Bin 0 -> 103807 bytes vignettes/images/sample_error.jpg | Bin 0 -> 41509 bytes vignettes/images/summary.jpg | Bin 0 -> 25433 bytes vignettes/qc.Rmd | 32 + 77 files changed, 7594 insertions(+) create mode 100644 .Rbuildignore create mode 100644 .github/CODEOWNERS create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 .lintr.R create mode 100644 DESCRIPTION create mode 100644 LICENSE create mode 100644 NAMESPACE create mode 100644 NEWS.md create mode 100644 R/aaa_preface.R create mode 100644 R/check_papo_call_manual.R create mode 100644 R/create_plots.R create mode 100644 R/data_prep.R create mode 100644 R/dressing_room.R create mode 100644 R/global_params.r create mode 100644 R/mock_patient_profile.R create mode 100644 R/mock_with_mm.R create mode 100644 R/mod_API.R create mode 100644 R/mod_listing.R create mode 100644 R/mod_patient_info.R create mode 100644 R/mod_patient_profile.R create mode 100644 R/mod_plots.R create mode 100644 R/mod_signature.R create mode 100644 R/prep_safety_data.R create mode 100644 R/utils-misc.R create mode 100644 R/write_mod_signature.R create mode 100644 README.Rmd create mode 100644 _pkgdown.yml create mode 100644 inst/validation/results/.gitempty create mode 100644 inst/validation/run_validation.R create mode 100644 inst/validation/specs.R create mode 100644 inst/validation/utils-validation.R create mode 100644 inst/validation/val_report.Rmd create mode 100644 inst/validation/val_report_child.Rmd create mode 100644 man/cash-.pack_of_constants.Rd create mode 100644 man/create_ae_cm_plot.Rd create mode 100644 man/create_lb_vs_plot.Rd create mode 100644 man/create_vlines.Rd create mode 100644 man/explorer_app.Rd create mode 100644 man/figures/demo.png create mode 100644 man/figures/patient_profile_app.png create mode 100644 man/get_labels.Rd create mode 100644 man/mock_patient_profile_UI.Rd create mode 100644 man/mock_patient_profile_app.Rd create mode 100644 man/mock_patient_profile_server.Rd create mode 100644 man/mock_with_mm_app.Rd create mode 100644 man/mod_patient_profile.Rd create mode 100644 man/mod_patient_profile_UI.Rd create mode 100644 man/mod_patient_profile_params.Rd create mode 100644 man/mod_patient_profile_server.Rd create mode 100644 man/pack_of_constants.Rd create mode 100644 man/patient_info_UI.Rd create mode 100644 man/patient_info_server.Rd create mode 100644 man/patient_listing_UI.Rd create mode 100644 man/patient_listing_server.Rd create mode 100644 man/patient_plot_UI.Rd create mode 100644 man/patient_plot_server.Rd create mode 100644 man/prep_safety_data.Rd create mode 100644 man/pt_info_data_filter.Rd create mode 100644 tests/testthat.R create mode 100644 tests/testthat/apps/misconfigured_app/app.R create mode 100644 tests/testthat/apps/patient_selector_switching/app.R create mode 100644 tests/testthat/apps/root/app.R create mode 100644 tests/testthat/setup.R create mode 100644 tests/testthat/test-all.R create mode 100644 vignettes/.gitignore create mode 100644 vignettes/a00-papo.Rmd create mode 100644 vignettes/a01-data_requirements.Rmd create mode 100644 vignettes/a02-communication.Rmd create mode 100644 vignettes/images/complete_display.jpg create mode 100644 vignettes/images/info.png create mode 100644 vignettes/images/listings.jpg create mode 100644 vignettes/images/plots.jpg create mode 100644 vignettes/images/sample_error.jpg create mode 100644 vignettes/images/summary.jpg create mode 100644 vignettes/qc.Rmd diff --git a/.Rbuildignore b/.Rbuildignore new file mode 100644 index 0000000..ebe3985 --- /dev/null +++ b/.Rbuildignore @@ -0,0 +1,12 @@ +R/write_mod_signature.R +.*Rproj +^\.Rproj\.user$ +^LICENSE$ +^LICENSE\.md$ +^README\.Rmd$ +^_pkgdown\.yml$ +^docs$ +^pkgdown$ +.lintr +_tests_ +^.*\.Rproj$ diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..3817383 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @boehringer-ingelheim/davinci diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..d5060a1 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,21 @@ +--- +name: Checks 🧩 + +on: + pull_request: + types: + - opened + - synchronize + - reopened + - ready_for_review + branches: + - main + push: + branches: + - main + workflow_dispatch: + +jobs: + run-shared-ci: + name: Shared + uses: boehringer-ingelheim/dv.templates/.github/workflows/shared_ci.yml@main diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3d73374 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +.vscode +.Rproj.user +.Rhistory +*.Rproj +*.swp +*.sh +.vimlocal +docs +shiny_bookmarks +inst/validation/validation_report.html +tests/test-out.xml diff --git a/.lintr.R b/.lintr.R new file mode 100644 index 0000000..59d002c --- /dev/null +++ b/.lintr.R @@ -0,0 +1,21 @@ +linters <- lintr::default_linters # -[ diff with dv.templates 3ca8d7a10cfc7ad2307644dcac603e1f1f0feb72]- +linters <- lintr::modify_defaults( + linters + , line_length_linter = NULL # we see how long lines are when we write them + , indentation_linter = NULL + , trailing_whitespace_linter = NULL + , cyclocomp_linter = NULL # prevents trivial amount of nesting and long but straightforward functions + , object_name_linter = NULL # we have reasons to capitalize. nobody in our team CamelCase. shiny does + , object_length_linter = NULL # we don't type long var names just because + , pipe_continuation_linter = NULL # wickham being overly prescriptive + , trailing_blank_lines_linter = NULL # natural extension of trailing_whitespace_linter, present on the template +) + +if(identical(Sys.getenv('CI'), "true")){ + linters <- lintr::modify_defaults( + linters + , object_usage_linter = NULL # R lacks var declarations; it's easy to assign to the wrong variable by mistake + ) # We only disable this lint rule on github because it fails there because +} # of a long-standing lintr bug + +linters \ No newline at end of file diff --git a/DESCRIPTION b/DESCRIPTION new file mode 100644 index 0000000..5362648 --- /dev/null +++ b/DESCRIPTION @@ -0,0 +1,47 @@ +Package: dv.papo +Title: Patient Profile +Version: 2.0.0 +Date: 2024-07-02 +Authors@R: + c(person("Boehringer-Ingelheim Pharma GmbH & Co.KG", role = c("cph", "fnd")), + person(given = "Korbinian", + family = "Matthias", + role = c("cre"), + email = "korbinian.matthias@boehringer-ingelheim.com"), + person(given = "Miguel", + family = "Lechón", + role = c("aut"), + email = "miguel.lechon.ext@boehringer-ingelheim.com"), + person(given = "Yuzheng", + family = "Ou", + role = "aut") + ) +Description: Patient Profile Module. +License: Apache License (>= 2) +Encoding: UTF-8 +LazyData: true +Roxygen: list(markdown = TRUE) +RoxygenNote: 7.3.0 +Depends: + R (>= 4.1.0) +Imports: + checkmate, + DT, + ggplot2, + plotly, + rlang, + shiny, + shinyWidgets, + fontawesome +Suggests: + dv.manager (>= 2.1.0), + knitr, + safetyData, + shinytest2, + testthat, + jsonlite, + withr, + dplyr +Remotes: boehringer-ingelheim/dv.manager@main +VignetteBuilder: knitr +Config/testthat/edition: 3 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d3ecea3 --- /dev/null +++ b/LICENSE @@ -0,0 +1,13 @@ +Copyright 2024 Boehringer-Ingelheim Pharma GmbH & Co.KG + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/NAMESPACE b/NAMESPACE new file mode 100644 index 0000000..41d2b92 --- /dev/null +++ b/NAMESPACE @@ -0,0 +1,14 @@ +# Generated by roxygen2: do not edit by hand + +S3method("$",pack_of_constants) +S3method("[",pack_of_constants) +S3method("[[",pack_of_constants) +export(explorer_app) +export(mock_patient_profile_UI) +export(mock_patient_profile_app) +export(mock_patient_profile_server) +export(mock_with_mm_app) +export(mod_patient_profile) +export(mod_patient_profile_UI) +export(mod_patient_profile_server) +importFrom(rlang,.data) diff --git a/NEWS.md b/NEWS.md new file mode 100644 index 0000000..585eb27 --- /dev/null +++ b/NEWS.md @@ -0,0 +1,62 @@ +# dv.papo 2.0.0 + +- Major API redesign with the following breaking changes `mod_patient_profile()`: + - The name of the subject-level dataset is now explicitly provided through the `subject_level_dataset_name` parameter. + - `key` has been renamed to `subjid_var`. + - `pt_info` is now called `summary` and has been simplified. It only allows to specify a _single_ dataframe + from which to select columns. Its `row_item` submember has been renamed to `column_count`. + - `tables` is now called `listings` and is a named list of pairs of `dataset` and `default_vars`. This allows + control over which columns are shown by default for each dataset. + - The legacy `basic_info`, `vlines` and `plots` are all now collected under a single `plots` parameter. They have been + restructured for clarity and are also accompanied by a `palette` field that makes it possible for the caller to + specify individual colors. See the main vignette for more information. + - All parameters referring to Study Days have been reframed to point to absolute days. This ensures consistency of the + time axis of plots. + - The module now accepts datetimes as well as dates for easier joint configuration with `dv.clinlines`. The "time" + part of datetimes is simply discarded. + - Configuration helper functions have been removed in favor of documentation templates. + - `jumping_vars` is now called `sender_ids` for consistency across davinci modules. + +- The module is now easier to configure because it: + - Makes all of its main three sections (`summary`, `listings` and `plots`) optional, which facilitates having a base + working configuration. + - Provides clear start-up warnings and messages when the module is misconfigured with respect to input datasets. + The app creator can safely assume that if no such message appears, the module will not misbehave when interacted + with due to misconfiguration. Any remaining error rests solely on the module developer's shoulders or on those of + the platform provider. + +- Bug fixes: + - Day labels now follow the standard CDISC behavior of skipping day 0 on plots (day 1 refers to the Treatment Start + Date; day -1 is the day before). + - Vertical lines now cross all plots. + + +# dv.papo 1.0.2 + +- bugfix: With the new version of dv.filter 2.1.0 the patient selector did not work. This is now fixed. + +# dv.papo 1.0.1 + +- bugfix: Updating patient selector after jumping from another module didn't work. This is now fixed. + +# dv.papo 1.0.0 + +- Primary interface: `mod_patient_profile()` + +- Launch mock app for demo and testing via `mock_with_mm_app()` + +- Enables bookmarking state of Shiny app via URL + +# dv.papo 0.1 + +* Plot section added. + +# dv.papo 0.0.2 + +* Shinydashboard element removed. + +# dv.papo 0.0.1 + +* Added a `NEWS.md` file to track changes to the package. + + diff --git a/R/aaa_preface.R b/R/aaa_preface.R new file mode 100644 index 0000000..3f4b78f --- /dev/null +++ b/R/aaa_preface.R @@ -0,0 +1,76 @@ +# THIS FILE IS NAMED aaa_preface.R SO IT IS LOADED BEFORE ALL OTHER FILES +# DO NOT CHANGE ITS NAME. IT MUST BE THE FIRST ONE ALPHABETICALLY. + +#' Build a collection of named constants +#' +#' @param ... Named parameters to be collected as constants +#' +#' @keywords internal +#' +#' @details +#' Shiny uses strings as IDs to link UI and server elements. E.g: +#' foo_UI(id = ns("foo")) ... +#' foo_server(id = "foo") +#' +#' This pattern makes it easy for programmers to fall on the trap of modifying one instance of the string literal "foo" +#' without modifying the rest and be unaware of the problem until a bug is hit. It's also easy to mistakes uses of "foo" +#' as an identifier from other uses (text labels, ...) when, as it's often the case, the parameter is not explicitly +#' named. +#' One easy fix consists in using global variables instead of plain string literals. In the case of the previous +#' example, that would mean: +#' ID_FOO <- "foo" +#' foo_UI(ns(ID_FOO)) ... +#' foo_server(ID_FOO) +#' +#' That simple addition makes the purpose of ID_FOO clear and also fails gracefully when not all ID_FOO instances are +#' updated synchronously along a codebase. It has the drawback of polluting the global namespace with identifier +#' variables. That's easily solved by creating a container of constants, which is the purpose of this pack_of_constants +#' alias. +#' ID <- pack_of_constants(FOO = "foo", BAR = "bar") +#' ID$FOO +#' "foo" +#' ID$BA +#' Error in `$.pack_of_constants`(ID, BA) : +#' Pack of constants "ID" does not contain "BA" +#' +#' The pack of constants is a plain named list that enforces that all elements have unique, non-null names. +#' It is tagged as an S3 object to override its extraction operators. +#' +#' The use of checkmate is unnecessary, but it's a Good Library(TM) and your module should rely on it anyways +pack_of_constants <- function(...) { + result <- list(...) + checkmate::assert_list(result, any.missing = FALSE, names = "unique") + class(result) <- c("pack_of_constants", class(result)) + result +} + +#' Extract constant from pack +#' +#' @param pack pack_of_constants +#' @param name target constant +#' +#' This function differs from the base list extraction method in that it avoids partial matching of keys and throws +#' an error if the looked-for constant is not contained within the pack. +#' +#' @keywords internal +#' +#' @export +`$.pack_of_constants` <- function(pack, name) { + checkmate::assert_true(name %in% names(pack), .var.name = paste0(deparse(substitute(pack)), "$", name)) + NextMethod() +} + +# This exports are recent requirement for devtools check https://github.com/r-lib/roxygen2/issues/1592#issue-2121199122 +#' +#' @keywords internal +#' +#' @export +`[[.pack_of_constants` <- `$.pack_of_constants` + +#' @keywords internal +#' @export +`[.pack_of_constants` <- function(pack, name) { + stop("Invalid pack_of_constants method") +} + +poc <- pack_of_constants diff --git a/R/check_papo_call_manual.R b/R/check_papo_call_manual.R new file mode 100644 index 0000000..0f5526f --- /dev/null +++ b/R/check_papo_call_manual.R @@ -0,0 +1,766 @@ +# nolint start object_usage_linter + +# TODO: Generate from mod_patient_profile_API +# This function has been written manually, but mod_patient_profile_API carries +# enough information to derive most of it automatically +check_papo_call <- function(datasets, module_id, subject_level_dataset_name, subjid_var, + sender_ids, summary, listings, plots) { + warn <- character(0) + err <- character(0) + + assert_warn <- function(cond, msg, do_assert = TRUE) { + ok <- FALSE + if (isTRUE(do_assert)) { + ok <- isTRUE(cond) + if (!ok) warn <<- c(warn, msg) + } + return(ok) + } + + assert_err <- function(cond, msg, do_assert = TRUE) { + ok <- FALSE + if (isTRUE(do_assert)) { + ok <- isTRUE(cond) + if (!ok) err <<- c(err, paste0(msg, ".")) + } + return(ok) + } + + is_valid_shiny_id <- function(s) grepl("^$|^[a-zA-Z][a-zA-Z0-9_-]*$", s) + + is_date_lower_or_equal <- function(a, b) all(as.POSIXct(a) <= as.POSIXct(b), na.rm = TRUE) + + allowed_classes_logical <- c("logical") + allowed_classes_character <- c("character") + allowed_classes_character_factor <- c("character", "factor") + allowed_classes_numeric <- c("integer", "numeric") + allowed_classes_date <- c("Date", "POSIXt") + + afmm_datasets <- paste(names(datasets), collapse = ", ") + + used_dataset_names <- list() # name identifies parameter, value stores dataset name + + # module_id + assert_err(!missing(module_id), "`module_id` missing") && + assert_err(checkmate::test_string(module_id), "`module_id` should be a string") && + assert_warn(nchar(module_id) > 0, "Consider providing a non-empty `module_id`.") && + assert_err( + is_valid_shiny_id(module_id), + paste( + "`module_id` should be a valid identifier, starting with a letter and followed by", + "alphanumeric characters, hyphens and underscores" + ) + ) + + # subject_level_dataset_name + sl_dataset_ok <- ( + assert_err(!missing(subject_level_dataset_name), "`subject_level_dataset_name` missing") && + assert_err( + checkmate::test_string(subject_level_dataset_name, min.chars = 1), + "`subject_level_dataset_name` should be a non-empty string" + ) && + assert_err( + subject_level_dataset_name %in% names(datasets), + paste( + "`subject_level_dataset_name` does not refer to any of the available datasets:", + afmm_datasets + ) + ) + ) + if (sl_dataset_ok) { + used_dataset_names[["subject_level_dataset_name"]] <- subject_level_dataset_name + } + + # subjid_var + subjid_var_ok <- ( + assert_err(!missing(subjid_var), "`subjid_var` missing") && + assert_err(checkmate::test_string(subjid_var, min.chars = 1), "`subjid_var` should be a non-empty string") && + sl_dataset_ok + ) + + if (subjid_var_ok) { + dataset <- datasets[[subject_level_dataset_name]] + assert_err(subjid_var %in% names(dataset), "`subjid_var` not a column of `subject_level_dataset_name`") + assert_err( + !any(duplicated(dataset[[subjid_var]])), + sprintf( + "`subjid_var` (%s) does not uniquely identify rows of `subject_level_dataset_name` (%s)", + subjid_var, subject_level_dataset_name + ) + ) + } + + # TODO: sender_ids + + # summary + if (!missing(summary) && !is.null(summary)) { + if (assert_err(checkmate::test_list(summary, names = "unique"), "`summary` should be a named list")) { + if (sl_dataset_ok && assert_err("vars" %in% names(summary), "`summary` is missing element `vars`") && + assert_err( + checkmate::test_character(summary[["vars"]], null.ok = FALSE), + "`summary$vars` should be a non-empty character vector" + )) { + dataset <- datasets[[subject_level_dataset_name]] + excess_cols <- setdiff(summary[["vars"]], names(dataset)) + assert_err( + length(excess_cols) == 0, + sprintf( + "`summary$vars` refers to unknown dataset variables (%s)", + paste(excess_cols, collapse = ", ") + ) + ) + } + + if (assert_err("column_count" %in% names(summary), "`summary` is missing element `column_count`")) { + assert_err( + checkmate::test_int(summary[["column_count"]], lower = 1, upper = 12), + "`summary$column_count` is not a single integer in the [1, 12] range" + ) + } + } + } + + # listings + if (!missing(listings) && !is.null(listings)) { + if (assert_err(checkmate::test_list(listings, names = "unique", min.len = 1), "`listings` must be a non-empty named list")) { + for (i_listing in seq_along(listings)) { + listing <- listings[[i_listing]] + listing_name <- names(listings)[[i_listing]] + + code_ref <- sprintf("listings[['%s']]", listing_name) + + if (assert_err( + checkmate::test_list(listing, names = "unique"), + sprintf("`%s` is not a named list. ", code_ref) + )) { + # listing$dataset + if (assert_err( + "dataset" %in% names(listing), + sprintf("`%s` is missing element `dataset`", code_ref) + ) && + assert_err( + checkmate::test_string(listing[["dataset"]], min.chars = 1), + sprintf("`%s$dataset` should be a non-empty string", code_ref) + ) && + assert_err( + listing[["dataset"]] %in% names(datasets), + sprintf( + "`%s$dataset` (%s) does not refer to any of the available datasets (%s)", + code_ref, listing[["dataset"]], afmm_datasets + ) + )) { + dataset_name <- listing[["dataset"]] + used_dataset_names[[sprintf("listings[[%d]]$dataset_name", i_listing)]] <- listing[["dataset"]] + + # listing$default_vars + if ("default_vars" %in% names(listing)) { + default_vars <- listing[["default_vars"]] + if (assert_err( + checkmate::test_character(default_vars, null.ok = TRUE), + sprintf("`%s$default_vars` should be a character vector", code_ref) + )) { + dataset <- datasets[[dataset_name]] + excess_cols <- setdiff(default_vars, names(dataset)) + assert_err( + length(excess_cols) == 0, + sprintf( + "`%s$default_vars` refers to unknown dataset variables (%s)", + code_ref, paste(excess_cols, collapse = ", ") + ) + ) + } + } + } + } + } + } + } + + if (!missing(plots) && !is.null(plots)) { + timeline_info <- plots[["timeline_info"]] + vline_vars <- plots[["vline_vars"]] + vline_day_numbers <- plots[["vline_day_numbers"]] + palette <- plots[["palette"]] + range_plots <- plots[["range_plots"]] + value_plots <- plots[["value_plots"]] + + # timeline_info + if (assert_err( + checkmate::test_character(timeline_info, names = "unique"), + "`plots$timeline_info` must be a named character vector" + )) { + timeline_col_names <- names(timeline_info) + timeline_info_cols_compulsory <- c("trt_start_date", "trt_end_date") + timeline_info_cols_optional <- c("icf_date", "part_end_date") + + missing_cols <- setdiff(timeline_info_cols_compulsory, timeline_col_names) + excess_cols <- setdiff(timeline_col_names, c(timeline_info_cols_compulsory, timeline_info_cols_optional)) + if (assert_err( + length(missing_cols) == 0, + sprintf("`plots$timeline_info` is missing elements %s", paste(missing_cols, ", ")) + ) && + assert_err( + length(excess_cols) == 0, + sprintf("`plots$timeline_info` has excess elements %s", paste(excess_cols, ", ")) + )) { + sl_dataset <- datasets[[subject_level_dataset_name]] + + # NOTE: Repetitions in this section are intentional. In this form they're an easier target for code generation. + + # timeline_info$icf_date + icf_date_ok <- FALSE + if ("icf_date" %in% names(timeline_info)) { + col <- timeline_info[["icf_date"]] + icf_date_ok <- + assert_err( + col %in% names(sl_dataset), + sprintf( + "`plots$timeline_info$%s` refers to column %s, which is not part of subject-level dataset %s", + "icf_date", col, subject_level_dataset_name + ) + ) && + assert_err( + inherits(sl_dataset[[col]], allowed_classes_date), + sprintf( + "`plots$timeline_info$%s` (%s) is not of allowed types (%s)", + "icf_date", col, paste(allowed_classes_date, collapse = ",") + ) + ) + } + # timeline_info$trt_start_date + col <- timeline_info[["trt_start_date"]] + start_date_ok <- + assert_err( + col %in% names(sl_dataset), + sprintf( + "`plots$timeline_info$%s` refers to column %s, which is not part of subject-level dataset %s", + "trt_start_date", col, subject_level_dataset_name + ) + ) && + assert_err( + inherits(sl_dataset[[col]], allowed_classes_date), + sprintf( + "`plots$timeline_info$%s` (%s) is not of allowed types (%s)", + "trt_start_date", col, paste(allowed_classes_date, collapse = ",") + ) + ) + # timeline_info$trt_end_date + col <- timeline_info[["trt_end_date"]] + end_date_ok <- + assert_err( + col %in% names(sl_dataset), + sprintf( + "`plots$timeline_info$%s` refers to column %s, which is not part of subject-level dataset %s", + "trt_end_date", col, subject_level_dataset_name + ) + ) && + assert_err( + inherits(sl_dataset[[col]], allowed_classes_date), + sprintf( + "`plots$timeline_info$%s` (%s) is not of allowed types (%s)", + "trt_end_date", col, paste(allowed_classes_date, collapse = ",") + ) + ) + # timeline_info$part_end_date + part_end_date_ok <- FALSE + if ("part_end_date" %in% names(timeline_info)) { + col <- timeline_info[["part_end_date"]] + part_end_date_ok <- + assert_err( + col %in% names(sl_dataset), + sprintf( + "`plots$timeline_info$%s` refers to column %s, which is not part of subject-level dataset %s", + "part_end_date", col, subject_level_dataset_name + ) + ) && + assert_err( + inherits(sl_dataset[[col]], allowed_classes_date), + sprintf( + "`plots$timeline_info$%s` (%s) is not of allowed types (%s)", + "part_end_date", col, paste(allowed_classes_date, collapse = ",") + ) + ) + } + + # Relationship between timeline vars (icf < start < end < part_end) + if (icf_date_ok && start_date_ok) { + assert_err( + is_date_lower_or_equal(sl_dataset[[timeline_info[["icf_date"]]]], sl_dataset[[timeline_info[["trt_start_date"]]]]), + sprintf( + "Contents of `plots$timeline_info` column %s (%s) should be lesser than or equal to those of column %s (%s)", + "icf_date", timeline_info[["icf_date"]], "trt_start_date", timeline_info[["trt_start_date"]] + ) + ) + } + + if (start_date_ok && end_date_ok) { + assert_err( + timeline_info[["trt_start_date"]] != timeline_info[["trt_end_date"]], + sprintf( + "`plots$timeline_info$%s` and `plots$timeline_info$%s` refer to the same dataset variable (%s)", + "trt_start_date", "trt_end_date", timeline_info[["trt_start_date"]] + ) + ) && + assert_err( + is_date_lower_or_equal(sl_dataset[[timeline_info[["trt_start_date"]]]], sl_dataset[[timeline_info[["trt_end_date"]]]]), + sprintf( + "Contents of `plots$timeline_info$%s` (%s) should be lesser than or equal to those of column %s (%s)", + "trt_start_date", timeline_info[["trt_start_date"]], "trt_end_date", timeline_info[["trt_end_date"]] + ) + ) + } + + if (end_date_ok && part_end_date_ok) { + assert_err( + is_date_lower_or_equal(sl_dataset[[timeline_info[["trt_end_date"]]]], sl_dataset[[timeline_info[["part_end_date"]]]]), + sprintf( + "Contents of `plots$timeline_info` column %s (%s) should be lesser than or equal to those of column %s (%s)", + "trt_end_date", timeline_info[["trt_end_date"]], "part_end_date", timeline_info[["part_end_date"]] + ) + ) + } + } + } + + # range_plots + if (assert_err(checkmate::test_list(range_plots, names = "unique"), "`plots$range_plots` must be a named list")) { + # [[i]] + for (i_plot in seq_along(range_plots)) { + plot_name <- names(range_plots)[[i_plot]] + plot <- range_plots[[i_plot]] + if (assert_err( + setequal(names(plot), c("dataset", "vars", "tooltip")), + "`plots$range_plots` needs exactly three children: `dataset`, `vars` and `tooltip`" + ) && + assert_err( + checkmate::test_string(plot[["dataset"]], min.chars = 1), + sprintf("Field `dataset` in `plots$range_plots` element (%s) should be a non-empty string", plot_name) + ) && + assert_err( + plot[["dataset"]] %in% names(datasets), + sprintf( + "Field `dataset` in `plots$range_plots` element (%s) does not refer to any of the available datasets: %s", + plot_name, paste(names(datasets), collapse = ", ") + ) + )) { + dataset_name <- plot[["dataset"]] + + used_dataset_names[[sprintf("plots$range_plots[[`%s`]]$dataset", plot_name)]] <- dataset_name + + dataset <- datasets[[dataset_name]] + + code_ref <- sprintf('plots$range_plots[["%s"]]', plot_name) + + # range_plots[[i]]$vars + vars <- plot[["vars"]] + if (assert_err( + checkmate::test_character(vars, names = "unique"), + sprintf("`%s$vars` must be a named character vector", code_ref) + )) { + var_col_names <- names(vars) + + range_plot_cols_compulsory <- c("start_date", "end_date", "decode") + range_plot_cols_optional <- c("grading", "serious_ae") + + missing_cols <- setdiff(range_plot_cols_compulsory, var_col_names) + excess_cols <- setdiff(var_col_names, c(range_plot_cols_compulsory, range_plot_cols_optional)) + if (assert_err( + length(missing_cols) == 0, + sprintf("`%s$vars` is missing elements: %s", code_ref, paste(missing_cols, collapse = ", ")) + ) && + assert_err( + length(excess_cols) == 0, + sprintf("`%s$vars` has excess elements: %s", code_ref, paste(excess_cols, collapse = ", ")) + )) { + + # range_plots[[i]]$vars$start_date + col <- vars[["start_date"]] + start_date_ok <- + assert_err( + col %in% names(dataset), + sprintf( + "`%s$vars$start_date` refers to column %s, which is not part of dataset %s", + code_ref, col, dataset_name + ) + ) && + assert_err( + inherits(dataset[[col]], allowed_classes_date), + sprintf( + "`%s$vars$start_date` column values (%s) are not of allowed types (%s)", + code_ref, col, paste(allowed_classes_date, collapse = ", ") + ) + ) + # range_plots[[i]]$vars$end_date + col <- vars[["end_date"]] + end_date_ok <- + assert_err( + col %in% names(dataset), + sprintf( + "`%s$vars$end_date` refers to column %s, which is not part of dataset %s", + code_ref, col, dataset_name + ) + ) && + assert_err( + inherits(dataset[[col]], allowed_classes_date), + sprintf( + "`%s$vars$end_date` column values (%s) are not of allowed types (%s)", + code_ref, col, paste(allowed_classes_date, collapse = ", ") + ) + ) + # range_plots[[i]]$vars$decode + col <- vars[["decode"]] + decode_ok <- + assert_err( + col %in% names(dataset), + sprintf( + "`%s$vars$decode` refers to column %s, which is not part of dataset %s", + code_ref, col, dataset_name + ) + ) && + assert_err( + inherits(dataset[[col]], allowed_classes_character_factor), + sprintf( + "`%s$vars$decode` column values (%s) are not of allowed types (%s)", + code_ref, col, paste(allowed_classes_character_factor, collapse = ", ") + ) + ) + # range_plots[[i]]$vars$grading + if ("grading" %in% names(vars)) { + col <- vars[["grading"]] + grading_ok <- + assert_err( + col %in% names(dataset), + sprintf( + "`%s$vars$grading` refers to column %s, which is not part of dataset %s", + code_ref, col, dataset_name + ) + ) && + assert_err( + inherits(dataset[[col]], allowed_classes_character_factor), + sprintf( + "`%s$vars$grading` column values (%s) are not of allowed types (%s)", + code_ref, col, paste(allowed_classes_character_factor, collapse = ", ") + ) + ) + } + # range_plots[[i]]$vars$serious_ae + if ("serious_ae" %in% names(vars)) { + col <- vars[["serious_ae"]] + + kind <- T_or(T_logical(), T_YN()) + serious_ae_ok <- + assert_err( + col %in% names(dataset), + sprintf( + "`%s$vars$serious_ae` refers to column %s, which is not part of dataset %s", + code_ref, col, dataset_name + ) + ) && + assert_err( + T_is_of_kind(dataset[[col]], kind), + sprintf( + "`%s$vars$serious_ae` column values (%s) are not of allowed types (%s)", + code_ref, col, T_get_type_as_text(kind) + ) + ) + } + + if (start_date_ok && end_date_ok) { + assert_err( + vars[["start_date"]] != vars[["end_date"]], + sprintf( + "`%s$vars$%s` and `plots$range_plots[['%s']]$vars$%s` refer to the same dataset variable (%s)", + code_ref, "start_date", plot_name, "end_date", vars[["start_date"]] + ) + ) && + assert_err( + is_date_lower_or_equal(dataset[[vars[["start_date"]]]], dataset[[vars[["end_date"]]]]), + sprintf( + "Contents of `%s$vars$%s` (%s) should be lesser than or equal to those of column %s (%s)", + code_ref, "start_date", vars[["start_date"]], "end_date", vars[["end_date"]] + ) + ) + } + } + } + + tooltip <- plot[["tooltip"]] + if (assert_err( + checkmate::test_character(tooltip, names = "named", null.ok = TRUE), + sprintf("`%s$tooltip` must be a named character vector", code_ref) + )) { + for (i_tooltip in seq_along(tooltip)) { + col <- tooltip[[i_tooltip]] + assert_err( + col %in% names(dataset), + sprintf( + '`%s$tooltip[[%d]]` refers to column "%s", which is not part of dataset %s', + code_ref, i_tooltip, col, dataset_name + ) + ) + } + } + } + } + } + + if (assert_err(checkmate::test_list(value_plots, names = "unique"), "`plots$value_plots` must be a named list")) { + # [[i]] + for (i_plot in seq_along(value_plots)) { + plot_name <- names(value_plots)[[i_plot]] + plot <- value_plots[[i_plot]] + if (assert_err( + setequal(names(plot), c("dataset", "vars", "tooltip")), + "`plots$value_plots` needs exactly three children: `dataset`, `vars` and `tooltip`" + ) && + assert_err( + checkmate::test_string(plot[["dataset"]], min.chars = 1), + sprintf(sprintf('`plots$value_plots[["%s"]]$dataset` should be a non-empty string', plot_name)) + ) && + assert_err( + plot[["dataset"]] %in% names(datasets), + sprintf( + '`plots$value_plots[["%s"]]$dataset` does not refer to any of the available datasets: %s', + plot_name, paste(names(datasets), collapse = ", ") + ) + )) { + dataset_name <- plot[["dataset"]] + used_dataset_names[[sprintf("`plots$value_plots[[`%s`]]$dataset`", plot_name)]] <- dataset_name + dataset <- datasets[[dataset_name]] + + code_ref <- sprintf('`plots$value_plots[["%s"]]`', plot_name) + + # value_plots[[i]]$vars + vars <- plot[["vars"]] + if (assert_err( + checkmate::test_character(vars, names = "unique"), + "Field `vars` in `plots$value_plots` element (%s) must be a named character vector" + )) { + var_col_names <- names(vars) + + value_plot_cols_compulsory <- c("analysis_param", "analysis_val", "analysis_date") + value_plot_cols_optional <- c("range_low_limit", "range_high_limit", "analysis_indicator", "summary_stats") + + missing_cols <- setdiff(value_plot_cols_compulsory, var_col_names) + excess_cols <- setdiff(var_col_names, c(value_plot_cols_compulsory, value_plot_cols_optional)) + if (assert_err( + length(missing_cols) == 0, + sprintf("`%s$vars` is missing elements: %s", code_ref, paste(missing_cols, collapse = ", ")) + ) && + assert_err( + length(excess_cols) == 0, + sprintf("`%s$vars` has excess elements: %s", code_ref, paste(excess_cols, collapse = ", ")) + )) { + + # value_plots[[i]]$vars$analysis_param + col <- vars[["analysis_param"]] + analysis_param_ok <- + assert_err( + col %in% names(dataset), + sprintf( + "`%s$vars$analysis_param` refers to column %s, which is not part of dataset %s", + code_ref, col, dataset_name + ) + ) && + assert_err( + inherits(dataset[[col]], allowed_classes_character_factor), + sprintf( + "`%s$vars$analysis_param` column values (%s) are not of allowed types (%s)", + code_ref, col, paste(allowed_classes_character_factor, collapse = ", ") + ) + ) + # value_plots[[i]]$vars$analysis_val + col <- vars[["analysis_val"]] + analysis_val_ok <- + assert_err( + col %in% names(dataset), + sprintf( + "`%s$vars$analysis_val` refers to column %s, which is not part of dataset %s", + code_ref, col, dataset_name + ) + ) && + assert_err( + inherits(dataset[[col]], allowed_classes_numeric), + sprintf( + "`%s$vars$analysis_val` column values (%s) are not of allowed types (%s)", + code_ref, col, paste(allowed_classes_numeric, collapse = ", ") + ) + ) + # value_plots[[i]]$vars$analysis_date + col <- vars[["analysis_date"]] + analysis_date_ok <- + assert_err( + col %in% names(dataset), + sprintf( + "`%s$vars$analysis_date` refers to column %s, which is not part of dataset %s", + code_ref, col, dataset_name + ) + ) && + assert_err( + inherits(dataset[[col]], allowed_classes_date), + sprintf( + "`%s$vars$analysis_date` column values (%s) are not of allowed types (%s)", + code_ref, col, paste(allowed_classes_date, collapse = ", ") + ) + ) + # value_plots[[i]]$vars$analysis_indicator + if ("analysis_indicator" %in% names(vars)) { + col <- vars[["analysis_indicator"]] + analysis_indicator_ok <- + assert_err( + col %in% names(dataset), + sprintf( + "`%s$vars$analysis_indicator` refers to column %s, which is not part of dataset %s", + code_ref, col, dataset_name + ) + ) && + assert_err( + inherits(dataset[[col]], allowed_classes_character_factor), + sprintf( + "`%s$vars$analysis_indicator` column values (%s) are not of allowed types (%s)", + code_ref, col, paste(allowed_classes_character_factor, collapse = ", ") + ) + ) + } + # value_plots[[i]]$vars$range_low_limit + range_low_limit_ok <- FALSE + if ("range_low_limit" %in% names(vars)) { + col <- vars[["range_low_limit"]] + range_low_limit_ok <- + assert_err( + col %in% names(dataset), + sprintf( + "`%s$vars$range_low_limit refers` to column %s, which is not part of dataset %s", + code_ref, col, dataset_name + ) + ) && + assert_err( + inherits(dataset[[col]], allowed_classes_numeric), + sprintf( + "`%s$vars$range_low_limit` column values (%s) are not of allowed types (%s)", + code_ref, col, paste(allowed_classes_numeric, collapse = ", ") + ) + ) + } + + # value_plots[[i]]$vars$range_high_limit + range_high_limit_ok <- FALSE + if ("range_high_limit" %in% names(vars)) { + col <- vars[["range_high_limit"]] + range_high_limit_ok <- + assert_err( + col %in% names(dataset), + sprintf( + "`%s$vars$range_high_limit` refers to column %s, which is not part of dataset %s", + code_ref, col, dataset_name + ) + ) && + assert_err( + inherits(dataset[[col]], allowed_classes_numeric), + sprintf( + "`%s$vars$range_high_limit` column values (%s) are not of allowed types (%s)", + code_ref, col, paste(allowed_classes_numeric, collapse = ", ") + ) + ) + } + + # value_plots[[i]]$vars$summary_stats # TODO + + if (range_low_limit_ok && range_high_limit_ok) { + assert_err( + vars[["range_low_limit"]] != vars[["range_high_limit"]], + sprintf( + "`%s$vars$%s` and `%s$vars$%s` refer to the same dataset variable (%s)", + code_ref, "range_low_limit", code_ref, "range_high_limit", vars[["range_low_limit"]] + ) + ) && + assert_err( + all(dataset[[vars[["range_low_limit"]]]] <= dataset[[vars[["range_high_limit"]]]], na.rm = TRUE), + sprintf( + "Contents of `%s$vars$%s` (%s) should be lesser than or equal to those of `%s$vars$%s` (%s)", + code_ref, "range_low_limit", vars[["range_low_limit"]], code_ref, "range_high_limit", vars[["range_high_limit"]] + ) + ) + } + } + } + + tooltip <- plot[["tooltip"]] + if (assert_err( + checkmate::test_character(tooltip, names = "named", null.ok = TRUE), + sprintf('`plots$value_plots[["%s"]]$tooltip` must be a named character vector', plot_name) + )) { + for (i_tooltip in seq_along(tooltip)) { + col <- tooltip[[i_tooltip]] + assert_err( + col %in% names(dataset), + sprintf( + '`plots$value_plots[["%s"]]$tooltip[[%d]]` refers to column "%s", which is not part of dataset %s', + plot_name, i_tooltip, col, dataset_name + ) + ) + } + } + } + } + } + + # vline_vars + if (assert_err( + checkmate::test_character(vline_vars, names = "named", null.ok = TRUE), + "`plots$vline_vars` must be a named character vector" + )) { + for (i_vline in seq_along(vline_vars)) { + col <- vline_vars[[i_vline]] + assert_err( + col %in% names(sl_dataset), + sprintf( + 'plots$vline_vars[[%d]] refers to column "%s", which is not part of dataset %s', + i_vline, col, subject_level_dataset_name + ) + ) + } + } + + # vline_day_numbers + assert_err( + checkmate::test_integerish(vline_day_numbers, names = "named", null.ok = TRUE), + "`plots$vline_day_numbers` must be a vector of named integers" + ) && + assert_err( + all(vline_day_numbers != 0), + "`plots$vline_day_numbers` must be a valid (non-zero) CDISC Study day" + ) + + # palette + assert_err( + checkmate::test_character(palette, names = "named", null.ok = TRUE) && + all(palette %in% grDevices::colors() | grepl("^#[0-9a-fA-F]{6}$", palette)), + "`plots$palette` must be a vector of named colors" + ) + } + + # subjid_var present in all mentioned datasets + if (subjid_var_ok) { + for (i_dataset in seq_along(used_dataset_names)) { + param <- names(used_dataset_names)[[i_dataset]] + dataset_name <- used_dataset_names[[i_dataset]] + + dataset <- datasets[[dataset_name]] + assert_err( + subjid_var %in% names(dataset), + sprintf( + "Dataset %s (referenced from %s) is missing `subjid_var` column %s", + dataset_name, param, subjid_var + ) + ) + } + } + + res <- list(warnings = warn, errors = err) + + return(res) +} + + +# nolint end diff --git a/R/create_plots.R b/R/create_plots.R new file mode 100644 index 0000000..bdf945a --- /dev/null +++ b/R/create_plots.R @@ -0,0 +1,259 @@ +#' Function to create ae or cm plot +#' +#' @param data Data frame containing the data for the plot +#' @param limits Vector that contains the limits of the plot +#' @param palette Named vector that contains the colors that are used in the plot +#' +#' @keywords internal +#' +#' @return A ggplot2 object +create_ae_cm_plot <- function(data, x_limits, palette, sl_info, vline_vars, vline_day_numbers, + ref_date) { + # set column for title banner + data[["title_banner"]] <- " " + + # NOTE(miguel): The following song and dance courtesy of plotly::layout not supporting dates on axes + + half_day_offset <- 0.5 # Makes it possible to see events that start and end on the same day + + # column names that end with '_z' are days that represent ref_date as zero (unlike CDISC) + data[["start_day_z"]] <- as.numeric(data[["start_date"]] - ref_date) + data[["end_day_z"]] <- as.numeric(data[["end_date"]] - ref_date) + half_day_offset + data[["arrow_left_z"]] <- as.numeric(data[["arrow_left"]] - ref_date) + data[["arrow_right_z"]] <- as.numeric(data[["arrow_right"]] - ref_date) + x_limits_z <- x_limits - ref_date + + grading_available <- "grading" %in% names(data) + grading <- "" + if (grading_available) grading <- data[["grading"]] + + p <- ggplot2::ggplot(data, ggplot2::aes(x = .data[["start_day_z"]], y = .data[["decode"]])) + p <- p + ggplot2::theme_bw() + p <- p + ggplot2::geom_rect(ggplot2::aes( + xmin = .data[["start_day_z"]], + xmax = .data[["end_day_z"]], + ymin = .data[["decode"]], + ymax = .data[["decode"]], + color = grading + ), + size = 3 + ) + + if ("serious_ae" %in% names(data)) { + sae_labels <- ifelse(data[["serious_ae"]], "SAE", "") + p <- p + ggplot2::geom_text(ggplot2::aes( + x = .data[["start_day_z"]], + y = .data[["decode"]], + label = sae_labels + ), + colour = "red", nudge_y = 0.25, nudge_x = 1, size = 3 + ) + } + + # hack to allow hover info at the beginning of the range through transparent dots + p <- p + ggplot2::geom_point(ggplot2::aes( + x = .data[["start_day_z"]], + y = .data[["decode"]], + color = grading + ), + size = 5, alpha = 0, show.legend = FALSE + ) + p <- p + ggplot2::scale_colour_manual(name = "Legend", values = palette) + p <- p + ggplot2::scale_fill_manual(name = "Legend", values = palette) + + if (any(!is.na(data[["arrow_left"]]))) { + p <- p + ggplot2::geom_text(ggplot2::aes( + x = .data[["arrow_left_z"]] - .5, + y = .data[["decode"]], + label = sprintf("\u2190"), + color = grading + ), + size = 10, show.legend = FALSE + ) + } + + if (any(!is.na(data[["arrow_right"]]))) { + p <- p + ggplot2::geom_text(ggplot2::aes( + x = .data[["arrow_right_z"]] + .7, + y = .data[["decode"]], + label = sprintf("\u2192"), + color = grading + ), + size = 10, show.legend = FALSE + ) + } + + p <- p + ggplot2::facet_wrap(~ .data[["title_banner"]], ncol = 1, scales = "free_y") + p <- p + ggplot2::theme( + legend.title = ggplot2::element_blank(), + legend.justification = "top", + legend.position = ifelse(grading_available, "right", "none"), + axis.text.y = ggplot2::element_text(size = 7), + strip.text = ggplot2::element_text(size = 4), + panel.spacing = ggplot2::unit(0, "lines") + ) + + as_CDISC_days <- function(days) days + (days >= 0) + p <- p + ggplot2::scale_x_continuous( + labels = function(days) { + dates <- ref_date + days + days <- as_CDISC_days(days) + sprintf("%s\nDay %s", dates, days) + }, + limits = x_limits_z + ) + + p <- create_vlines(p, sl_info, vline_vars, vline_day_numbers) + + return(p) +} + +#' Function to create lab or vital sign plot +#' +#' @param data Data frame containing the data for the plot +#' @param lb_selected_params Vector containing the values of the selected parameters +#' @param day Character name of the variable that contains the analyze day +#' @param val Character name of the variable that contains analyze value +#' @param low_limit Character name of the variable that contains the values of the low limit of the normal range +#' @param high_limit Character name of the variable that contains the values of the high limit of the normal range +#' @param params Character name of the variable that contains the values of the analyze parameters +#' @param analysis_indicator Character name of the variable that contains the values analysis indicator +#' @param summary_stats Character name of the variable that contains the values of the summary statistic +#' @param limits Vector that contains the limits of the plot +#' +#' @keywords internal +#' +#' @return A ggplot2 object +create_lb_vs_plot <- function(data, date, val, low_limit, high_limit, param, summary_stats, x_limits, + palette, sl_info, vline_vars, vline_day_numbers, ref_date) { + # NOTE(miguel): The following song and dance courtesy of plotly::layout not supporting dates on axes + # column names that end with '_z' are days that represent ref_date as zero (unlike CDISC) + data[["date_z"]] <- as.numeric(as.Date(data[[date]]) - ref_date) + x_limits_z <- x_limits - ref_date + + # initiate plot object + plot <- ggplot2::ggplot(data, ggplot2::aes(x = .data[["date_z"]], y = .data[[val]], group = 1)) + + ggplot2::theme_bw() + + # reference range + if (!is.null(low_limit) && !is.null(high_limit)) { + # TODO: Assert that low and high limits are the same ( maybe even outside this function ? ) + low_limit <- unique(data[[low_limit]])[[1]] + high_limit <- unique(data[[high_limit]])[[1]] + + # Plotly doesn't support ggplot -Inf,+Inf ranges for geom_rect (https://github.com/plotly/plotly.R/issues/1559) + # so we're forced to derive a range ourselves + plot <- plot + + ggplot2::geom_rect(ggplot2::aes( + xmin = x_limits_z[[1]], xmax = x_limits_z[[2]], ymin = low_limit, ymax = high_limit, + fill = "REFERENCE RANGE" + ), alpha = 0.3, inherit.aes = FALSE) + } + + plot <- create_vlines(plot, sl_info, vline_vars, vline_day_numbers) + + + # line or summary line + if (is.null(summary_stats)) { + plot <- plot + ggplot2::geom_line(ggplot2::aes(linetype = .data[[param]]), size = 0.1) + } else { + summary_stats_label <- attr(data[[summary_stats]], "label") + plot <- plot + ggplot2::geom_line(ggplot2::aes( + x = .data[["date_z"]], + y = .data[[summary_stats]], + linetype = summary_stats_label + ), + size = 0.1 + ) + } + + # dots (plain or analysis indicator) + if ("analysis_indicator" %in% names(data)) { + # NOTE: if original order is desired, app creator should provide sorted analysis_indicator factor levels + plot <- plot + ggplot2::geom_point(ggplot2::aes( + color = .data[["analysis_indicator"]], + fill = .data[["analysis_indicator"]] + ), size = 1) + } else { + plot <- plot + ggplot2::geom_point(color = "black", size = 1) + } + + + plot <- plot + ggplot2::scale_color_manual(name = "Legend", values = palette) + plot <- plot + ggplot2::scale_fill_manual(name = "Legend", values = palette) + + as_CDISC_days <- function(days) days + (days >= 0) + + # get facet plots and set formats + plot <- plot + ggplot2::facet_wrap(ggplot2::vars(.data[[param]]), ncol = 1, scales = "free_y") + + ggplot2::theme( + legend.title = ggplot2::element_blank(), # disable legend title + legend.justification = "top", + axis.text.y = ggplot2::element_text(size = 7), # y-axis text size + strip.text = ggplot2::element_text(size = 6), # title text/banner size + panel.spacing.y = ggplot2::unit(0, "lines") # distance between plots in facet_wrap + ) + + ggplot2::xlab("") + ggplot2::ylab("") + + ggplot2::scale_x_continuous( + labels = function(days) { + dates <- ref_date + days + days <- as_CDISC_days(days) + sprintf("%s\nDay %s", dates, days) + }, + limits = x_limits_z + ) + + # HACK: Offset the limits of the y axis to account for label strips + # TODO: Remove during transition away from ggplot2+plotly + data_range <- range(data[[val]]) + range_width <- data_range[[2]] - data_range[[1]] + data_range <- data_range + c(-0.15 * range_width, 0) + plot <- plot + ggplot2::coord_cartesian( + ylim = data_range, expand = TRUE, default = TRUE, clip = "on" + ) + + return(plot) +} + +#' Add vertical lines to plot +#' +#' @param plot A ggplot2 object +#' @param plot_data Data of the plot +#' @param vline_vars A list used to define the label and position of dashed lines in the plots +#' +#' @keywords internal +#' +#' @return A ggplot2 object +create_vlines <- function(plot, plot_data, vline_vars, vline_day_numbers) { + # Days are CDISC-based which means anything >=0 has been incremented by 1, so we undo that + cdisc_to_continuous_day_number <- function(day) day - (day >= 0) + + vline_x_data <- lapply(vline_vars, function(vline) { + if (inherits(plot_data[[vline]], "Date")) { + # The logical space of the plot _does_ use 0 as the reference date, so no transformation is necessary for dates + plot_data[[vline]] - plot_data[["trt_start_date"]] + } else { + if (length(plot_data[[vline]]) > 1) browser() + cdisc_to_continuous_day_number(plot_data[[vline]]) + } + }) + + vline_x_data <- append(vline_x_data, cdisc_to_continuous_day_number(vline_day_numbers)) + + not_null_vline_x_data <- sapply(vline_x_data, function(x) { + !is.null(x) + }) + vline_x_data <- setdiff(vline_x_data, not_null_vline_x_data) + x <- unlist(vline_x_data, use.names = FALSE) + colors <- names(vline_x_data) + + if (length(colors) && length(x)) { # this guard only to prevent ggplotly from failing if on empty vline spec + vline_data <- data.frame(x, colors) + plot <- plot + ggplot2::geom_vline( + data = vline_data, ggplot2::aes(xintercept = x, color = colors), + linetype = "dashed", alpha = 1 + ) + } + + return(plot) +} diff --git a/R/data_prep.R b/R/data_prep.R new file mode 100644 index 0000000..9544c6f --- /dev/null +++ b/R/data_prep.R @@ -0,0 +1,112 @@ +#' Filter datasets for patient information section +#' +#' @inheritParams mod_patient_profile_server +#' @param df TODO +#' @param columns TODO +#' @param selected_key TODO +#' +#' @keywords internal +#' +#' @return A list containing datasets for patient information and plots +pt_info_data_filter <- function(df, subjid_var, columns, selected_key) { + res <- NA + row_index <- which(df[[subjid_var]] == selected_key) + if (length(row_index) == 1) { + res <- df[row_index, columns] + } + + return(res) +} + +#' This function will return corresponding labels in a dataset. +#' @param dataset Dataset to get labels from. +#' @param col_names Vector of character names of the columns in the dataset. +#' @param keep_as_original Logical TRUE or FALSE: If TRUE, the corresponding column with +#' no label will return column name, else return NA. +#' If not assigned, it will return all labels of the the dataset. Otherwise, +#' only labels of corresponding columns will be returned. +#' +#' @keywords internal +#' +#' @return Vector containing the labels of the dataset +get_labels <- function(dataset, col_names = NULL, keep_as_original = FALSE) { + if (is.null(col_names)) { + col_names <- names(dataset) + } + out <- sapply(col_names, function(name) { + if (name %in% names(dataset)) { + label <- attributes(dataset[[name]])$label + if (is.null(label)) { + ifelse(keep_as_original, name, NA) + } else { + label + } + } else { + stop(paste0( + "Column '", name, "' NOT in Dataset: '", + deparse(substitute(dataset)), "'!" + )) + } + }) + + out <- unname(out) + return(out) +} + +flag_columns_shinyvalidate <- function(cols, pre = "", post = "") { + shiny::validate( + shiny::need( + length(cols) == 0, + message = paste(pre, paste0("`", cols, "`", collapse = ", "), post) + ) + ) +} + +flag_columns_capture_error <- function(cols, pre = "", post = "") { + res <- NULL + if (length(cols)) { + res <- paste(pre, paste0("`", cols, "`", collapse = ", "), post) + } + return(res) +} + +ensure_columns_exist <- function(df, cols, flag_column_function = flag_columns_shinyvalidate) { + checkmate::assert_character(cols) + excess_columns <- setdiff(cols, names(df)) + + return(flag_column_function( + excess_columns, + pre = paste( + "dv.papo: Can't find user defined column(s) in the dataset.", + "You've tried to set the following column(s):" + ), + post = "Have you spelled their names correctly?" + )) +} + +ensure_columns_are_dates_or_datetimes <- function(df, cols, flag_column_function = flag_columns_shinyvalidate) { + checkmate::assert_character(cols, null.ok = TRUE) + mask <- sapply(df[cols], function(x) inherits(x, c("Date", "POSIXt"))) + incorrect_cols <- cols[!mask] + return(flag_column_function( + incorrect_cols, + pre = paste( + "dv.papo: Column(s) holding dates must be of type `Date` or `POSIXt`.", + "The following column(s) are not of those types:" + ), + post = r"----(Type "vignette("lubridate")" into your console to learn more about time types.)----" + )) +} + +ensure_columns_are_numeric <- function(df, cols, flag_column_function = flag_columns_shinyvalidate) { + checkmate::assert_character(cols, null.ok = TRUE) + date_mask <- sapply(df[cols], is.numeric) + incorrect_cols <- cols[!date_mask] + return(flag_column_function( + incorrect_cols, + pre = paste( + "dv.papo: Column(s) holding days/values must be of type numeric", + "The following column(s) are not of type numeric:" + ) + )) +} diff --git a/R/dressing_room.R b/R/dressing_room.R new file mode 100644 index 0000000..53141c6 --- /dev/null +++ b/R/dressing_room.R @@ -0,0 +1,1251 @@ +# Ad-hoc type system ---- + +# basic types +T_logical <- function() list(kind = "logical") +T_factor <- function() list(kind = "factor") +T_character <- function() list(kind = "character") +T_date <- function() list(kind = "date") +T_datetime <- function() list(kind = "datetime") +T_integer <- function(min = NA, max = NA) list(kind = "integer", min = min, max = max) # allows numeric if all values are integer +T_numeric <- function(min = NA, max = NA) list(kind = "numeric", min = min, max = max) + +# permissive types +T_anything <- function() list(kind = "anything") + +# sum types +T_or <- function(...) list(kind = "or", options = list(...)) + +# known- and variable-length collections +T_group <- function(...) list(kind = "group", elements = list(...)) + +# domain-specific types +T_mod_ID <- function() list(kind = "mod") +T_dataset_name <- function() list(kind = "dataset_name") +T_col <- function(dataset_name, sub_kind = T_anything()) { + list(kind = "col", dataset_name = dataset_name, sub_kind = sub_kind) +} +T_color <- function() list(kind = "color") +T_CDISC_study_day <- function() list(kind = "cdisc_study_day", min = NA, max = NA) +T_YN <- function() list(kind = "YN") + +T_is_of_kind <- function(var, type) { + res <- FALSE + if (length(type) == 1 && is.na(type)) browser() + + if (type[["kind"]] == "or") { + for (option in type[["options"]]) res <- res || T_is_of_kind(var, option) + } else if (type[["kind"]] == "anything") { + res <- TRUE + } else if (type[["kind"]] == "factor") { + res <- is.factor(var) + } else if (type[["kind"]] == "character") { + res <- is.character(var) + } else if (type[["kind"]] == "date") { + res <- inherits(var, "Date") + } else if (type[["kind"]] == "datetime") { + res <- inherits(var, "POSIXt") + } else if (type[["kind"]] == "numeric") { + res <- is.numeric(var) + } else if (type[["kind"]] == "integer") { + res <- is.integer(var) || (is.numeric(var) && all(var[is.finite(var)] %% 1 == 0)) + } else if (type[["kind"]] == "logical") { + res <- is.logical(var) + } else if (type[["kind"]] == "cdisc_study_day") { + res <- (is.integer(var) || (is.numeric(var) && all(var[is.finite(var)] %% 1 == 0))) && all(var[is.finite(var)] != 0) + } else if (type[["kind"]] == "YN") { + res <- ((is.character(var) && setequal(unique(var), c("Y", "N"))) || + is.factor(var) && setequal(levels(var), c("Y", "N"))) + } else { + browser() + } + return(res) +} + +# flags +T_flag <- function(x, ...) { + flag_names <- list(...) + + unknown_flags <- setdiff( + flag_names, + c( # common flags + "optional", "zero_or_more", "as_array", "named", "ignore", + # domain-specific flags + "subject_level_dataset_name", "subjid_var" + ) + ) + if (length(unknown_flags)) browser() + + flag_values <- as.list(rep(TRUE, length(flag_names))) + flags <- stats::setNames(flag_values, flag_names) + return(do.call(structure, append(list(x), flags))) +} + +T_map_to <- function(orig, dest) structure(orig, map_to = dest) # maps dataset col to a type the module understands + +# Pair documentation with module API ---- + +T_get_type_as_text <- function(elem) { + res <- "" + + types <- list( + group = "list", + logical = "logical", + factor = "factor", + integer = "integer", + cdisc_study_day = "integer", + numeric = "numeric", + mod = "character", + dataset_name = "character", + col = "character", + color = "character", + character = "character", + date = "Date", + datetime = "POSIXt", + YN = '"Y"/"N"' + ) + + if (elem$kind == "or") { + res <- paste(Map(T_get_type_as_text, elem$options), collapse = "|") + } else if (!(elem$kind %in% names(types))) { + message(paste("Missing kind", elem$kind)) + } else { + res <- types[[elem$kind]] + } + + return(res) +} + +T_get_use_as_text_lines <- function(elem) { + res <- character(0) + + if (elem$kind == "mod") { + res <- "Unique Shiny module identifier" + } else if (elem$kind == "dataset_name") { + if (isTRUE(attr(elem, "subject_level_dataset_name"))) { + res <- "Subject-level dataset name" + } else { + res <- "Dataset name" + } + } else if (elem$kind == "col") { + if (isTRUE(attr(elem, "subjid_var"))) { + res <- "Unique subject identifier column" + } else { + res <- sprintf("Indexes into dataset `%s`", elem$dataset_name) + if (!identical(elem$sub_kind, T_anything())) { + res <- c(res, sprintf("Expects `[%s]` values", T_get_type_as_text(elem$sub_kind))) + } + } + } else if (elem$kind == "cdisc_study_day") { + res <- "Represents a CDISC (non-zero) Study Day" + } else if (elem$kind == "color") { + res <- "Contains either an HTML (#xxxxxx) or an R color" + } else if (elem$kind %in% c("integer", "character", "group")) { + # nothing + } else { + message(paste("Missing use for kind", elem$kind)) + } + + return(res) +} + +T_attach_docs <- function(api, docs) { + stopifnot(is.character(docs[[1]])) + + attr(api, "docs") <- list( + type = T_get_type_as_text(api), + auto_desc = T_get_use_as_text_lines(api), + manual_desc = docs[[1]] + ) + + if (api$kind == "group") { + docs[[1]] <- NULL + + if (length(api$elements) != length(docs)) { + stop(sprintf("api and docs are of different lengths (%d and %d)", length(api), length(docs))) + } else if (!identical(names(api$elements), names(docs))) { + stop(sprintf( + "api and docs have different names (%s and %s)", + paste(names(api$elements), collapse = ","), paste(names(docs), collapse = ",") + )) + } + + for (name in names(api$elements)) { + api$elements[[name]] <- T_attach_docs(api$elements[[name]], docs[[name]]) + } + } + + return(api) +} + +T_eval_args <- function(args, eval_env) { + # evaluate arguments before handing them down to arg-rewriting routines + arg_names <- names(args) + for (i_arg in seq_along(args)) { + name <- arg_names[[i_arg]] + eval_res <- eval(args[[i_arg]], envir = eval_env) + args[i_arg] <- stats::setNames(list(eval_res), name) # R inferno 8.1.55 + } + return(args) +} + +# Permit caller to provide lists when arrays are desired by the module ---- + +T_honor_as_array_flag_inner <- function(api_field, elem) { + if (isTRUE(attr(api_field, "zero_or_more"))) { + attr(api_field, "zero_or_more") <- FALSE + for (i in seq_along(elem)) { + elem[[i]] <- T_honor_as_array_flag_inner(api_field, elem[[i]]) + } + } else if (api_field$kind == "group") { + elem_names <- names(elem) + for (i in seq_along(elem)) { + name <- elem_names[[i]] + if (!is.null(name) && name %in% names(api_field[["elements"]]) && !is.null(elem[[i]])) { + elem[i] <- stats::setNames( + list(T_honor_as_array_flag_inner(api_field[["elements"]][[name]], elem[[i]])), name + ) # R inferno 8.1.55 + } + } + } + + if (isTRUE(attr(api_field, "as_array")) && is.list(elem)) { + elem <- unlist(elem) + } + + return(elem) +} + +T_honor_as_array_flag <- function(mod_API, args) { + env_that_called_the_module_function <- parent.frame(2) + args <- T_eval_args(args, eval_env = env_that_called_the_module_function) + args <- T_honor_as_array_flag_inner(mod_API, args) + return(args) +} + +# Map allowed types to those expected by the module ---- + +T_honor_map_to_flag_inner <- function(datasets, api_field, elem, field_to_dataset_map, current_field_name) { + res <- list(map = field_to_dataset_map, actions = list()) + + if (isTRUE(attr(api_field, "zero_or_more"))) { + attr(api_field, "zero_or_more") <- FALSE + for (i in seq_along(elem)) { + res <- T_honor_map_to_flag_inner(datasets, api_field, elem[[i]], field_to_dataset_map, current_field_name) + } + } else if (api_field$kind == "group") { + group_field_to_dataset_map <- field_to_dataset_map # push new mapping used only inside group + + elem_names <- names(elem) + for (i in seq_along(elem)) { + name <- elem_names[[i]] + if (!is.null(name) && name %in% names(api_field[["elements"]]) && !is.null(elem[[i]])) { + subres <- T_honor_map_to_flag_inner( + datasets, api_field[["elements"]][[name]], elem[[i]], group_field_to_dataset_map, name + ) + res[["actions"]] <- append(res[["actions"]], subres[["actions"]]) + group_field_to_dataset_map <- subres[["map"]] # carry mappings defined inside this group + } + } + + res[["map"]] <- field_to_dataset_map # pop old mapping + } else if (api_field$kind == "dataset_name") { + res[["map"]][[current_field_name]] <- elem + } else if (api_field$kind == "col") { + map_to <- attr(api_field$sub_kind, "map_to") + if (!is.null(map_to)) { + dataset <- field_to_dataset_map[[api_field$dataset_name]] + if (is.null(dataset)) stop("Column refers to unknown dataset") # TODO: Check this upstream, warn earlier + res[["actions"]][[length(res[["actions"]]) + 1]] <- list(dataset = dataset, col = elem, kind = map_to) + } + } + + return(res) +} + +T_do_map <- function(datasets, action) { + dataset <- action[["dataset"]] + col <- action[["col"]] + kind <- action[["kind"]] + + col_data <- datasets[[dataset]][[col]] + if (!T_is_of_kind(col_data, kind)) { + mapped_from <- attr(col_data, "mapped_from") + if (!is.null(mapped_from)) { + stop(sprintf( + "Dataset %s column %s has already been mapped from %s to %s", + dataset, col, mapped_from, T_get_type_as_text(kind) + )) + } + + mapped_from <- class(col_data) + + attrs <- attributes(col_data) + if (kind == "logical" && T_is_of_kind(col_data, T_YN())) { + col_data <- (col_data == "Y") + } else { + kind_s <- T_get_type_as_text(kind) + stop(sprintf("Can't map data from type %s to %s", paste(mapped_from, collapse = ", "), kind_s)) + } + + attributes(col_data) <- attrs + attr(col_data, "mapped_from") <- mapped_from + } + + return(col_data) +} + +T_honor_map_to_flag <- function(datasets, mod_API, args) { + # NOTE: Here we overwrite affected dataset columns with the desired type for the purpose of + # a particular argument. A 'Y/N' field will be cast to `logical` an thus will become + # unavailable as a character variable. + # Ideally we would like to cast dataset columns to separate columns with a different + # name and overwrite args to point to those new columns, which would sidestep that + # restriction. This, however, would entail modifying the argument list in reactive + # time depending on the contents of the dataset, which would force mod_*_server to + # treat column name arguments as reactives. That seems too much of a hassle for little + # benefit. + env_that_called_the_module_function <- parent.frame(2) + args <- T_eval_args(args, eval_env = env_that_called_the_module_function) + + mapping_actions <- T_honor_map_to_flag_inner(datasets, mod_API, args, + field_to_dataset_map = list(), + current_field_name = "" + )[["actions"]] + + for (action in mapping_actions) { + dataset <- action[["dataset"]] + col <- action[["col"]] + datasets[[dataset]][[col]] <- T_do_map(datasets, action) + } + + return(datasets) +} + +inline_shiny_input <- function(elem, label = NULL, name_selector = NULL, label_elem = NULL) { + if (is.character(label) && length(label) == 1 && nchar(label) > 0) { + label_elem <- shiny::tags$label(`for` = NULL, label) + } + + res <- shiny::tags[["div"]]( + style = "display: flex; align-items: baseline; place-content: space-between; column-gap:1rem", + label_elem, name_selector, elem + ) + return(res) +} + +enable_nicer_unnamed_multicolumn_selection <- TRUE + +color_picker_input <- function(inputId, value = NULL) { + # https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/color + + # https://shiny.posit.co/r/articles/build/building-inputs/ + + # https://forum.posit.co/t/bookmarking-custom-inputs/162483 + + restored_value <- shiny::restoreInput(id = inputId, default = NULL) + if (!is.null(restored_value)) value <- restored_value + + list( + shiny::singleton(shiny::tags$head( + shiny::tags$script(r"--( + var color_picker_binding = new Shiny.InputBinding(); + $.extend(color_picker_binding, { + find: function(scope) { return scope.querySelectorAll('.color-picker'); }, + getValue: function(el) { return el.value; }, + subscribe: function(el, callback) { + $(el).on('change.color_picker_binding', function(e) { callback(); }); + }, + unsubscribe: function(el) { $(el).off('.color_picker_binding'); } + }); + Shiny.inputBindings.register(color_picker_binding); + )--") + )), + shiny::tags$input( + id = inputId, class = "color-picker", type = "color", style = "border:none", value = value + ) + ) +} + +# Module explorer app ---- +explorer_ui <- function() { + panel <- function(...) { + shiny::div( + class = "panel panel-default", + style = "background-color:#eff7ff;", + shiny::div(class = "panel-body", style = "padding-bottom:0.5rem;", ...) + ) + } + + ui <- shiny::fluidPage( + fontawesome::fa_html_dependency(), + shiny::tags$head(shiny::HTML("Davinci's Module Dressing Room")), + + # shamelessly stolen from https://github.com/insightsengineering/teal.modules.bsafe/blob/main/inst/www/bsafe.css + # and https://github.com/insightsengineering/teal.modules.bsafe/blob/main/R/mod_bsafe.R + shiny::tags$head(shiny::tags$style(shiny::HTML(r"--( + .toggle-label .chevron:before { + font-size: 2rem; + display: inline-block; + margin-left: 1rem; + content:"\203A"; + } + + .toggle-checkbox:checked + .toggle-label .chevron:before { + font-size: 2rem; + display: inline-block; + content:"\203A"; + transform: rotate(90deg); + } + + .margin_bottom_0px { margin-bottom:0px; } /* Gen-X CSS */ + + .inc_dec_button {background-color:#ffffffaa; border-radius:4px; border: 1px solid #000000aa; margin-bottom:14px;} + .inc_dec_button:hover {background-color:#eeeeeeaa; border: 1px solid #000000ff} + )--"))), + shiny::div(style = "height:1.5rem"), + shiny::sidebarLayout( + shiny::div( + class = "col-sm-3", + panel( + shiny::h4("DaVinci's Module Dressing Room", align = "center", + style = "margin-top:0; margin-bottom:2rem; font-weight:bold"), + inline_shiny_input( + shiny::selectInput( + inputId = "spec", label = NULL, + choices = names(module_specifications), selected = NULL, + selectize = FALSE + ), + label_elem = shiny::tags$label(`for` = "spec", "Module", title = "Module to configure") + ), + shiny::uiOutput("data_input") + ), + panel( + shiny::uiOutput("selectors") + ), + ), + shiny::mainPanel( + width = 9, style = "padding-left:0.5rem;", + panel( + shiny::conditionalPanel( + condition = "input.edit_code == false", + shiny::uiOutput("code") + ), + shiny::conditionalPanel( + condition = "input.edit_code == true", + shiny::tags$textarea( + id = "manual_code", + style = "width:100%; resize:vertical; height: 300px; font-family: 'Courier New', Courier, monospace;", + class = "form-control" + ) + ), + shiny::checkboxInput("edit_code", "Edit code", value = FALSE) + ), + shiny::uiOutput("module") + ) + ) + ) + + return(ui) +} + +message_well <- function(title, contents, color = "f5f5f5") { + style <- sprintf(r"---( + padding: 0.5rem; + padding-left: 1rem; + margin-bottom: 20px; + background-color: %s; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.05); + box-shadow: inset 0 1px 1px rgba(0,0,0,.05); + )---", color) + + res <- list(shiny::h3(title)) + if (length(contents)) res <- append(res, list(shiny::tags[["div"]](contents, style = style))) + return(res) +} + +explorer_server_with_datasets <- function(caller_datasets = NULL) { + explorer_server <- function(input, output, session) { + shiny::observe({ + input <- shiny::reactiveValuesToList(input) + if ("module_id" %in% names(input)) { # FIXME: Should not depend on specific input + session$doBookmark() + } + }) + shiny::onBookmarked(shiny::updateQueryString) + + datasets <- shiny::reactive({ + res <- caller_datasets + if (is.null(res)) { + dataset_info <- input[["datasets"]] + shiny::req(dataset_info) + res <- list() + for (i_row in seq_len(nrow(dataset_info))) { + row <- dataset_info[i_row, ] + res[[row[["name"]]]] <- readRDS(row[["datapath"]]) + } + } + return(res) + }) + + well <- function(title_ui, contents, expanded, checkbox_id = NULL) { + style <- r"---( + min-height: 20px; + padding: 19px; + padding-top: 14px; + padding-bottom: 0px; + padding-right: 10px; + margin-bottom: 20px; + background-color: #1155a00c; + border: 1px solid #00000020; + border-radius: 4px; + )---" + + checked <- if (isFALSE(expanded)) NULL else NA # awkward mapping, but HTML is what it is + + res <- list( + shiny::div( + title_ui, + shiny::tags$input( + id = checkbox_id, type = "checkbox", class = "toggle-checkbox", + checked = checked, style = "display: none;" + ), + shiny::tags$label( + `for` = checkbox_id, class = "toggle-label", + shiny::tags$span(class = "chevron") + ), + style = "display:flex; align-items:baseline;" + ) + ) + + if (length(contents)) { + res <- append( + res, + list(shiny::div( + shiny::conditionalPanel( + condition = paste0("input['", checkbox_id, "']"), + shiny::tags[["div"]](contents, style = style) + ) + )) + ) + } + + return(res) + } + + column_selector <- function(elem, datasets, visible_datasets, inputs, id, multiple) { + dataset_name <- elem[["dataset_name"]] + dataset_slot <- mget(dataset_name, envir = visible_datasets, ifnotfound = list(NULL), inherits = TRUE)[[1]] + + choices <- c() + if (!is.null(dataset_slot)) { + dataset <- datasets[[dataset_slot]] + for (col_name in names(dataset)) { + if (T_is_of_kind(dataset[[col_name]], elem[["sub_kind"]])) { + label <- attr(dataset[[col_name]], "label") + if (is.null(label)) { + choices <- c(choices, col_name) + } else { + choices[[paste0(col_name, " [", label, "]")]] <- col_name + } + } + } + } + + if (length(choices) == 0) choices <- inputs[[id]] + + # FIXME : Use another selector because selectInput does not preserve the order of columns + # on bookmark restoration (see https://github.com/rstudio/shiny/issues/1490, + # which predates trump's presidency) + ui <- shiny::selectInput( + inputId = id, label = NULL, + choices = choices, selected = inputs[[id]], + selectize = multiple, multiple = multiple + ) + + return(ui) + } + + compute_ui_info_inner <- function(visible_datasets, label, name, elem, inputs, datasets, counts) { + if (isTRUE(attr(elem, "ignore"))) { + # NOTE: This element should have been filtered out at this point + return(list( + ui = shiny::p(paste("**FIXME: should have been ignored**", name)), + input_ids = NULL, dependencies = list() + )) + } + + ui <- list() + input_ids <- NULL + deps <- list() + + if (elem[["kind"]] == "mod") { + ui <- shiny::textInput( + inputId = name, label = NULL, value = inputs[[name]], + placeholder = "" + ) + input_ids <- name + } else if (elem[["kind"]] == "dataset_name") { + ui <- shiny::selectInput( + inputId = name, label = NULL, + choices = names(datasets), selected = inputs[[name]], + selectize = FALSE + ) + + if (!is.null(inputs[[name]]) && !is.null(label)) { + visible_datasets[[label]] <- inputs[[name]] + } + input_ids <- name + deps[[length(deps) + 1]] <- name # columns depend on datasets, so we ask for another pass + } else if (elem[["kind"]] == "col") { + ui <- column_selector(elem, datasets, visible_datasets, inputs, name, multiple = FALSE) + input_ids <- name + } else if (elem[["kind"]] == "integer" || elem[["kind"]] == "cdisc_study_day") { + possible_values <- c(inputs[[name]], elem[["min"]], elem[["max"]], 0) + value <- possible_values[which(is.finite(possible_values))[1]] + + ui <- shiny::numericInput( + inputId = name, label = NULL, value = value, + min = elem[["min"]], max = elem[["max"]], width = "5em" + ) + input_ids <- name + } else if (elem[["kind"]] == "color") { + ui <- color_picker_input(inputId = name, value = inputs[[name]]) + input_ids <- name + } else if (elem[["kind"]] == "group") { + child_visible_datasets <- new.env(parent = visible_datasets) + + input_ids <- list() + for (child_param in seq_along(elem$elements)) { + child_name <- names(elem$elements)[[child_param]] + child_elem <- elem[["elements"]][[child_param]] + + child_info <- compute_ui_info_outer( + child_visible_datasets, + label = child_name, + name = paste(c(name, child_name), collapse = "-"), + child_elem, inputs, datasets, counts + ) + + ui[[length(ui) + 1]] <- child_info[["ui"]] + input_ids[[child_name]] <- child_info[["input_ids"]] + deps <- append(deps, child_info[["dependencies"]]) + } + } else { + ui <- shiny::p(paste("TODO: ", elem[["kind"]])) + input_ids <- list() + } + + attr(input_ids, "as_array") <- attr(elem, "as_array") + + return(list(ui = ui, input_ids = input_ids, dependencies = deps)) + } + + # We use -/+ buttons instead of a shiny::numericInput because that clicking that selector twice in + # quick succession triggers a race condition in the context of renderUIs that redraw the selector itself + # Thus, we avoid representing the absolute number of elements and instead only capture the purpose of + # incrementing or decrementing whatever value is stored on the server + button_delta_id <- "button_delta" + inc_dec_buttons <- function(id) { + list( + shiny::tags[["button"]]( + shiny::icon("minus"), class = "inc_dec_button", + onclick = sprintf( + "Shiny.setInputValue('%s', {id:'%s', delta:-1}, {priority:'event'});", button_delta_id, id + ) + ), + shiny::tags[["button"]]( + shiny::icon("plus"), class = "inc_dec_button", + onclick = sprintf( + "Shiny.setInputValue('%s', {id:'%s', delta:+1}, {priority:'event'});", button_delta_id, id + ) + ) + ) + } + + # Bookmark shenanigans ---- + counts_rv <- shiny::reactiveValues() + candidate_state <- NULL + + shiny::onBookmark(function(state) { + state$values$counts <- shiny::reactiveValuesToList(counts_rv) + }) + + shiny::onRestored(function(state) { + candidate_state <<- state$input + counts <- state$values$counts + for (name in names(counts)) counts_rv[[name]] <- counts[[name]] + + if (isTRUE(state$input[["edit_code"]])) { + shiny::updateTextAreaInput( + session = session, "manual_code", + value = state$input[["manual_code"]] + ) + } + }) + + retrigger_rv <- shiny::reactiveVal(0) + shiny::observe({ + msg <- input[[button_delta_id]] + if (!is.null(msg)) { + id <- msg[["id"]] + v <- shiny::isolate(counts_rv[[id]]) + new_v <- max(0, v + msg[["delta"]]) + counts_rv[[id]] <- new_v + if (!identical(v, new_v)) retrigger_rv(shiny::isolate(retrigger_rv() + 1)) + } + }) + + compute_ui_info_outer <- function(visible_datasets, label, name, elem, inputs, datasets, counts) { + if (isTRUE(attr(elem, "ignore"))) { + return(list(ui = NULL, input_ids = NULL, dependencies = NULL)) + } # NOTE: early out + + res <- NULL + + docs <- attr(elem, "docs") + doc_pieces <- paste0("[", docs[["type"]], "]") + if (nchar(docs[["manual_desc"]]) > 0) doc_pieces <- c(doc_pieces, docs[["manual_desc"]]) + if (length(docs[["auto_desc"]])) doc_pieces <- c(doc_pieces, paste(docs[["auto_desc"]], collapse = "\n")) + + hover_info <- paste(doc_pieces, collapse = "\n") + + dependencies <- list() + + optional_ui <- NULL + if (isTRUE(attr(elem, "optional"))) { + checkbox_id <- paste(c(name, "enabled"), collapse = "-") + expanded <- isTRUE(inputs[[checkbox_id]]) + checked <- if (isFALSE(expanded)) NULL else NA # awkward mapping, but HTML is what it is + checkbox <- list(shiny::tags$input( + id = checkbox_id, type = "checkbox", class = "optional-checkbox", + checked = checked, style = "margin-right:0.5rem;" + )) + + dependencies <- c(dependencies, checkbox_id) + if (expanded) { + optional_ui <- checkbox + } else { + ui <- list(shiny::div(checkbox, + shiny::tags$label( + `for` = checkbox_id, label, + style = "font-weight:normal;font-style:italic;margin-bottom:0px", + title = hover_info + ), + style = "display:flex;align-items:baseline;padding-bottom:1rem;" + )) + + return(list(ui = ui, input_ids = NULL, dependencies = dependencies)) # NOTE: early out + } + } + + named <- isTRUE(attr(elem, "named")) + zero_or_more <- isTRUE(attr(elem, "zero_or_more")) + + if (enable_nicer_unnamed_multicolumn_selection && zero_or_more && !named && elem$kind == "col") { + # NOTE: special-case with a multiselector for a more streamlined interface + ui <- column_selector(elem, datasets, visible_datasets, inputs, name, multiple = TRUE) + input_ids <- name + + ui$attribs$class <- paste(ui$attribs$class, "margin_bottom_0px") + + # Hacky alignment of selectInput + label_elem <- list(shiny::tags$span(optional_ui, + shiny::tags$label(`for` = NULL, label, title = hover_info), + style = "display:inline-flex; align-items:baseline; padding-top:0.7rem;" + )) + + ui <- shiny::tags[["div"]]( + style = "display: flex; align-items: flex-start; place-content: space-between; column-gap:1rem", + label_elem, ui + ) + + res <- list(ui = ui, input_ids = input_ids, dependencies = dependencies) + } else if (zero_or_more) { + attr(elem, "zero_or_more") <- FALSE + + input_ids <- list() + + possible_values <- c(counts[[name]], 0) + count <- possible_values[which(is.finite(possible_values))[1]] + + counts_rv[[name]] <- ifelse(name %in% names(counts), counts[[name]], 0) + + sub_ui <- list() + + name_input_ids <- character(0) + for (i_rep in seq_len(count)) { + child_name <- paste0(name, "-", i_rep) + + name_selector <- NULL + + if (named) { + name_sel_id <- paste0(child_name, "-name") + name_input_ids <- c(name_input_ids, name_sel_id) + name_selector <- shiny::textInput( + inputId = name_sel_id, label = NULL, + value = inputs[[name_sel_id]], placeholder = "" + ) + } + + child_info <- compute_ui_info_inner(visible_datasets, + label = NULL, child_name, elem, + inputs, datasets, counts + ) + child_ui <- child_info[["ui"]] + + if (elem$kind == "group") { # repeats #eenahw partially; not ready to compress it yet + child_ui <- list(well( + title_ui = name_selector, child_ui, + expanded = inputs[[child_name]], + checkbox_id = child_name + )) + } else { + child_ui <- list(inline_shiny_input(child_ui, label = NULL, name_selector = name_selector)) + } + + sub_ui <- append(sub_ui, child_ui) + input_ids <- append(input_ids, list(child_info[["input_ids"]])) + dependencies <- append(dependencies, child_info[["dependencies"]]) + } + sub_ui <- append(sub_ui, inc_dec_buttons(name)) + + title_ui <- list(optional_ui, shiny::tags$label(`for` = name, class = "chevron", label, title = hover_info)) + ui <- list(well(title_ui, sub_ui, expanded = inputs[[name]], name)) + + if (named) { + attr(input_ids, "name_input_ids") <- name_input_ids + } + + attr(input_ids, "as_array") <- attr(elem, "as_array") + + res <- list(ui = ui, input_ids = input_ids, dependencies = dependencies) + } else { + res <- compute_ui_info_inner(visible_datasets, label, name, elem, inputs, datasets, counts) + res[["dependencies"]] <- c(dependencies, res[["dependencies"]]) + + if (elem$kind == "group") { # repeats #eenahw partially; not ready to compress it yet + title_ui <- list(optional_ui, shiny::tags$label(`for` = name, class = "chevron", label, title = hover_info)) + res[["ui"]] <- list(well(title_ui, res[["ui"]], + expanded = inputs[[name]], + checkbox_id = name + )) + } else { + if (!is.null(optional_ui)) { + res[["ui"]] <- list(inline_shiny_input( + res[["ui"]], + label_elem = list(shiny::tags$span(optional_ui, + shiny::tags$label(`for` = NULL, label, title = hover_info), + style = "display:inline-flex; align-items:baseline;" + )) + )) + } else { + res[["ui"]] <- list( + shiny::tags[["div"]](style = "display: flex; align-items: baseline; place-content: space-between; column-gap:1rem", + shiny::div(shiny::tags$label(`for` = NULL, label), style = "display:inline-flex;", title = hover_info), res[["ui"]] + ) + ) + } + } + } + + return(res) + } + + ui_and_ids <- shiny::reactive({ + ui <- list() + input_ids <- list() + deps <- list() + + selected_spec <- input[["spec"]] + shiny::req(selected_spec) + datasets <- datasets() + + inputs <- shiny::isolate(shiny::reactiveValuesToList(input)) + if (!is.null(candidate_state)) { + inputs <- candidate_state + candidate_state <<- NULL + } + + visible_datasets <- new.env(parent = emptyenv()) + spec_elements <- module_specifications[[selected_spec]] + + counts <- shiny::isolate(shiny::reactiveValuesToList(counts_rv)) + info <- shiny::maskReactiveContext( + compute_ui_info_inner(visible_datasets, "placeholder_label", name = NULL, spec_elements, inputs, datasets, counts) + ) + ui <- info[["ui"]] + input_ids <- info[["input_ids"]] + deps <- info[["dependencies"]] + + for (dep in deps) input[[dep]] # makes this reactive depend only on certain inputs + retrigger_rv() + + return(list(ui = ui, input_ids = input_ids)) + }) + + output[["selectors"]] <- shiny::renderUI(ui_and_ids()[["ui"]]) + + output[["data_input"]] <- shiny::renderUI({ + ui <- NULL + if (is.null(caller_datasets)) { + # no caller datasets: ask the user for some + ui <- shiny::tagList( + # Hacky alignment of fileInput + shiny::tags[["div"]]( + style = "display: flex; align-items: flex-start; place-content: space-between; column-gap:1rem", + shiny::tags$label( + `for` = "datasets", "Datasets", style = "padding-top: 0.7rem;", + title = "Input datasets for selected module" + ), + shiny::fileInput( + inputId = "datasets", label = NULL, multiple = TRUE, accept = ".rds", + capture = NULL + ) + ) + ) + } else { + ui <- shiny::HTML(sprintf("Preloaded datasets: %s", paste(names(caller_datasets), collapse = ", "))) + } + + return(ui) + }) + + indent <- function(code, level) { + indent_string <- strrep(" ", max(0, level)) + return(paste0(indent_string, code)) + } + + resolve_rhs <- function(id, parent_indent_level) { + res <- "" + if (is.character(id) && length(id) == 1) { + param_value <- input[[id]] + res <- deparse1(param_value) + } else if (is.list(id)) { + subres <- c() + + elem_names <- local({ + res <- names(id) + name_input_ids <- attr(id, "name_input_ids") + if (length(name_input_ids) > 0) { + res <- Map(function(id) { + s <- input[[id]] + if (identical(s, "")) { + s <- NULL + } else { + s <- deparse(s) + } + }, name_input_ids) + } + return(res) + }) + + for (i_elem in seq_along(id)) { + name <- NULL + if (i_elem <= length(elem_names)) name <- elem_names[[i_elem]] + if (identical(name, "")) name <- NULL + subres <- c( + subres, + paste(c(name, resolve_rhs(id[[i_elem]], parent_indent_level + 1)), collapse = " = ") + ) + } + + as_array <- isTRUE(attr(id, "as_array")) + container <- ifelse(as_array, "c", "list") + + res <- "" + if (length(subres)) { + res <- paste0( + container, + "(\n", + paste(subres |> indent(parent_indent_level + 1), collapse = ",\n"), + "\n", + ")" |> indent(parent_indent_level) + ) + } else { + res <- paste0(res, container, "()") + } + } else { + res <- "TODO" + } + return(res) + } + + code <- shiny::reactive({ + selected_spec <- input[["spec"]] + t <- paste0(selected_spec, "(\n") + + params <- local({ + res <- c() + ids <- ui_and_ids()[["input_ids"]] + for (i_val in seq_along(ids)) { + param_name <- names(ids)[[i_val]] + id <- ids[[i_val]] + res <- c( + res, + paste(c(param_name, resolve_rhs(id, parent_indent_level = 1)), collapse = " = ") |> indent(1) + ) + } + return(res) + }) + + t <- paste0(t, paste(params, collapse = ",\n")) + t <- paste0(t, "\n)") + + # NOTE(miguel): If you want to plug your own styler, here would be a good place to do so. Here's an (ugly) example: + # t <- sapply(parse(text = t), function(s) deparse1(s, collapse = '\n', width.cutoff = 80L)) # nolint + + return(t) + }) + + code_highlight_differences <- function(a, b) { + # FIXME(miguel): Not the correct place to do this operation. We could have the parse tree prior to rendering it as + # text, so a tree comparison would be less heuristic. That would involve building a nested list + # inside code()+resolve_rhs, which we would also use here. Producing the indented code from that + # nested list would also be cleaner than the ad-hoc formatting I do in the `code()` reactive, but... + # NOTE(miguel): we're in a hurry, so look ma, no hands: + + drop_trailing_comma <- function(strings) { + return(substr(strings, 1, nchar(strings) - endsWith(strings, ","))) + } + + as <- strsplit(a, "\n", fixed = TRUE)[[1]] |> drop_trailing_comma() + bs <- strsplit(b, "\n", fixed = TRUE)[[1]] + res <- character(0) + for (e in bs) { + indices <- which(drop_trailing_comma(e) == as) + if (length(indices)) { + as <- as[-indices[[1]]] + } else { + e <- paste0("", e, "") + } + res <- c(res, e) + } + return(paste(res, collapse = "\n")) + } + + prev_code_update_delay_s <- 3 # TODO: constant + prev_code <- prev_diffed_code <- "" + prev_code_t <- Sys.time() + + output[["code"]] <- shiny::renderUI({ # TODO: Add 'copy' icon, like the ones on code snippets on vignettes + code <- code() + + code <- gsub("&", "&", code, fixed = TRUE, useBytes = TRUE) + code <- gsub("<", "<", code, fixed = TRUE, useBytes = TRUE) + code <- gsub(">", ">", code, fixed = TRUE, useBytes = TRUE) + + t_current <- Sys.time() + t_diff <- as.numeric(difftime(t_current, prev_code_t, units = "secs")) + if (prev_code_update_delay_s <= t_diff) prev_diffed_code <<- prev_code + prev_code <<- code + prev_code_t <<- t_current + + code_to_print <- code + if (!identical(prev_diffed_code, code)) code_to_print <- code_highlight_differences(prev_diffed_code, code) + + res <- shiny::HTML(paste0( + "
",
+        code_to_print,
+        "
" + )) + + return(res) + }) + + shiny::observeEvent(input[["edit_code"]], { + if (isTRUE(input[["edit_code"]])) { + shiny::updateTextAreaInput(session = session, "manual_code", value = code()) + } + }) + + output[["module"]] <- shiny::renderUI({ + code_to_eval <- NULL + if (isTRUE(input[["edit_code"]])) { + code_to_eval <- input[["manual_code"]] + shiny::req(is.character(code_to_eval)) + } else { + code_to_eval <- trimws(code()) + } + + get_package_maintainer_name <- function() { + desc <- utils::packageDescription("dv.papo")[["Maintainer"]] + if (is.character(desc) && length(desc) == 1 && nchar(desc) > 0) { + desc <- paste0("`", desc, "`") + } else { + # NOTE: Available after installing from source, but not under devtools + desc <- "the package maintainer" + } + return(desc) + } + + error_and_ui <- local({ + ui <- NULL + + spec <- input[["spec"]] + + build_error <- function(title, condition, preface) { + return(list(error = list(title = title, condition = condition, preface = preface))) + } + + if (!is.character(spec) || nchar(input[["spec"]]) == 0) { + return(build_error( + title = "Module selection error", + condition = base::simpleError("No DaVINCI module selected on the `Module` drop-down."), + preface = "Module selection error" + )) # FIXME: repeats message + } + + if (!startsWith(code_to_eval, spec)) { + return(build_error( + title = "Module configuration error", + condition = base::simpleError(paste("Expected call to", spec)), + preface = "Module configuration error" + )) # FIXME: repeats message + } + + # FIXME(miguel): We should parse and evaluate arguments separately outside of a reactive environment + # to see if any of them is badly constructed, but here I take a shortcut and evaluate + # them all inside a list() + list_of_args <- paste0("list", substr(code_to_eval, nchar(input[["spec"]]) + 1, nchar(code_to_eval))) + parsed_code <- try(parse(text = list_of_args), silent = TRUE) + eval_result <- try(eval(parsed_code), silent = TRUE) + if (inherits(eval_result, "try-error")) { + attr(eval_result, "condition")[["call"]][[1]] <- parse(text = spec)[[1]] # undo the spec->`list` substitution + return(build_error( + title = "Syntax error", + condition = attr(eval_result, "condition"), + preface = "Cannot parse the code provided." + )) + } + + # NOTE(miguel): With that out of the way, this shouldn't fail but I keep it just in case + parsed_code <- try(parse(text = code_to_eval), silent = TRUE) + if (inherits(parsed_code, "try-error")) { + return(build_error( + title = "Syntax error", + condition = attr(parsed_code, "condition"), + preface = "Cannot parse the code provided." + )) + } + + ui_server_id <- try(eval(parsed_code), silent = TRUE) + shiny::req(!is.null(ui_server_id)) + if (inherits(ui_server_id, "try-error")) { + return(build_error( + title = "Module Development Error", + condition = attr(ui_server_id, "condition"), + preface = paste0( + "Please report the following error to ", + get_package_maintainer_name(), "." + ) + )) + } + + if (!setequal(c("ui", "server", "module_id"), names(ui_server_id))) { + return(build_error( + title = "Module Configuration Error", + condition = base::simpleError("The provided code does not return a {ui, server, module_id} triplet."), + preface = paste0("Are you actually calling ", input[["spec"]], "?") + )) + } + + id <- ui_server_id[["module_id"]] + if (is.function(ui_server_id[["ui"]])) ui <- ui_server_id[["ui"]](id) + + afmm <- list( + unfiltered_dataset = datasets, + filtered_dataset = datasets, + module_output = function() list() + ) + + server_return_val <- try(ui_server_id[["server"]](afmm), silent = TRUE) + if (inherits(server_return_val, "try-error")) { + return(build_error( + title = "Module Development Error", + condition = attr(server_return_val, "condition"), + preface = paste0( + "Please report the following error to ", + get_package_maintainer_name(), "." + ) + )) + } + + return(list(ui = ui)) + }) + + ui <- error_and_ui[["ui"]] + error <- error_and_ui[["error"]] + + if (!is.null(error)) { + error_message <- error$condition[["message"]] + error_context <- paste(deparse(error$condition[["call"]]), collapse = "\n") + + ui <- list( + message_well(error$title, error$preface, color = "#f4d7d7"), + shiny::p("Message is:"), + shiny::pre(error_message), + shiny::p("And happened in the vicinity of:"), + shiny::pre(error_context) + ) + } + + return(ui) + }) + + NULL + } + + return(explorer_server) +} + +#' Interactive demo/configuration tool for [mod_patient_profile()] +#' +#' Launch an interactive configuration app for [mod_patient_profile()]. This application guides the user through the +#' configuration of the module, offering an experimental point-and-click interface to the module API. Help is accessible +#' by hovering over any of the provided parameters. \cr +#' To try it using demo data, run `dv.papo::explorer_app(dv.papo:::prep_safety_data())` in your R prompt. +#' +#' @param datasets `[list(data.frame(n))]` (optional) Datasets available to the module. One of them should be a +#' demographic subject-level dataset and the rest should be visit-dependent datasets. If not provided, the UI offers a +#' file input selector that is functionally equivalent. +#' +#' @export +explorer_app <- function(datasets = NULL) { + shiny::shinyApp( + ui = explorer_ui, + server = explorer_server_with_datasets(caller_datasets = datasets), + enableBookmarking = "url" + ) +} + +app_creator_feedback_ui <- function(id) { + id <- paste(c(id, "validator"), collapse = "-") + ns <- shiny::NS(id) + return(shiny::uiOutput(ns("ui"))) +} + +app_creator_feedback_server <- function(id, warning_messages, error_messages, ui) { + id <- paste(c(id, "validator"), collapse = "-") + module <- shiny::moduleServer( + id, + function(input, output, session) { + output[["ui"]] <- shiny::renderUI({ + res <- list() + warn <- warning_messages() + if (length(warn)) { + res[[length(res) + 1]] <- message_well("Module configuration warnings", Map(shiny::p, warn), color = "#fff7ef") + } + + err <- error_messages() + if (length(err)) { + res[[length(res) + 1]] <- message_well("Module configuration errors", Map(shiny::p, err), color = "#f4d7d7") + } + + if (length(error_messages()) == 0) res <- append(res, list(ui)) + return(res) + }) + } + ) + + return(module) +} diff --git a/R/global_params.r b/R/global_params.r new file mode 100644 index 0000000..91dbc69 --- /dev/null +++ b/R/global_params.r @@ -0,0 +1,16 @@ +CONST <- poc( + width_of_patient_selector_in_columns = 4, + decode_max_width_before_wrap_in_characters = 15, + color_for_missing_analysis_indicator_levels = "darkgray", + default_palette = c( + `REFERENCE RANGE` = "#91eec2", + `Reference range` = "#91eec2", + `reference range` = "#91eec2", + `NORMAL` = "green4", `LOW` = "red3", `HIGH` = "red2", + `Normal` = "green4", `Low` = "red3", `High` = "red2", + `normal` = "green4", `low` = "red3", `high` = "red2", + `MILD` = "lightgreen", `MODERATE` = "gold1", `SEVERE` = "red", + `Mild` = "lightgreen", `Moderate` = "gold1", `Severe` = "red", + `mild` = "lightgreen", `moderate` = "gold1", `severe` = "red" + ) +) diff --git a/R/mock_patient_profile.R b/R/mock_patient_profile.R new file mode 100644 index 0000000..5ad8a22 --- /dev/null +++ b/R/mock_patient_profile.R @@ -0,0 +1,211 @@ +#' Mock UI for papo module +#' +#' @param id A unique identifier. +#' +#' @return Shiny UI for the papomodule. +#' +#' @keywords internal +#' +#' @export +#' +mock_patient_profile_UI <- function(request) { # nolint + ui <- shiny::fluidPage( + shiny::tags$h1("Patient profile", class = "mod-title"), + shiny::actionButton("jump", "Click to jump"), + mod_patient_profile_UI(id = "papo") + ) + return(ui) +} + + +#' Mock server for papo module +#' +#' Uses adsl, adae, and adcm data of roche dataset. +#' +#' @param input,output,session Internal parameters for shiny. +#' +#' @keywords internal +#' +#' @export +#' +mock_patient_profile_server <- function(input, output, session) { + data_list <- prep_safety_data() + + subject_level_dataset <- shiny::reactive(data_list[["adsl"]]) + extra_datasets <- shiny::reactive(data_list[setdiff(names(data_list), "adsl")]) + + # exclude all non-papo inputs from bookmarking + # plotly does not namespace its inputs, so this can't be done from inside the module + shiny::observe({ + all <- names(input) + papo_filter <- startsWith(all, "papo") + non_papo_inputs <- all[!papo_filter] + shiny::setBookmarkExclude(non_papo_inputs) + }) + + mod_patient_profile_server( + id = "papo", + subject_level_dataset = subject_level_dataset, + extra_datasets = extra_datasets, + subjid_var = "USUBJID", + sender_ids = list("test" = shiny::reactive({ # recreate sender_ids structure of Module Manager + list(subj_id = shiny::reactive({ + shiny::req(input$jump) + "01-701-1033" + })) + })), + summary = list( + vars = c( + "SITEID", + "AGE", + "SEX", + "RACE", + "ETHNIC", + "ARM", + "DCREASCD", + "TRT01A" + ), + column_count = 3 + ), + listings = list( + "Adverse Event" = list(dataset = "adae", default_vars = NULL), + "Concomitant Medication" = list(dataset = "cm", default_vars = NULL) + ), + plots = list( + timeline_info = c( + trt_start_date = "TRTSDT", + trt_end_date = "TRTEDT", + icf_date = "RFICDT", + part_end_date = "RFENDT" + ), + vline_vars = list( + "Informed Consent Day" = "RFICDT", + "Study Treatment Stop Day" = "TRTEDT" + ), + vline_day_numbers = c( + "Study Treatment Start Day : Day 1" = 1, + "Test" = 50, + "Test2" = 75, + "Test3" = 100 + ), + range_plots = list( + "Adverse Events Plot" = list( + dataset = "adae", + vars = c( + start_date = "ASTDT", + end_date = "AENDT", + decode = "AEDECOD", + grading = "AESEV", + serious_ae = "AESER" + ), + tooltip = c( + "AE Term: " = "AEDECOD", + "AE Reported Term: " = "AETERM", + "Primary SOC: " = "AESOC", + "Intensity: " = "AESEV", + "Serious Event: " = "AESER", + "AE Start Date: " = "ASTDT", + "AE Stop Date: " = "AENDT", + "AE Start Day: " = "ASTDY", + "AE Stop Day: " = "AENDY" + ) + ), + "Concomitant Medication Plot" = list( + dataset = "cm", + vars = c( + start_date = "CMSTDT", + end_date = "CMENDT", + decode = "CMDECOD", + grading = "CMINDC" + ), + tooltip = c( + "Standardized Medication Name: " = "CMDECOD", + "Indication: " = "CMINDC", + "CM Dose: " = "CMDOSE", + "CM Dose Unit: " = "CMDOSU", + "CM START Date: " = "CMSTDTC", + "CM End Date: " = "CMENDTC", + "CM START Day: " = "CMSTDY", + "CM END Day: " = "CMENDY" + ) + ) + ), + value_plots = list( + "Lab plot" = list( + dataset = "lb", + vars = c( + analysis_param = "PARAM", + analysis_val = "AVAL", + analysis_date = "ADT", + analysis_indicator = "ANRIND", + range_low_limit = "A1LO", + range_high_limit = "A1HI" + ), + tooltip = c( + "Lab Parameter: " = "PARAM", + "Lab Test Date: " = "ADT", + "Lab Test Visit :" = "AVISIT", + "
High Limit: " = "A1HI", + "Lab Standard Value: " = "AVAL", + "Lower Limit: " = "A1LO", + "
Analysis Indicator: " = "ANRIND" + ) + ), + "Vital Sign Plot" = list( + dataset = "vs", + vars = c( + analysis_param = "PARAM", + analysis_val = "AVAL", + analysis_date = "ADT", + analysis_indicator = "VISIT", + range_low_limit = NULL, + range_high_limit = NULL, + summary_stats = "AVAL_MEAN" + ), + tooltip = c( + "Vital sign Parameter: " = "PARAM", + "Vital sign Date: " = "ADT", + "Vital sign Visit: " = "AVISIT", + "
Vital sign Value: " = "AVAL", + "Vital sign mean value by visits: " = "AVAL_MEAN" + ) + ) + ) + ) + ) +} + + + +#' Run papo mock +#' +#' \code{mock_patient_profile_app()} runs the \pkg{dv.papo} module +#' with dummy data. +#' +#' @keywords internal +#' +#' @export +#' +mock_patient_profile_app <- function(auto_update_query_string = FALSE) { + server <- mock_patient_profile_server + enable_bookmarking <- "disable" + + if (auto_update_query_string) { + server <- function(input, output, session) { + shiny::observe({ + shiny::reactiveValuesToList(input) # Trigger this observer every time an input changes + session$doBookmark() + }) + shiny::onBookmarked(shiny::updateQueryString) + + return(mock_patient_profile_server(input, output, session)) + } + enable_bookmarking <- "url" + } + + shiny::shinyApp( + ui = mock_patient_profile_UI, + server = server, + enableBookmarking = enable_bookmarking + ) +} diff --git a/R/mock_with_mm.R b/R/mock_with_mm.R new file mode 100644 index 0000000..5d33d13 --- /dev/null +++ b/R/mock_with_mm.R @@ -0,0 +1,145 @@ +#' Run an example for Patient profile integrated in the module manager +#' +#' Launches an example app that shows a patient profile module integrated in the +#' module manager surface. Displays data from the \pkg{safetyData} package. +#' +#' @keywords internal +#' +#' @export +#' +mock_with_mm_app <- function() { + dataset_list <- list( + "demo" = prep_safety_data(5), + "demo2" = prep_safety_data(10) + ) + + module_list <- list( + "Papo" = mod_patient_profile( + module_id = "mock_app", + subjid_var = "USUBJID", + sender_ids = NULL, + subject_level_dataset_name = "adsl", + summary = list( + vars = c( + "SITEID", + "AGE", + "SEX", + "RACE", + "ETHNIC", + "ARM", + "DCREASCD", + "TRT01A" + ), + column_count = 3 + ), + listings = list( + "Adverse Event" = list(dataset = "adae", default_vars = NULL), + "Concomitant Medication" = list(dataset = "cm", default_vars = NULL) + ), + plots = list( + timeline_info = c( + trt_start_date = "TRTSDT", + trt_end_date = "TRTEDT", + icf_date = "RFICDT", + part_end_date = "RFENDT" + ), + vline_vars = c( + "Informed Consent Day" = "RFICDT", + "Study Treatment Stop Day" = "TRTEDT" + ), + vline_day_numbers = c( + "Study Treatment Start Day : Day 1" = 1 + ), + range_plots = list( + "Adverse Events Plot" = list( + dataset = "adae", + vars = c( + start_date = "ASTDT", + end_date = "AENDT", + decode = "AEDECOD", + grading = "AESEV", + serious_ae = "AESER" + ), + tooltip = c( + "AE Term: " = "AEDECOD", + "AE Reported Term: " = "AETERM", + "Primary SOC: " = "AESOC", + "Intensity: " = "AESEV", + "Serious Event: " = "AESER", + "AE Start Date: " = "ASTDT", + "AE Stop Date: " = "AENDT", + "AE Start Day: " = "ASTDY", + "AE Stop Day: " = "AENDY" + ) + ), + "Concomitant Medication Plot" = list( + dataset = "cm", + vars = c( + start_date = "CMSTDT", + end_date = "CMENDT", + decode = "CMDECOD", + grading = "CMINDC" + ), + tooltip = c( + "Standardized Medication Name: " = "CMDECOD", + "Indication: " = "CMINDC", + "CM Dose: " = "CMDOSE", + "CM Dose Unit: " = "CMDOSU", + "CM START Date: " = "CMSTDTC", + "CM End Date: " = "CMENDTC", + "CM START Day: " = "CMSTDY", + "CM END Day: " = "CMENDY" + ) + ) + ), + value_plots = list( + "Lab plot" = list( + dataset = "lb", + vars = c( + analysis_param = "PARAM", + analysis_val = "AVAL", + analysis_date = "ADT", + analysis_indicator = "ANRIND", + range_low_limit = "A1LO", + range_high_limit = "A1HI" + ), + tooltip = c( + "Lab Parameter: " = "PARAM", + "Lab Test Date: " = "ADT", + "Lab Test Visit :" = "AVISIT", + "
High Limit: " = "A1HI", + "Lab Standard Value: " = "AVAL", + "Lower Limit: " = "A1LO", + "
Analysis Indicator: " = "ANRIND" + ) + ), + "Vital Sign Plot" = list( + dataset = "vs", + vars = c( + analysis_param = "PARAM", + analysis_val = "AVAL", + analysis_date = "ADT", + analysis_indicator = "VISIT", + range_low_limit = NULL, + range_high_limit = NULL, + summary_stats = "AVAL_MEAN" + ), + tooltip = c( + "Vital sign Parameter: " = "PARAM", + "Vital sign Date: " = "ADT", + "Vital sign Visit: " = "AVISIT", + "
Vital sign Value: " = "AVAL", + "Vital sign mean value by visits: " = "AVAL_MEAN" + ) + ) + ) + ) + ) + ) + + dv.manager::run_app( + data = dataset_list, + module_list = module_list, + filter_data = "adsl" + ) +} diff --git a/R/mod_API.R b/R/mod_API.R new file mode 100644 index 0000000..dca406c --- /dev/null +++ b/R/mod_API.R @@ -0,0 +1,116 @@ +# Patient profile module interface description ---- +mod_patient_profile_API_docs <- list( + "PAtient PrOfile", + module_id = "", + subject_level_dataset_name = "", + subjid_var = "", + sender_ids = "Identifiers of modules allowed to request the display of target patient IDs", + summary = list( + "Subject-level summary section", + vars = "Values to display in the summary section", + column_count = "Column count for the summary section" + ), + listings = list( + "Listings section", + dataset = "", + default_vars = "Default columns to display. If not specified, the first six columns are selected by default" + ), + plots = list( + "Plot section", + timeline_info = list( + "Start and end study dates", + icf_date = "Informed Consent Form signing Date", + trt_start_date = "Treatment Start Date, used also as Day 1 Reference Date", + trt_end_date = "Treatment End Date", + part_end_date = "Participation End Date" + ), + range_plots = list( + "Plots for range-like events (adverse events, concomitant medications, ...)", + dataset = "", + vars = list( + "Variables of interest for the event", + start_date = "Start date", + end_date = "End date", + decode = "Descriptive event label", + grading = "Degree of the event, used for color-coding the plot", + serious_ae = "Marker of event seriousness, usually reserved for adverse event datasets" + ), + tooltip = "Block of text to display as hover information over the left edge of each range. The names of this list are included as literal text and honor three basic HTML formatting elements: ``, ``, `
`). The columns the values refer to are populated with the value on the dataset relevant to any given row" + ), + value_plots = list( + "Plots for value-like (lab measurements, vital signs, ...) traces", + dataset = "", + vars = list( + "Variables of interest for the trace", + analysis_param = "Parameter", + analysis_val = "Value", + analysis_date = "Date", + analysis_indicator = "Analysis reference range indicator", + range_low_limit = "Lower limit of the reference range", + range_high_limit = "Upper limit of the reference range", + summary_stats = "Additional value column for summary statistics" + ), + tooltip = "Block of text to display as hover information over each point of the trace. The names of this list are included as literal text and honor three basic HTML formatting elements: ``, ``, `
`). The columns the values refer to are populated with the value on the dataset relevant to any given row" + ), + vline_vars = "Place vertical dashed lines on days indicated by this dataset columns", + vline_day_numbers = "Place vertical dashed lines on days indicated by this parameter", + palette = "If a name on this list matches the text on a plot element, the associated color will be applied to that element. This mapping takes precedence over the built-in palette" + ) +) + +mod_patient_profile_API <- T_group( + module_id = T_mod_ID(), + subject_level_dataset_name = T_dataset_name() |> T_flag("subject_level_dataset_name"), + subjid_var = T_col("subject_level_dataset_name", T_or(T_factor(), T_character())) |> T_flag("subjid_var"), + sender_ids = T_character() |> T_flag("zero_or_more", "optional", "ignore"), + summary = T_group( + vars = T_col("subject_level_dataset_name") |> T_flag("zero_or_more", "as_array"), + column_count = T_integer(min = 1, max = 12) + ) |> T_flag("optional"), + listings = T_group( + dataset = T_dataset_name(), + default_vars = T_col("dataset") |> T_flag("optional", "zero_or_more", "as_array") + ) |> T_flag("optional", "zero_or_more", "named"), + plots = T_group( + timeline_info = T_group( + icf_date = T_col("subject_level_dataset_name", T_or(T_date(), T_datetime())) |> T_flag("optional"), + trt_start_date = T_col("subject_level_dataset_name", T_or(T_date(), T_datetime())), + trt_end_date = T_col("subject_level_dataset_name", T_or(T_date(), T_datetime())), + part_end_date = T_col("subject_level_dataset_name", T_or(T_date(), T_datetime())) |> T_flag("optional") + ) |> T_flag("as_array"), + range_plots = T_group( + dataset = T_dataset_name(), + vars = T_group( + start_date = T_col("dataset", T_or(T_date(), T_datetime())), + end_date = T_col("dataset", T_or(T_date(), T_datetime())), + decode = T_col("dataset", T_or(T_character(), T_factor())), + grading = T_col("dataset", T_or(T_character(), T_factor())) |> T_flag("optional"), + serious_ae = T_col("dataset", T_or(T_logical(), T_YN()) |> T_map_to(T_logical())) |> T_flag("optional") + ) |> T_flag("as_array"), + tooltip = T_col("dataset") |> T_flag("zero_or_more", "named", "as_array") + ) |> T_flag("zero_or_more", "named"), + value_plots = T_group( + dataset = T_dataset_name(), + vars = T_group( + analysis_param = T_col("dataset", T_or(T_character(), T_factor())), + analysis_val = T_col("dataset", T_numeric()), + analysis_date = T_col("dataset", T_or(T_date(), T_datetime())), + analysis_indicator = T_col("dataset", T_or(T_character(), T_factor())) |> T_flag("optional"), + range_low_limit = T_col("dataset", T_numeric()) |> T_flag("optional"), + range_high_limit = T_col("dataset", T_numeric()) |> T_flag("optional"), + summary_stats = T_col("dataset", T_numeric()) |> T_flag("optional") + ) |> T_flag("as_array"), + tooltip = T_col("dataset") |> T_flag("zero_or_more", "named", "as_array") + ) |> T_flag("zero_or_more", "named"), + vline_vars = T_col( + "subject_level_dataset_name", T_or(T_CDISC_study_day(), T_date(), T_datetime()) + ) |> T_flag("zero_or_more", "named", "as_array"), + vline_day_numbers = T_CDISC_study_day() |> T_flag("optional", "zero_or_more", "named", "as_array"), + palette = T_color() |> T_flag("optional", "zero_or_more", "named", "as_array") + ) |> T_flag("optional") +) |> T_attach_docs(mod_patient_profile_API_docs) + +# Available module specifications ---- +module_specifications <- list( + "dv.papo::mod_patient_profile" = mod_patient_profile_API # TODO: Add another module to demonstrate the generality of the approach +) diff --git a/R/mod_listing.R b/R/mod_listing.R new file mode 100644 index 0000000..376f472 --- /dev/null +++ b/R/mod_listing.R @@ -0,0 +1,222 @@ +#' Create user interface for patient listings shiny module of \pkg{dv.papo} +#' +#' @param id A unique ID string to create a namespace. Must match the ID of +#' \code{patient_plot_server()}. +#' +#' @keywords internal +#' +patient_listing_UI <- function(id) { # nolint + ns <- shiny::NS(id) + + shiny::uiOutput(ns("ui")) +} + +#' Create server for patient listings shiny module of \pkg{dv.papo} +#' +#' @param id A unique ID string to create a namespace. Must match the ID of +#' \code{patient_listing_UI()}. +#' @param data_list List of data frames containing data for each listing of selected patient. +#' @param key_value Character: Value of selected patient +#' @inheritParams mod_patient_profile +#' +#' @keywords internal +#' +patient_listing_server <- function(id, data_list, key_value, listings) { + shiny::moduleServer( + id, + function(input, output, session) { + ns <- session$ns + + testing <- isTRUE(getOption("shiny.testmode")) + if (testing) { + exported_test_data <- list() + shiny::exportTestValues(test_data = exported_test_data) + } + + shiny::setBookmarkExclude(c( + "table_cell_clicked", + "table_rows_current", + "table_rows_all", + "table_search", + "table_search_columns", + "table_rows_selected", + "table_cells_selected", + "table_columns_selected", + "table_state" + )) + + max_width <- 12 + + output[["ui"]] <- shiny::renderUI({ + shiny::req(length(listings) > 0) + ui <- list( + shiny::fluidRow( + shiny::column( + max_width, + shiny::h3("Data Listings"), + shiny::uiOutput(ns("data_selector_ui")) + ), + # column selector + shiny::uiOutput(ns("column_selector")), + shiny::column( + max_width, + # data listing + shiny::uiOutput(ns("listing_ui")) + ) + ), + shiny::br() + ) + return(ui) + }) + + output[["data_selector_ui"]] <- shiny::renderUI({ + shiny::req(data_list()) + choices <- c("N/A" = NA_character_) + if (length(listings) > 0) choices <- sapply(listings, function(listing) listing[["dataset"]]) + + shinyWidgets::radioGroupButtons( + inputId = ns("data_selector"), + label = "Select Domain:", + status = "primary", + selected = shiny::isolate(input[["data_selector"]]), + choices = choices + ) + }) + + column_selector_first_pass <- TRUE + + output[["column_selector"]] <- shiny::renderUI({ + shiny::req(data_list()) + + ui <- list() + + for (listing in listings) { + dataset_name <- listing[["dataset"]] + + dataset <- data_list()[[dataset_name]] + choices <- names(dataset) + labels <- sapply(choices, function(col) { + res <- attr(dataset[[col]], "label") + if (is.null(res)) res <- "" + return(res) + }) + + default_vars <- listing[["default_vars"]] + if (column_selector_first_pass) { + # if app creator specifies no columns, default selection is first six columns + if (length(default_vars) == 0) default_vars <- utils::head(choices, n = 6) + } + + sel_id <- paste0("column_selector_", dataset_name) + + selected <- default_vars + if (is.null(selected)) selected <- shiny::isolate(input[[sel_id]]) + + ui[[length(ui) + 1]] <- shiny::column( + max_width, + shiny::conditionalPanel( + paste0("input.data_selector == ", "'", dataset_name, "'"), + ns = ns, + shinyWidgets::pickerInput(ns(sel_id), + label = "Select Extra Columns", + choices = choices, + selected = selected, + choicesOpt = list(subtext = labels), + multiple = TRUE, + options = list("live-search" = TRUE, "actions-box" = TRUE) + ) + ) + ) + } + + if (column_selector_first_pass) { + # Consume defaults after first pass + for (i_listing in seq_along(listings)) { + listings[[i_listing]][["default_vars"]] <<- NULL + } + column_selector_first_pass <<- FALSE + } + + return(ui) + }) + + listing_contents <- shiny::reactive({ + dataset_name <- input[["data_selector"]] + shiny::req(dataset_name) + datasets <- data_list() + shiny::req(datasets) + data <- datasets[[dataset_name]] + shiny::req(data) + + columns <- input[[paste0("column_selector_", dataset_name)]] + + data <- data[columns] + + col_labels <- get_labels(data, columns) + + # replace NA labels with column Names + for (i in seq_along(col_labels)) { + if (is.na(col_labels[i])) col_labels[i] <- paste0(columns[i], " (No Label)") + } + + scroll_y <- if (nrow(data) > 10) "300" else FALSE + + if (testing) { + exported_test_data[["filtered_data"]] <<- data + } + + # turn character type into factor (to offer column filter options) + for (name in names(data)) { + if (is.character(data[[name]])) { + data[[name]] <- as.factor(data[[name]]) + } + } + + # styler: off + restore_original_order_js <- r"----( + function(e, dt, node, config) { + dt.iterator('table', function(s) { + s.aaSorting.length = 0; + s.aiDisplay.sort(function(a,b) { + return a-b; + }); + s.aiDisplayMaster.sort(function(a,b) { + return a-b; + }); + }).draw(); + } + )----" |> structure(class = c("character", "JS_EVAL")) + # styler: on + + res <- DT::datatable( + data = data, colnames = col_labels, + selection = "single", rownames = TRUE, + filter = "top", extensions = "Buttons", + options = list( + searching = TRUE, paging = FALSE, + scrollX = TRUE, scrollY = scroll_y, ordering = TRUE, + columnDefs = list(list(className = "dt-center", targets = "_all")), + dom = "Bfrtip", buttons = list(list( + extend = "collection", + text = "Reset Columns Order", + action = restore_original_order_js + )) + ) + ) + + return(res) + }) + + output[["listing_ui"]] <- shiny::renderUI({ + # DT::dataTableOutput can occupy a lot of space even if unpopulated, so we gate + # its inclusion by first checking if there is content to display in it + shiny::req(listing_contents()) + return(DT::dataTableOutput(ns("listing"))) + }) + + output[["listing"]] <- DT::renderDataTable({ + return(listing_contents()) + }) + } + ) +} diff --git a/R/mod_patient_info.R b/R/mod_patient_info.R new file mode 100644 index 0000000..d0e158d --- /dev/null +++ b/R/mod_patient_info.R @@ -0,0 +1,61 @@ +# NOTE(miguel): This shouldn't be a module. It has almost no functionality. It's only called once. + +#' Create user interface for the patient information shiny module of \pkg{dv.papo} +#' +#' @param id A unique ID string to create a namespace. Must match the ID of +#' \code{patient_info_server()}. +#' +#' @keywords internal +#' +#' @return A shiny \code{uiOutput} element. +patient_info_UI <- function(id) { # nolint + ns <- shiny::NS(id) + shiny::uiOutput(ns("ui_out")) +} + +#' Create server for the patient information shiny module of \pkg{dv.papo} +#' @param id A unique ID string to create a namespace. Must match the ID of +#' \code{patient_info_UI()}. +#' @param record row object of dataframe: row record for patient. +#' @param column_count A number indicating how many items should be in one row +#' +#' @keywords internal +#' +#' @inheritParams mod_patient_profile +patient_info_server <- function(id, record, subjid_var, column_count = 3) { + shiny::moduleServer( + id, + function(input, output, session) { + + # parts in ui_out + output$ui_out <- shiny::renderUI({ + shiny::req(nrow(record()) == 1 && ncol(record()) > 0) + + # content + digit_len <- 12 %/% column_count + pp_data <- record() + pp_cols <- names(pp_data) + pp_labels <- get_labels(pp_data) + + shiny::fluidRow( + shiny::column( + width = 12, + shiny::tagList( + shiny::h3("Patient Information"), + shiny::fluidRow( + lapply(seq_len(ncol(pp_data)), function(i) { + shiny::column( + digit_len, + shiny::tags$b(ifelse(is.na(pp_labels[i]), names(pp_data)[i], pp_labels[i])), + shiny::tags$b(": "), pp_data[[pp_cols[i]]] + ) + }) + ) + ), + shiny::br() + ) + ) + }) + } + ) +} diff --git a/R/mod_patient_profile.R b/R/mod_patient_profile.R new file mode 100644 index 0000000..da27b73 --- /dev/null +++ b/R/mod_patient_profile.R @@ -0,0 +1,384 @@ +#' Patient Profile Module UI +#' +#' (For use outside of the DaVinci framework)\cr +#' Places the Patient Profile module UI at the call site of this function. A matching call to [mod_patient_profile_server()] +#' is necessary.\cr +#' +#' @param id `[character]` Unique shiny ID. Must match the ID provided to [mod_patient_profile_server()]. +#' +#' @return Shiny UI. +#' +#' @seealso [mod_patient_profile()] and [mod_patient_profile_server()] +#' @export +mod_patient_profile_UI <- function(id) { # nolint + ns <- shiny::NS(id) + shiny::tagList( + shiny::uiOutput(ns("ui")), + patient_info_UI(ns("pp_ui_out")), + patient_listing_UI(ns("listings")), + patient_plot_UI(ns("plot_contents")) + ) +} + + +#' Patient Profile Module server +#' +#' (For use outside of the DaVinci framework)\cr +#' Runs the server that populates the UI returned by [mod_patient_profile_UI()].\cr +#' Requires a matching call to that function. +#' +#' @param id `[character]` Unique shiny ID. Must match the ID provided to [mod_patient_profile_UI()]. +#' @param subject_level_dataset `[reactive(data.frame)]` Visit-independent subject information. +#' @param extra_datasets `[reactive(data.frame(n))]` Visit-dependent subject datasets. +#' @inheritParams mod_patient_profile +#' @seealso [mod_patient_profile()] and [mod_patient_profile_UI()] +#' +#' @export +mod_patient_profile_server <- function(id, subject_level_dataset, extra_datasets, subjid_var, sender_ids, + summary, listings, plots) { + local({ + ac <- checkmate::makeAssertCollection() # nolint + checkmate::assert_class(subject_level_dataset, "reactive", add = ac) + checkmate::reportAssertions(ac) + }) + + timeline_info <- plots[["timeline_info"]] + range_plots <- plots[["range_plots"]] + value_plots <- plots[["value_plots"]] + vline_vars <- plots[["vline_vars"]] + vline_day_numbers <- plots[["vline_day_numbers"]] + palette <- plots[["palette"]] + + # NOTE: simplifies downstream code because list[[optional_missing_element]] returns NULL + for (i_plot in seq_along(range_plots)) { + if ("vars" %in% names(range_plots[[i_plot]])) { + range_plots[[i_plot]][["vars"]] <- as.list(range_plots[[i_plot]][["vars"]]) + } + } + for (i_plot in seq_along(value_plots)) { + if ("vars" %in% names(value_plots[[i_plot]])) { + value_plots[[i_plot]][["vars"]] <- as.list(value_plots[[i_plot]][["vars"]]) + } + } + + shiny::moduleServer( + id, + function(input, output, session) { + ns <- session[["ns"]] + + output[["ui"]] <- shiny::renderUI({ + res <- NULL + if (is.null(summary) && is.null(listings) && is.null(plots)) { + res <- list( + shiny::h2("Welcome to dv.papo"), + shiny::h3("Please provide at least one of these module parameters:"), + shiny::h4("\u2022 summary", style = "text-indent:2rem;"), + shiny::h4("\u2022 listings", style = "text-indent:2rem;"), + shiny::h4("\u2022 plots", style = "text-indent:2rem;"), + shiny::h3("They are all optional, but if none is provided there won't be much to look at.") + ) + } else { + res <- shiny::fluidRow( + shiny::column( + CONST$width_of_patient_selector_in_columns, + shiny::uiOutput(ns("selector")) + ) + ) + } + return(res) + }) + + output[["selector"]] <- shiny::renderUI({ + subject_level_dataset <- subject_level_dataset() + shiny::req(subject_level_dataset, cancelOutput = TRUE) + shiny::selectInput(ns("patient_selector"), + label = "Select Patient ID:", + selected = input[["patient_selector"]], + choices = unique(subject_level_dataset[[subjid_var]]) + ) + }) + + # change selected patient based on sender_ids + if (!is.null(sender_ids)) { + lapply(sender_ids, function(x) { + shiny::observeEvent(x()[["subj_id"]](), { + pid_passed <- x()[["subj_id"]]() + if (!identical(pid_passed, character(0))) { + shiny::updateSelectInput( + session = session, + inputId = "patient_selector", + selected = pid_passed + ) + } + }) + }) + } + + assert <- function(condition, message) shiny::validate(shiny::need(condition, message)) + + # patient info section + # reactive data for patient info + filtered_pt_info_data <- shiny::reactive({ + df <- subject_level_dataset() + excess_cols <- setdiff(summary$vars, names(df)) + assert( + length(excess_cols) == 0, + paste0( + "Error: `summary$vars` should be a subset of the columns available in ", + "the currently loaded subject-level dataframe (", + paste(names(df), collapse = ", "), ").\n", + "It contains the following unavailable columns: (", + paste(excess_cols, collapse = ", "), ")" + ) + ) + + pt_info_data_filter(df, subjid_var, summary$vars, input$patient_selector) + }) + + patient_info_server( + id = "pp_ui_out", + record = filtered_pt_info_data, + subjid_var = subjid_var, + column_count = summary$column_count + ) + + # reactive data for listings + filtered_listings_data <- shiny::reactive({ + shiny::req(input[["patient_selector"]]) + dataset_names <- sapply(listings, function(listing) listing[["dataset"]]) + out_list <- lapply(dataset_names, function(name) { + df <- extra_datasets()[[name]] + filter_with_mask(df, df[[subjid_var]] == input[["patient_selector"]]) + }) + names(out_list) <- dataset_names + return(out_list) + }) + + + # listings section + patient_listing_server( + id = "listings", + data_list = filtered_listings_data, + key_value = shiny::reactive(input$patient_selector), + listings = listings + ) + + # plots section + filtered_subject_level_dataset <- shiny::reactive({ + subject_id <- input[["patient_selector"]] + shiny::req(subject_id) + sl <- subject_level_dataset() + assert(subjid_var %in% names(sl), sprintf("Error: `subjid_var` variable %s not present in subject-level dataset", subjid_var)) + mask <- sl[[subjid_var]] == subject_id + assert(sum(mask) > 0, sprintf("Error: Selected patient returns no data")) + sl <- sl[sl[[subjid_var]] == subject_id, ] + return(sl) + }) + + filtered_extra_datasets <- shiny::reactive({ + subject_id <- input[["patient_selector"]] + shiny::req(subject_id) + + res <- list() + for (name in names(extra_datasets())) { + df <- extra_datasets()[[name]] + assert(subjid_var %in% names(df), sprintf("Error: `subjid_var` variable %s not present in dataset %s", subjid_var, name)) + res[[name]] <- df[df[[subjid_var]] == subject_id, ] + # rescue attributes dropped during subsetting + for (i in seq_along(res[[name]])) attributes(res[[name]][[i]]) <- attributes(df[[i]]) + } + return(res) + }) + + patient_plot_server( + id = "plot_contents", subjid_var, + subject_level_dataset = filtered_subject_level_dataset, + timeline_info, + extra_datasets = filtered_extra_datasets, + range_plots = range_plots, + value_plots = value_plots, + vline_vars = vline_vars, vline_day_numbers = vline_day_numbers, + palette = palette + ) + + return(NULL) + } + ) +} + +#' Patient Profile Module +#' +#' @description +#' +#' `mod_patient_profile` is a DaVinci Shiny module that displays patient information on a subject-level basis. It +#' consists of three sections: summary, listings and plots. +#' \itemize{ +#' \item The `summary` section shows visit-independent demographic information. +#' \item The `listings` section offers listings for visit-dependent information. +#' \item The `plots` section displays charts for events that happen over a span of time (adverse events, concomitant +#' medications, ...) or line plots of point-like events (laboratory values, vital sign measurements). +#' } +#' +#'
+#' Show/hide usage example +#'
+#'
+#' What follows is a sample call to the mod_patient_profile function. +#' See the main article of this package for a tutorial on how to parameterize it. +#'
+#' dv.papo::mod_patient_profile(
+#'   module_id = "papo",
+#'   subject_level_dataset_name = "adsl",
+#'   subjid_var = "USUBJID",
+#'   summary = list(
+#'     vars = c("SUBJID", "SITEID", "ARM", "TRTSDT", "TRTEDT", "AGE", "RACE", "SEX", "BMIBL"),
+#'     column_count = 3L
+#'   ),
+#'   listings = list(
+#'     "Concomitant Medication" = list(
+#'       dataset = "cm"
+#'     ),
+#'     "Adverse Events" = list(
+#'       dataset = "adae",
+#'       default_vars = c("ASTDT", "ASTDY", "AENDT", "AENDY", "AEDECOD", "AESEV")
+#'     )
+#'   ),
+#'   plots = list(
+#'     timeline_info = c(trt_start_date = "TRTSDT", trt_end_date = "TRTEDT"),
+#'     range_plots = list(
+#'       "Concomitant Medication" = list(
+#'         dataset = "cm",
+#'         vars = c(
+#'           start_date = "CMSTDT", end_date = "CMENDT",
+#'           decode = "CMDECOD", grading = "CMDECOD"
+#'         ),
+#'         tooltip = c()
+#'       ),
+#'       "Adverse Events" = list(
+#'         dataset = "adae",
+#'         vars = c(
+#'           start_date = "ASTDT", end_date = "AENDT", decode = "AEDECOD",
+#'           grading = "AESEV", serious_ae = "AESER"
+#'         ),
+#'         tooltip = c("AE Start Day: " = "ASTDY", "AE End Day: " = "AENDY")
+#'       )
+#'     ),
+#'     value_plots = list(
+#'       "Lab Values" = list(
+#'         dataset = "lb",
+#'         vars = c(
+#'           analysis_param = "PARAM", analysis_val = "AVAL", analysis_date = "ADT",
+#'           analysis_indicator = "LBNRIND", range_low_limit = "A1LO", range_high_limit = "A1HI"
+#'         ),
+#'         tooltip = c()
+#'       )
+#'     ),
+#'     vline_vars = c(
+#'       "Informed Consent Date" = "RFICDT"
+#'     )
+#'   )
+#' )
+#' 
+#'
+#'
+#'
+#' +#' +#' @inheritParams mod_patient_profile_params +#' +#' @return A list composed of the following elements: +#' \itemize{ +#' \item{`ui`}: Shiny UI function. +#' \item{`server`}: Shiny server function. +#' \item{`module_id`}: Shiny unique identifier. +#' } +#' +#' @seealso [mod_patient_profile_UI()], [mod_patient_profile_server()] +#' @export +mod_patient_profile <- function(module_id = "", + subject_level_dataset_name = NULL, + subjid_var = NULL, + sender_ids = NULL, + summary = NULL, + listings = NULL, + plots = NULL) { + args <- as.list(match.call()) # preserves `missing` behavior through reactives, saves us some typing + + # NOTE(miguel): These two lines allow the caller to provide lists whenever `mod_patient_profile_server` + # requires atomic arrays + args <- T_honor_as_array_flag(mod_patient_profile_API, args) + list2env(args[setdiff(seq_along(args), 1)], environment()) # overwrite current arguments with modified `args` + + mod <- list( + # UI function + ui = function(module_id) { + app_creator_feedback_ui(module_id) # NOTE: original UI gated by app_creator_feedback_server + }, + # Server function + server = function(afmm) { + fb <- shiny::reactive({ + # NOTE: We check the call here and not inside the module server function because: + # - app creators interact with the davinci module and not with the ui-server combo, so + # errors reported with respect to the module signature will make sense to them. + # The module server function might use a different function signature. + # - Here we also have access to the unfiltered dataset, which allows us to ensure call + # correctness independent of filter state or operation. + # Also, as long as the unfiltered dataset does not change (and to date no davinci app + # changes it dynamically) this check only runs once at the beginning of the application + # and has no further impact on performance. + # - "catch errors early" + + # Overwrite first "argument" (the function call, in fact) with the datasets provided to module manager + names(args)[[1]] <- "datasets" + args[[1]] <- afmm[["unfiltered_dataset"]]() + + do.call(check_papo_call, args) + }) + + fb_warn <- shiny::reactive(fb()[["warnings"]]) + fb_err <- shiny::reactive(fb()[["errors"]]) + + app_creator_feedback_server( + id = module_id, + warning_messages = fb_warn, + error_messages = fb_err, + ui = dv.papo::mod_patient_profile_UI(module_id) + ) + + filtered_mapped_datasets <- shiny::reactive( + T_honor_map_to_flag(afmm$filtered_dataset(), mod_patient_profile_API, args) + ) + + subject_level_dataset <- shiny::reactive({ + ds <- filtered_mapped_datasets()[[subject_level_dataset_name]] + shiny::validate( + shiny::need(!is.null(ds), paste("Could not find dataset", subject_level_dataset_name)) + ) + return(ds) + }) + + extra_datasets <- shiny::reactive({ + datasets <- filtered_mapped_datasets() + plot_dataset_names <- names(datasets) + return(datasets[plot_dataset_names]) + }) + + dv.papo::mod_patient_profile_server( + id = module_id, + subject_level_dataset = subject_level_dataset, + extra_datasets = extra_datasets, + subjid_var = subjid_var, + sender_ids = lapply(sender_ids, function(x) { + shiny::reactive(afmm[["module_output"]]()[[x]]) + }), + summary = summary, + listings = listings, + plots = plots + ) + }, + + # Module ID + module_id = module_id + ) + return(mod) +} diff --git a/R/mod_plots.R b/R/mod_plots.R new file mode 100644 index 0000000..9fee7b6 --- /dev/null +++ b/R/mod_plots.R @@ -0,0 +1,487 @@ +#' Create user interface for patient plot shiny module of \pkg{dv.papo} +#' +#' @param id A unique ID string to create a namespace. Must match the ID of +#' \code{patient_plot_server()}. +#' @param title character: Title of plot module +#' +#' @keywords internal +#' +patient_plot_UI <- function(id) { # nolint + ns <- shiny::NS(id) + + shiny::uiOutput(ns("ui")) +} + + +#' Create server for patient plot shiny module of \pkg{dv.papo} +#' +#' TODO: Document params (inherit them) +#' +#' @keywords internal +#' +#' +patient_plot_server <- function(id, subject_var, + subject_level_dataset, timeline_info, + extra_datasets, range_plots, value_plots, + vline_vars, vline_day_numbers, palette) { + shiny::moduleServer( + id, + function(input, output, session) { + ns <- session[["ns"]] + + # When testing reactivity, the usual way of looking at the state of a module is to isolate variables of interest + # into reactives of their own and then expose them through exportTestValues. This is a less invasive approach. + # We create a regular, non-reactive list and ... [continued in #ipahbo] + testing <- isTRUE(getOption("shiny.testmode")) + if (testing) { + exported_test_data <- list() + shiny::exportTestValues(test_plot_data = exported_test_data) + } + + palette <- unlist(utils::modifyList(as.list(CONST[["default_palette"]]), as.list(palette))) # user palette complements default + + v_extra_datasets <- shiny::reactive({ + extra_datasets <- extra_datasets() + for (df in extra_datasets) { + for (plot in c(range_plots, value_plots)) { + plot_cols <- append(plot$vars, subject_var) + ensure_columns_exist(extra_datasets[[plot$dataset]], unlist(plot_cols)) + + date_cols <- c(plot$vars$start_date, plot$vars$end_date, plot$vars$analysis_date) + ensure_columns_are_dates_or_datetimes(extra_datasets[[plot$dataset]], date_cols) + + numeric_cols <- c( + plot$vars$analysis_val, plot$vars$range_low_limit, + plot$vars$range_high_limit + ) + ensure_columns_are_numeric(extra_datasets[[plot$dataset]], numeric_cols) + } + } + return(extra_datasets) + }) + + sanitize_id <- function(id) gsub("[^a-zA-Z0-9_]", "", id) + + output[["ui"]] <- shiny::renderUI({ + shiny::req(!is.null(timeline_info)) + shiny::tagList( + shiny::h3("Graphical Display"), + shiny::fluidRow( + shiny::uiOutput(ns("selectors")) + ), + shiny::htmlOutput(ns("text")), + plotly::plotlyOutput(ns("plot")), + shiny::br() + ) + }) + + # Selectors for vs+lab plots. + output[["selectors"]] <- shiny::renderUI({ + extra_datasets <- v_extra_datasets() + selectors <- list() + + for (plot_name in names(value_plots)) { + plot <- value_plots[[plot_name]] + + dataset_name <- plot[["dataset"]] + param_col <- plot[["vars"]][["analysis_param"]] + choices <- sort(unique(extra_datasets[[dataset_name]][[param_col]])) # TODO: Enforce factor and use levels in the original order + + selector_id <- sanitize_id(plot_name) + selectors[[length(selectors) + 1]] <- shiny::column( + 3, + shinyWidgets::pickerInput( + inputId = ns(selector_id), + label = paste0("Please Select Parameter for ", plot_name, ":"), + choices = choices, + selected = shiny::isolate(input[[selector_id]]), + multiple = TRUE, + options = list("live-search" = TRUE, "actions-box" = TRUE) + ) + ) + } + + return(selectors) + }) + + compute_plots_and_messages <- function(subject_level_dataset, extra_datasets, vs_lb_selected) { + # TODO: Remove the messages already guarded against by check_papo_call + messages <- character(0) + plots <- list() + + # Process subject_level_dataset ---- + err <- ensure_columns_exist(subject_level_dataset, timeline_info, + flag_column_function = flag_columns_capture_error + ) + if (!is.null(err)) { + return(list(plots = list(), messages = err)) + } # fatal error + + timeline_info_names <- names(timeline_info) + date_cols <- timeline_info[endsWith(timeline_info_names, "date")] + err <- ensure_columns_are_dates_or_datetimes(subject_level_dataset, date_cols, + flag_column_function = flag_columns_capture_error + ) + if (!is.null(err)) { + return(list(plots = list(), messages = err)) + } # fatal error + + sl_info <- local({ + # map date-times to dates and warn about loss of precision + res <- subject_level_dataset + for (col in date_cols) { + if (inherits(res[[col]], "POSIXt")) { + date <- as.Date(res[[col]]) + if (as.POSIXct(date) != res[[col]]) { + # just a warning + messages[[length(messages) + 1]] <<- paste0("* Date-time column `", col, "` rounded to nearest date.") + } + res[[col]] <- date + } + } + + # use internal names for timeline columns (copied and not renamed to cope with repeat elements) + for (i_col in seq_along(timeline_info)) { + dest <- names(timeline_info)[[i_col]] + orig <- timeline_info[[i_col]] + res[[dest]] <- res[[orig]] + } + + return(res) + }) + + # Compute plots ---- + + timeline_limits <- local({ # start...end, but takes icf and part_end dates into account if available + min_total <- subject_level_dataset[[timeline_info[["trt_start_date"]]]] + if ("icf_date" %in% names(timeline_info)) { + icf_date <- subject_level_dataset[[timeline_info[["icf_date"]]]] + if (is.finite(icf_date)) min_total <- icf_date + } + + max_total <- as.Date(-Inf) + trt_end_date <- subject_level_dataset[[timeline_info[["trt_end_date"]]]] + if (is.finite(trt_end_date)) { + max_total <- trt_end_date + } + if ("part_end_date" %in% names(timeline_info)) { + part_end_date <- subject_level_dataset[[timeline_info[["part_end_date"]]]] + if (is.finite(part_end_date)) max_total <- part_end_date + } + if (!is.finite(max_total)) max_total <- Sys.Date() + + c(min_total, max_total) + }) + + x_limits <- local({ # we need to compute combined limits first because ggplot+plotly need them before layout calculation + # the +/-1 avoids clipping the left and right arrows on the plot + diff <- timeline_limits[[2]] - timeline_limits[[1]] + offset_left <- min(-1L, round(-diff / 10)) + offset_right <- max(1L, round(diff / 10)) + c(timeline_limits[[1]] + offset_left, timeline_limits[[2]] + offset_right) + }) + + plot_list <- local({ + res <- list() + + build_tooltip <- function(tooltip_spec, df) { + # TODO: color = .data[[plots[[set]]$vars$grading]] ?? + + res <- list() + for (i_row in seq_len(nrow(df))) { + res_elem <- "" + for (i_line in seq_along(tooltip_spec)) { + prefix <- names(tooltip_spec)[[i_line]] # NOTE: App creators can specify breaking lines through '
' + col <- tooltip_spec[[i_line]] + res_elem <- paste0(res_elem, prefix, df[[col]][[i_row]], "
") + } + res[[i_row]] <- res_elem + } + + return(res) + } + + # AE, CM + for (plot_name in names(range_plots)) { + plot_params <- range_plots[[plot_name]] + df <- extra_datasets[[plot_params$dataset]] + + if (nrow(df) == 0) { + messages[[length(messages) + 1]] <<- paste0("* No Data for ", plot_name, ".") + next + } + + # Column aliases (copied and not renamed to cope with repeat elements) + vars <- plot_params[["vars"]] + df[["start_date"]] <- as.Date(df[[vars[["start_date"]]]]) + df[["end_date"]] <- as.Date(df[[vars[["end_date"]]]]) + df[["decode"]] <- df[[vars[["decode"]]]] + if ("grading" %in% names(vars)) df[["grading"]] <- df[[vars[["grading"]]]] + if ("serious_ae" %in% names(vars)) df[["serious_ae"]] <- df[[vars[["serious_ae"]]]] + + # wrap decode column + df[["decode"]] <- strwrap(df[["decode"]], + width = CONST$decode_max_width_before_wrap_in_characters, + simplify = FALSE + ) |> sapply(function(x) paste(x, collapse = "\n")) + + df <- df[intersect(names(df), c("start_date", "end_date", "decode", "grading", "serious_ae"))] + + # Add `arrow_left` and `arrow_right` columns to range_plots + unknown_start_date <- is.na(df[["start_date"]]) + predate_study_start_date <- df[["start_date"]] < timeline_limits[[1]] + + df[["arrow_left"]] <- as.Date(NA) # no arrow + df[unknown_start_date | predate_study_start_date, "arrow_left"] <- timeline_limits[[1]] + df[unknown_start_date | predate_study_start_date, "start_date"] <- timeline_limits[[1]] + + unknown_end_date <- is.na(df[["end_date"]]) + outlast_study_end_date <- timeline_limits[[2]] < df[["end_date"]] + + df[["arrow_right"]] <- as.Date(NA) # no arrow + df[unknown_end_date | outlast_study_end_date, "arrow_right"] <- timeline_limits[[2]] + df[unknown_end_date | outlast_study_end_date, "end_date"] <- timeline_limits[[2]] + + y_count <- length(unique(df[["decode"]])) + height <- max(y_count + 2, 5) + + ggplot <- create_ae_cm_plot( + data = df, x_limits = x_limits, palette = palette, + sl_info, vline_vars = vline_vars, vline_day_numbers = vline_day_numbers, + ref_date = sl_info[["trt_start_date"]] + ) + + tooltip_text <- build_tooltip( + tooltip_spec = plot_params$tooltip, + df = extra_datasets[[plot_params$dataset]] + ) + + ggplot <- ggplot + ggplot2::aes(text = tooltip_text) + + plot <- plotly::ggplotly( + ggplot, + height = height * 32, tooltip = c("text") + ) + plot <- plotly::add_annotations( + plot, + text = plot_name, + x = 0, + y = 1, + yref = "paper", + xref = "paper", + xanchor = "left", + yanchor = "top", + xshift = 0, + yshift = 22, + showarrow = FALSE, + font = list(size = 15) + ) + + # ... [continued from #ipahbo] we just dump stuff into it from inside reactives wherever the + # variable of interest becomes available. Then ... [continued on tests/testthat/test-all.R:#umeega] + if (testing) { + exported_test_data[[paste0("tooltips/", plot_name)]] <<- tooltip_text + exported_test_data[[paste0("plot_first_line_color/", plot_name)]] <<- + plot[["x"]][["data"]][[1]][["line"]][["color"]] + exported_test_data[[paste0("arrow_right/", plot_name)]] <<- df[["arrow_right"]] + } + + # tweak legend manually - adapted from dv.papo 1; maybe there's a documented way of achieving the same? + extract_first <- function(s) sub("\\(([^,]*).*\\)", "\\1", s) + + for (i in seq_along(plot$x$data)) { + s <- plot$x$data[[i]]$name + if (!is.null(s)) plot$x$data[[i]]$name <- extract_first(s) + } + res[[length(res) + 1]] <- plot + } + + # VS, LAB + for (plot_name in names(value_plots)) { + plot_info <- value_plots[[plot_name]] + params <- vs_lb_selected[[sanitize_id(plot_name)]] + + if (length(params) == 0) { + messages[[length(messages) + 1]] <<- paste("* No Parameter for", plot_name, "selected.") + next + } + + for (i_param in seq_along(params)) { + local_palette <- palette + + param <- params[[i_param]] + df <- extra_datasets[[plot_info$dataset]] + + analysis_indicator_col <- plot_info[["vars"]][["analysis_indicator"]] + if (!is.null(analysis_indicator_col)) { + values <- df[[analysis_indicator_col]] + if (is.character(values)) { + values <- as.factor(values) + sprintf( + paste( + "* Analysis indicator column `%s` on dataset `%s` promoted to factor automatically.", + "Make it a factor beforehand to avoid this message." + ), + analysis_indicator_col, plot_info$dataset + ) |> warning() + } + + df[["analysis_indicator"]] <- values + + analysis_indicator_levels <- levels(values) + if ("" %in% trimws(analysis_indicator_levels)) { + sprintf( + "* Analysis indicator column `%s` on dataset `%s` Contains empty levels.", + analysis_indicator_col, plot_info$dataset + ) |> warning() + } + + levels_wo_palette_colors <- setdiff(levels(values), names(local_palette)) + if (length(levels_wo_palette_colors)) { + auto_color <- CONST$color_for_missing_analysis_indicator_levels + sprintf( + paste0( + "* Missing palette colors for analysis indicator column levels: ", + paste(levels_wo_palette_colors, collapse = ", "), ". Will paint them as %s." + ), auto_color + ) |> warning() + local_palette[levels_wo_palette_colors] <- auto_color + } + } + + param_mask <- df[[plot_info[["vars"]][["analysis_param"]]]] %in% param + df <- df[param_mask, ] + + ggplot <- create_lb_vs_plot( + data = df, + date = plot_info$vars[["analysis_date"]], + val = plot_info$vars[["analysis_val"]], + low_limit = plot_info$vars[["range_low_limit"]], + high_limit = plot_info$vars[["range_high_limit"]], + param = plot_info$vars[["analysis_param"]], + summary_stats = plot_info$vars[["summary_stats"]], + x_limits = x_limits, + palette = local_palette, + sl_info, vline_vars, + vline_day_numbers = vline_day_numbers, + ref_date = sl_info[["trt_start_date"]] + ) + + tooltip_text <- local({ + mask <- df[[plot_info$vars[["analysis_param"]]]] == param # TODO: this could precede the create_lb_vs_plot call #peizai + build_tooltip(tooltip_spec = plot_info$tooltip, df = df[mask, ]) + }) + + ggplot <- ggplot + ggplot2::aes(text = tooltip_text) + + plot <- plotly::ggplotly(ggplot, height = 160, tooltip = c("text")) + + plot <- plotly::add_annotations( + plot, + text = ifelse(i_param == 1, plot_name, ""), + x = 0, + y = 1, + yref = "paper", + xref = "paper", + xanchor = "left", + yanchor = "top", + xshift = 0, + yshift = 22, + showarrow = FALSE, + font = list(size = 15) + ) + + res[[length(res) + 1]] <- plot + } + } + + return(res) + }) + + if (length(plot_list)) { + # stack plots + heights <- sapply(plot_list, function(x) x[["height"]], simplify = "array") + heights <- heights + 80 / length(heights) # (HACK to cope with plotly) Divide space dedicated to footer equally among all plots + plots <- plotly::subplot(plot_list, + shareX = TRUE, titleX = TRUE, nrows = length(plot_list), margin = 0, + heights = heights / sum(heights) + ) + + x_limits_z <- x_limits - sl_info[["trt_start_date"]] + plots <- silence_warning( + plotly::layout(plots, height = sum(heights), xaxis = list(range = x_limits_z)), + "Specifying width/height in layout() is now deprecated.\nPlease specify in ggplotly() or plot_ly()" + # Bypass deprecation warning, because the alternative is using the size of one of the subplots to dictate the size + # of the stacked plot. This issue predates the covid pandemic and remains unresolved: + # https://github.com/plotly/plotly.R/issues/1613 + ) + + # strip unwanted portions of text (e.g. "(SCREENING 1,1)" -> "SCREENING 1") # TODO: where do these come from? + plots <- local({ + first_elem_before_comma_in_parens_re <- "\\(([^,]*),.*\\)" + for (i in seq_along(plots$x$data)) { + plots$x$data[[i]]$name <- sub(first_elem_before_comma_in_parens_re, "\\1", plots$x$data[[i]]$name) + } + plots + }) + + # remove legend duplicates # TODO: avoid including them in the first place? + plots <- local({ + names_seen <- character(0) + for (i in seq_along(plots$x$data)) { + name <- plots$x$data[[i]][["name"]] + if (name %in% names_seen) { + plots$x$data[[i]]$showlegend <- FALSE + } else { + names_seen <- c(names_seen, name) + } + } + plots + }) + + # title also gets duplicated when subplot joins legends # TODO: Avoid it to begin with + plots[["x"]][["layout"]][["legend"]][["title"]][["text"]] <- " Legend " + } + + return(list(plots = plots, messages = messages)) + } + + plots_and_messages <- shiny::reactive({ + if (length(range_plots) > 0 || length(value_plots) > 0) { + subject_level_dataset <- subject_level_dataset() + extra_datasets <- v_extra_datasets() + vs_lb_selected <- local({ + ids <- sanitize_id(names(value_plots)) + res <- Map(function(id) input[[id]], ids) + can_proceed <- setequal(intersect(ids, shiny::isolate(names(input))), ids) + shiny::req(isTRUE(can_proceed)) + return(res) + }) + + res <- shiny::maskReactiveContext( + compute_plots_and_messages(subject_level_dataset, extra_datasets, vs_lb_selected) + ) + } else { + res <- list(messages = "* No range or value plots configured") + } + + if (testing) { + exported_test_data[["plot_messages"]] <<- res[["messages"]] + } + + return(res) + }) + + output[["plot"]] <- plotly::renderPlotly({ + plots <- plots_and_messages()[["plots"]] + shiny::req(length(plots) > 0) + return(plots) + }) + + output[["text"]] <- shiny::renderUI({ + messages <- plots_and_messages()[["messages"]] + shiny::HTML(paste(messages, collapse = "
")) + }) + } + ) +} diff --git a/R/mod_signature.R b/R/mod_signature.R new file mode 100644 index 0000000..962ab2f --- /dev/null +++ b/R/mod_signature.R @@ -0,0 +1,171 @@ +#' Dummy function to extract parameter documentation from mod_patient_profile_API +#' +#' Generated by `write_mod_param_help.R`. +#' +#' @keywords internal +#' +#' @param module_id +#' `[character]` +#' Unique Shiny module identifier. +#' @param subject_level_dataset_name +#' `[character]` +#' Subject-level dataset name. +#' @param subjid_var +#' `[character]` +#' Unique subject identifier column. +#' @param sender_ids +#' `[character(n)]` (optional) +#' Identifiers of modules allowed to request the display of target patient IDs. +#' @param summary +#' `[list]` (optional) +#' Subject-level summary section. +#' Composed of: +#' * vars +#' `[character(n)]` +#' Values to display in the summary section. +#' Indexes into dataset `subject_level_dataset_name`. +#' * column_count +#' `[integer]` +#' Column count for the summary section. +#' @param listings +#' `[list(n)]` (optional) +#' Listings section. +#' Composed of: +#' * dataset +#' `[character]` +#' Dataset name. +#' * default_vars +#' `[character(n)]` (optional) +#' Default columns to display. If not specified, the first six columns are +#' selected by default. +#' Indexes into dataset `dataset`. +#' @param plots +#' `[list]` (optional) +#' Plot section. +#' Composed of: +#' * timeline_info +#' `[list]` +#' Start and end study dates. +#' Composed of: +#' * icf_date +#' `[character]` (optional) +#' Informed Consent Form signing Date. +#' Indexes into dataset `subject_level_dataset_name`. Expects `[Date|POSIXt]` +#' values. +#' * trt_start_date +#' `[character]` +#' Treatment Start Date, used also as Day 1 Reference Date. +#' Indexes into dataset `subject_level_dataset_name`. Expects `[Date|POSIXt]` +#' values. +#' * trt_end_date +#' `[character]` +#' Treatment End Date. +#' Indexes into dataset `subject_level_dataset_name`. Expects `[Date|POSIXt]` +#' values. +#' * part_end_date +#' `[character]` (optional) +#' Participation End Date. +#' Indexes into dataset `subject_level_dataset_name`. Expects `[Date|POSIXt]` +#' values. +#' * range_plots +#' `[list(n)]` +#' Plots for range-like events (adverse events, concomitant medications, ...). +#' Composed of: +#' * dataset +#' `[character]` +#' Dataset name. +#' * vars +#' `[list]` +#' Variables of interest for the event. +#' Composed of: +#' * start_date +#' `[character]` +#' Start date. +#' Indexes into dataset `dataset`. Expects `[Date|POSIXt]` values. +#' * end_date +#' `[character]` +#' End date. +#' Indexes into dataset `dataset`. Expects `[Date|POSIXt]` values. +#' * decode +#' `[character]` +#' Descriptive event label. +#' Indexes into dataset `dataset`. Expects `[character|factor]` values. +#' * grading +#' `[character]` (optional) +#' Degree of the event, used for color-coding the plot. +#' Indexes into dataset `dataset`. Expects `[character|factor]` values. +#' * serious_ae +#' `[character]` (optional) +#' Marker of event seriousness, usually reserved for adverse event datasets. +#' Indexes into dataset `dataset`. Expects `[logical|"Y"/"N"]` values. +#' * tooltip +#' `[character(n)]` +#' Block of text to display as hover information over the left edge of each range. +#' The names of this list are included as literal text and honor three basic HTML +#' formatting elements: ``, ``, `
`). The columns the values refer to are +#' populated with the value on the dataset relevant to any given row. +#' Indexes into dataset `dataset`. +#' * value_plots +#' `[list(n)]` +#' Plots for value-like (lab measurements, vital signs, ...) traces. +#' Composed of: +#' * dataset +#' `[character]` +#' Dataset name. +#' * vars +#' `[list]` +#' Variables of interest for the trace. +#' Composed of: +#' * analysis_param +#' `[character]` +#' Parameter. +#' Indexes into dataset `dataset`. Expects `[character|factor]` values. +#' * analysis_val +#' `[character]` +#' Value. +#' Indexes into dataset `dataset`. Expects `[numeric]` values. +#' * analysis_date +#' `[character]` +#' Date. +#' Indexes into dataset `dataset`. Expects `[Date|POSIXt]` values. +#' * analysis_indicator +#' `[character]` (optional) +#' Analysis reference range indicator. +#' Indexes into dataset `dataset`. Expects `[character|factor]` values. +#' * range_low_limit +#' `[character]` (optional) +#' Lower limit of the reference range. +#' Indexes into dataset `dataset`. Expects `[numeric]` values. +#' * range_high_limit +#' `[character]` (optional) +#' Upper limit of the reference range. +#' Indexes into dataset `dataset`. Expects `[numeric]` values. +#' * summary_stats +#' `[character]` (optional) +#' Additional value column for summary statistics. +#' Indexes into dataset `dataset`. Expects `[numeric]` values. +#' * tooltip +#' `[character(n)]` +#' Block of text to display as hover information over each point of the trace. The +#' names of this list are included as literal text and honor three basic HTML +#' formatting elements: ``, ``, `
`). The columns the values refer to are +#' populated with the value on the dataset relevant to any given row. +#' Indexes into dataset `dataset`. +#' * vline_vars +#' `[character(n)]` +#' Place vertical dashed lines on days indicated by this dataset columns. +#' Indexes into dataset `subject_level_dataset_name`. Expects +#' `[integer|Date|POSIXt]` values. +#' * vline_day_numbers +#' `[integer(n)]` (optional) +#' Place vertical dashed lines on days indicated by this parameter. +#' Represents a CDISC (non-zero) Study Day. +#' * palette +#' `[character(n)]` (optional) +#' If a name on this list matches the text on a plot element, the associated color +#' will be applied to that element. This mapping takes precedence over the +#' built-in palette. +#' Contains either an HTML (#xxxxxx) or an R color. +#' +#' @return No return value. +mod_patient_profile_params <- function(module_id, subject_level_dataset_name, subjid_var, sender_ids, summary, listings, plots) NULL diff --git a/R/prep_safety_data.R b/R/prep_safety_data.R new file mode 100644 index 0000000..f19f92a --- /dev/null +++ b/R/prep_safety_data.R @@ -0,0 +1,66 @@ +#' Prepare safety data +#' +#' Modifiy safetyData's adsl, adae, and adcm dummy data for easy use within +#' \pkg{dv.clinlines}. +#' +#' @param n Number of rows to select from the adsl dataset. The first n rows will be +#' taken. Used to reduce runtime during development. +#' +#' @return A list of three data frames. +#' +#' @keywords internal +#' +#' @importFrom rlang .data + +prep_safety_data <- function(n = 200) { + if (!requireNamespace("dplyr")) { + stop("This function requires `dplyr`") + } + + adsl_info <- safetyData::adam_adsl[1:n, ] + adsl_info[["TRTSDT"]] <- robust_ymd(adsl_info[["TRTSDT"]]) |> structure(label = "Treatment Start Date") + adsl_info[["TRTEDT"]] <- robust_ymd(adsl_info[["TRTEDT"]], round_up = TRUE) |> structure(label = "Treatment End Date") + adsl_info[["RFICDT"]] <- robust_ymd(adsl_info[["RFSTDTC"]]) |> structure(label = "Informed Consent Date") + adsl_info[["TRTDUR"]] <- as.numeric(adsl_info[["TRTDUR"]]) |> structure(label = "Treatment duration (days)") + + subjects <- unique(adsl_info[["USUBJID"]]) + + # adae + known_adverse_event_start_date_mask <- !is.na(safetyData::adam_adae[["ASTDT"]]) + selected_subject_mask <- safetyData::adam_adae[["USUBJID"]] %in% subjects + adae_info <- safetyData::adam_adae[known_adverse_event_start_date_mask & selected_subject_mask, ] + aeser_attributes <- attributes(adae_info[["AESER"]]) + adae_info[["AESER"]] <- c("Y" = TRUE, "N" = FALSE)[adae_info[["AESER"]]] + attributes(adae_info[["AESER"]]) <- aeser_attributes + + # cm + known_cm_event_start_date_mask <- !is.na(safetyData::sdtm_cm[["CMSTDTC"]]) + selected_subject_mask <- safetyData::sdtm_cm[["USUBJID"]] %in% subjects + cm_info <- safetyData::sdtm_cm[known_cm_event_start_date_mask & selected_subject_mask, ] + + cm_info[["CMSTDT"]] <- robust_ymd(cm_info[["CMSTDTC"]]) + cm_info[["CMENDT"]] <- robust_ymd(cm_info[["CMENDTC"]], round_up = TRUE) + + # vs + vs_info <- safetyData::adam_advs |> + dplyr::left_join(safetyData::adam_advs |> + dplyr::group_by(.data[["USUBJID"]], .data[["PARAM"]], .data[["VISIT"]]) |> + dplyr::summarise(AVAL_MEAN = mean(as.numeric(.data$AVAL)), .groups = "drop") |> + dplyr::ungroup(), by = c("USUBJID", "PARAM", "VISIT")) + attr(vs_info[["AVAL_MEAN"]], "label") <- "Mean Value" + + + # lb + lb_info <- safetyData::adam_adlbc |> + dplyr::left_join(safetyData::adam_adlbc |> + dplyr::group_by(.data[["USUBJID"]], .data[["PARAM"]], .data[["VISIT"]]) |> + dplyr::summarise(AVAL_MEAN = mean(as.numeric(.data$AVAL)), .groups = "drop") |> + dplyr::ungroup(), by = c("USUBJID", "PARAM", "VISIT")) |> + dplyr::filter( + .data$USUBJID %in% adsl_info$USUBJID + ) + + attr(lb_info[["AVAL_MEAN"]], "label") <- "Mean Value" + + return(list(adsl = adsl_info, adae = adae_info, cm = cm_info, lb = lb_info, vs = vs_info)) +} diff --git a/R/utils-misc.R b/R/utils-misc.R new file mode 100644 index 0000000..4d46ba5 --- /dev/null +++ b/R/utils-misc.R @@ -0,0 +1,65 @@ +drop_columns_by_name <- function(df, col_names) { + df[col_names] <- list(NULL) + return(df) +} + +select_columns_by_name <- function(df, col_names) { + return(df[, col_names, drop = FALSE]) +} + +filter_with_mask <- function(df, mask) { + labels <- Map(function(col) attr(col, "label"), df) + res <- df[mask, ] + for (name in names(labels)) attr(res[[name]], "label") <- labels[[name]] + return(res) +} + +silence_warning <- function(expr, warning_message) { + withCallingHandlers( + expr, + warning = function(w) { + if (w$message != warning_message) { + NULL + } else { + invokeRestart("muffleWarning") + } + } + ) +} + +merge_with_no_duplicate_cols <- function(a, b, by) merge(a, b[c(by, setdiff(names(b), names(a)))], by) + +robust_min <- function(...) min(..., +Inf, na.rm = TRUE) # TODO: Remove if unused +robust_max <- function(...) max(..., -Inf, na.rm = TRUE) # TODO: Remove if unused + +robust_ymd <- function(data, round_up = FALSE) { + label <- attr(data, "label") + + data <- substr(data, 1, 10) + missing_day <- !is.na(data) & nchar(data) == 7 + missing_month_day <- !is.na(data) & nchar(data) == 4 + if (round_up) { # next month, next year + year <- as.integer(substr(data[missing_day], 1, 4)) + month <- as.integer(substr(data[missing_day], 6, 7)) + 1 + carry <- month == 13 + year[carry] <- year[carry] + 1 + month[carry] <- 1 + data[missing_day] <- sprintf("%04d-%02d", year, month) + + year <- as.integer(substr(data[missing_month_day], 1, 4)) + 1 + data[missing_month_day] <- sprintf("%04d", year) + } + + data[missing_month_day] <- paste0(data[missing_month_day], "-01-01") + data[missing_day] <- paste0(data[missing_day], "-01") + + data <- as.Date(data) + + if (round_up) { # one day before next month, before next year + data[missing_day | missing_month_day] <- data[missing_day | missing_month_day] - 1 + } + + attr(data, "label") <- label + + return(data) +} diff --git a/R/write_mod_signature.R b/R/write_mod_signature.R new file mode 100644 index 0000000..9c92048 --- /dev/null +++ b/R/write_mod_signature.R @@ -0,0 +1,79 @@ +write_mod_param_help_inner <- function(elem, depth = 1) { + docs <- attr(elem, "docs") + + indentation <- strrep(" ", times = depth) + + cardinality <- if (isTRUE(attr(elem, "zero_or_more"))) "(n)" else "" + + res <- sprintf("#' `[%s%s]`", docs[["type"]], cardinality) + + if (isTRUE(attr(elem, "optional"))) res <- paste(res, "(optional)") + + if (nchar(docs[["manual_desc"]]) > 0) { + manual_desc <- paste0(docs[["manual_desc"]], ".") + manual_desc <- paste("#' ", strwrap(manual_desc, width = 80)) + res <- c(res, manual_desc) + } + + if (length(docs[["auto_desc"]])) { + auto_desc <- paste0(docs[["auto_desc"]], ".") |> paste(collapse = " ") + auto_desc <- paste("#' ", strwrap(auto_desc, width = 80)) + res <- c(res, auto_desc) + } + + if (elem$kind == "group") { + res <- c(res, "#' Composed of:") + + subelem_names <- names(elem[["elements"]]) + for (i_elem in seq_along(elem[["elements"]])) { + subelem <- elem[["elements"]][[i_elem]] + res <- c( + res, + paste( + sprintf("#'%s*", indentation), + subelem_names[[i_elem]] + ), + write_mod_param_help_inner(subelem, depth + 1) + ) + } + } + + return(res) +} + +write_mod_param_help <- function() { + env <- new.env() + mod_API_path <- system.file("R/mod_API.R", package = "dv.papo", mustWork = TRUE) + source(mod_API_path, local = env) + api <- env[["mod_patient_profile_API"]][["elements"]] + + head <- c( + "#' Dummy function to extract parameter documentation from mod_patient_profile_API", + "#'", + "#' Generated by `write_mod_param_help.R`.", + "#'", + "#' @keywords internal", + "#'" + ) + + param_docs <- c() + + param_names <- names(api) + for (i_param in seq_along(api)) { + param_name <- param_names[[i_param]] + param <- api[[i_param]] + param_head <- paste("#' @param", param_name) + param_tail <- write_mod_param_help_inner(param) + param_docs <- c(param_docs, param_head, param_tail) + } + + tail <- c( + "#'", + "#' @return No return value.", + sprintf("mod_patient_profile_params <- function(%s) NULL", paste(names(api), collapse = ", ")) + ) + + mod_signature_path <- file.path(system.file("R", package = "dv.papo"), "mod_signature.R") + + writeLines(text = c(head, param_docs, tail), con = mod_signature_path) +} diff --git a/README.Rmd b/README.Rmd new file mode 100644 index 0000000..3cffa78 --- /dev/null +++ b/README.Rmd @@ -0,0 +1,91 @@ +--- +output: + md_document: + variant: markdown_github +--- + + + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>", + out.width = "100%", + tidy = "styler" +) +``` + +# dv.papo + + + + +DaVinci's `dv.papo` module shows patient information on a subject-level basis. + +It can produce listings as well as a variety of plots. Those include events over time (adverse events, concomitant medications, ...) or point-like events (lab values, vital sign measurements, ...). + +It is no limited to one data source, thus it can handle data from either ADAM, or SDTM. + +![](man/figures/patient_profile_app.png) + +Other DaVinci modules can direct `mod_patient_profile` to select and display information associated to any particular subject ID. When the Patient Profile is so instructed, it switches to the target subject ID and takes focus from the application, effectively *jumping* to a patient profile display as a result of a simple user interaction, such as a mouse click. + +## Installation + +``` r +if (!require("remotes")) install.packages("remotes") +remotes::install_github("Boehringer-Ingelheim/dv.papo") +``` + +## Example +To use `dv.papo` inside a DaVinci app, add the module to your module list. The code below shows an example definition of a one-item module list. The setup of the `plots` parameter produces a plot showing Adverse Events.
+See `vignette("a00-papo")` for further information on how to use `dv.papo` with `dv.manager`. + +```{r example, eval = FALSE} + dataset_list <- list( + "demo" = dv.papo:::prep_safety_data(5), + "demo2" = dv.papo:::prep_safety_data(10) + ) + + module_list <- list( + "Patient Profile" = dv.papo::mod_patient_profile( + module_id = "papo", + subject_level_dataset_name = "adsl", + subjid_var = "USUBJID", + summary = list( + vars = c("SUBJID", "SITEID", "ARM", "TRTSDT", "TRTEDT", "AGE", "RACE", "SEX", "BMIBL"), + column_count = 3L + ), + listings = list( + "Concomitant Medication" = list( + dataset = "cm" + ), + "Adverse Events" = list( + dataset = "adae", + default_vars = c("ASTDT", "ASTDY", "AENDT", "AENDY", "AEDECOD", "AESEV") + ) + ), + plots = list( + timeline_info = c(trt_start_date = "TRTSDT", trt_end_date = "TRTEDT"), + range_plots = list( + "Adverse Events" = list( + dataset = "adae", + vars = c( + start_date = "ASTDT", end_date = "AENDT", + decode = "AEDECOD", grading = "AESEV", serious_ae = "AESER" + ), + tooltip = c("AE Start Day: " = "ASTDY", "AE End Day: " = "AENDY") + ) + ), + value_plots = list(), + vline_vars = c("Informed Consent Date" = "RFICDT") + ) + ) + ) + + dv.manager::run_app( + data = dataset_list, + module_list = module_list, + filter_data = "adsl" + ) +``` diff --git a/README.md b/README.md index 4109864..23cb68c 100644 --- a/README.md +++ b/README.md @@ -1 +1,89 @@ + + # dv.papo + + + + +DaVinci’s `dv.papo` module shows patient information on a subject-level +basis. + +It can produce listings as well as a variety of plots. Those include +events over time (adverse events, concomitant medications, …) or +point-like events (lab values, vital sign measurements, …). + +It is no limited to one data source, thus it can handle data from either +ADAM, or SDTM. + +![](man/figures/patient_profile_app.png) + +Other DaVinci modules can direct `mod_patient_profile` to select and +display information associated to any particular subject ID. When the +Patient Profile is so instructed, it switches to the target subject ID +and takes focus from the application, effectively *jumping* to a patient +profile display as a result of a simple user interaction, such as a +mouse click. + +## Installation + +``` r +if (!require("remotes")) install.packages("remotes") +remotes::install_github("Boehringer-Ingelheim/dv.papo") +``` + +## Example + +To use `dv.papo` inside a DaVinci app, add the module to your module +list. The code below shows an example definition of a one-item module +list. The setup of the `plots` parameter produces a plot showing Adverse +Events.
See `vignette("a00-papo")` for further information on how +to use `dv.papo` with `dv.manager`. + +``` r +dataset_list <- list( + "demo" = dv.papo:::prep_safety_data(5), + "demo2" = dv.papo:::prep_safety_data(10) +) + +module_list <- list( + "Patient Profile" = dv.papo::mod_patient_profile( + module_id = "papo", + subject_level_dataset_name = "adsl", + subjid_var = "USUBJID", + summary = list( + vars = c("SUBJID", "SITEID", "ARM", "TRTSDT", "TRTEDT", "AGE", "RACE", "SEX", "BMIBL"), + column_count = 3L + ), + listings = list( + "Concomitant Medication" = list( + dataset = "cm" + ), + "Adverse Events" = list( + dataset = "adae", + default_vars = c("ASTDT", "ASTDY", "AENDT", "AENDY", "AEDECOD", "AESEV") + ) + ), + plots = list( + timeline_info = c(trt_start_date = "TRTSDT", trt_end_date = "TRTEDT"), + range_plots = list( + "Adverse Events" = list( + dataset = "adae", + vars = c( + start_date = "ASTDT", end_date = "AENDT", + decode = "AEDECOD", grading = "AESEV", serious_ae = "AESER" + ), + tooltip = c("AE Start Day: " = "ASTDY", "AE End Day: " = "AENDY") + ) + ), + value_plots = list(), + vline_vars = c("Informed Consent Date" = "RFICDT") + ) + ) +) + +dv.manager::run_app( + data = dataset_list, + module_list = module_list, + filter_data = "adsl" +) +``` diff --git a/_pkgdown.yml b/_pkgdown.yml new file mode 100644 index 0000000..068b1fd --- /dev/null +++ b/_pkgdown.yml @@ -0,0 +1,25 @@ +template: + bootstrap: 5 + +navbar: + type: inverse + structure: + left: [intro, reference, articles, tutorials, news, qc] + components: + qc: + text: Quality Control + href: articles/qc.html +home: + title: dv.papo + links: + +reference: +- title: Main module function +- contents: + - mod_patient_profile +- title: Functions for use outside of DaVinci +- contents: + - starts_with("mod_patient_profile_") +- title: Demo/configuration tool +- contents: + - explorer_app diff --git a/inst/validation/results/.gitempty b/inst/validation/results/.gitempty new file mode 100644 index 0000000..e69de29 diff --git a/inst/validation/run_validation.R b/inst/validation/run_validation.R new file mode 100644 index 0000000..465c65c --- /dev/null +++ b/inst/validation/run_validation.R @@ -0,0 +1,44 @@ +pkg_name <- read.dcf("DESCRIPTION")[, "Package"] +pkg_version <- read.dcf("DESCRIPTION")[, "Version"] +test_results <- tibble::as_tibble(devtools::test()) + +local({ + # This is evaluated inside a local because, otherwise, all the variables created in the chunks of the rendered + # document leak into the environment + + validation_root <- "./inst/validation" + validation_report_rmd <- file.path(validation_root, "val_report.Rmd") + validation_report_html <- "val_report.html" + validation_results <- file.path(validation_root, "results") + val_param_rds <- file.path(validation_results, "val_param.rds") + + stopifnot(dir.exists(validation_root)) + stopifnot(file.exists(validation_report_rmd)) + + stopifnot(dir.exists(validation_results)) + unlink(list.files(validation_results)) + + saveRDS( + list( + package = pkg_name, + tests = test_results, + version = pkg_version + ), + val_param_rds + ) + + rmarkdown::render( + input = validation_report_rmd, + params = list( + package = pkg_name, + tests = test_results, + version = pkg_version + ), + output_dir = validation_results, + output_file = validation_report_html + ) + + # We use one of the leaked variables, created inside the validation report to asses if the validation is + # succesful or not + VALIDATION_PASSED +}) diff --git a/inst/validation/specs.R b/inst/validation/specs.R new file mode 100644 index 0000000..1c4f26b --- /dev/null +++ b/inst/validation/specs.R @@ -0,0 +1,35 @@ +specs <- list( + common = list( + subject_selector = "The subject selector selects subjects", + bookmarking = "Bookmarks bookmark state", + jump_to_subject = "The jump-to-subject switches to subject when instructed", + misconfiguration_feedback = "The module shows informative messages when misconfigured", + dataset_change = "Patient selector updates after dataset change" + ), + summary = list( + columns = "Summary data presented in custom column count" + ), + listings = list( + column_labels = "Listings display column labels in headings if available", + switching = "Tab buttons allow listing switching", + filtering = "Listing content can be searched and filtered", + sorting = "Listing content can sorted and the order can be reset", + extra_column_selection = "User can modify columns included in listing", + extra_column_selection_labels = "Column selector shows dataset column labels", + no_data_message = "Listings explain there is no data when there is no data" + ), + plots = list( + common = list( + tooltips = "Hovering over salient plot elements provides extra information", + palettes = "Plots can be customized by assigning specific colors to elements denoted by text strings", + no_data_message = "Plots explain there is no data when there is no data" + ), + value = list( + parameter_selection = "User can select parameters for value plots" + ), + range = list( + arrows = "Arrows indicate events exceeding range limits", + grading = "Plots colored according to grading" + ) + ) +) diff --git a/inst/validation/utils-validation.R b/inst/validation/utils-validation.R new file mode 100644 index 0000000..06eeb3d --- /dev/null +++ b/inst/validation/utils-validation.R @@ -0,0 +1,155 @@ +#' Setting up the validation + +if (!exists("package_name")) stop("package name must be in the environment when this script is sourced") + +#' How to link tests and specs + +if (FALSE) { + test_that( + vdoc[["add_spec"]]("my test description", specs$a_spec), + { + expect_true(TRUE) + } + ) +} +#' The specs variable on the call references the one declared in specs.R + +#' 3. For those tests covering more than one spec. +#' NOTE: It must be c() and not list() +#' + +if (FALSE) { + test_that( + vdoc[["add_spec"]]("my test_description", c(specs$my$hier$spec, vdoc_specs$my$hier$other_spec)), + { + expect_true(TRUE) + } + ) +} + +#' Considerations: +#' - parse_spec uses deparse(substitute()). These spec_ids are later used to check if all requirements +#' are covered or not, therefore those calls cannot by substituted for: + +if (FALSE) { + my_spec <- specs$my$hier$spec + test_that(vdoc[["add_spec"]]("my test_description", my_spec), { + ... + }) + + test_that(vdoc[["add_spec"]]("my test_description", specs[["my"]][["hier"]][["spec"]]), { + ... + }) +} + +# In this case the substitute captures my_spec and cannot be used later. +# If you want to do this you must use the spec_id parameter where you pass a +# character vector with the ids. +# Notice that the ids in character form do no longer have the specs particle +# at the beginning, only the pathing of the spec is needed. + +if (FALSE) { + my_spec <- specs$my$hier$spec + test_that(vdoc$parse_spec(my_spec, "my test_description", spec_id = c("my$hier$spec")), { + ... + }) +} + +# Validation code +# nolint start cyclocomp_linter +local({ + specs <- source( + system.file("validation", "specs.R", package = package_name, mustWork = TRUE), + local = TRUE + )[["value"]] + recursive_ids <- function(x, parent = character(0)) { + if (!is.list(x)) { + return(parent) + } + unlist(mapply(recursive_ids, + x, + paste(parent, names(x), + sep = if (identical(parent, character(0))) "" else "$" + ), + SIMPLIFY = FALSE, USE.NAMES = FALSE + )) + } + + recursive_ids <- function(x, parent = character(0)) { + if (!is.list(x)) { + return(parent) + } + unlist(mapply(recursive_ids, x, + paste(parent, names(x), + sep = if (identical(parent, character(0))) "" else "$" + ), + SIMPLIFY = FALSE, USE.NAMES = FALSE + )) + } + + + spec_id_list <- recursive_ids(specs) + + list( + specs = specs, + spec_id_list = spec_id_list, + add_spec = function(desc, spec, spec_id) { + if (missing(spec_id)) { + if (!is.character(spec) || length(spec) == 0) stop("spec must be a non-empty character vector") + s_spec <- substitute(spec) + if (s_spec[[1]] == "c") { + spec_id <- sapply(s_spec[2:length(s_spec)], identity) + } else { + spec_id <- list(s_spec) # Otherwise the posterior vapply iterates over the expression + } + + spec_id_chr <- vapply(spec_id, function(x) { + sub("^[^$]*\\$", "", deparse(x)) + }, FUN.VALUE = character(1)) + + if (!all(spec_id_chr %in% spec_id_list)) { + stop("At least one spec is not declared in the spec list") + } # This should be covered by pack of constants but just in case + } else { + spec_id_chr <- spec_id + } + paste0(desc, "__spec_ids{", paste0(spec_id_chr, collapse = ";"), "}") + }, + get_spec = function(test, specs) { + spec_ids <- utils::strcapture( + pattern = "__spec_ids\\{(.*)\\}", + x = test, + proto = list(spec = character()) + )[["spec"]] + + spec_ids <- strsplit(spec_ids, split = ";") + + specs_and_id <- list() + + for (idx in seq_along(spec_ids)){ + ids <- spec_ids[[idx]] + if (all(!is.na(ids))) { + this_specs <- list() + for (sub_idx in seq_along(ids)) { + id <- ids[[sub_idx]] + this_specs[[sub_idx]] <- eval(str2expression(paste0("specs$", id))) + } + specs_and_id[[idx]] <- list( + spec_id = ids, + spec = this_specs + ) + } else { + specs_and_id[[idx]] <- list( + spec_id = NULL, + spec = NULL + ) + } + } + specs_and_id + } + + + ) +}) + +# nolint end cyclocomp_linter \ No newline at end of file diff --git a/inst/validation/val_report.Rmd b/inst/validation/val_report.Rmd new file mode 100644 index 0000000..26a97e9 --- /dev/null +++ b/inst/validation/val_report.Rmd @@ -0,0 +1,17 @@ +--- +title: "Quality Control" +output: + html_document: + toc: true + toc_depth: 2 + code_folding: hide +toc-title: "----\nIndex" + +params: + package: NULL + tests: NULL + version: NULL +--- + +```{r, child = "val_report_child.Rmd"} +``` diff --git a/inst/validation/val_report_child.Rmd b/inst/validation/val_report_child.Rmd new file mode 100644 index 0000000..bf7f1bc --- /dev/null +++ b/inst/validation/val_report_child.Rmd @@ -0,0 +1,209 @@ + + + +```{r setup, message = FALSE} +# Import vdoc functions ---- +vdoc <- local({ + # ########## + # package_name is used # INSIDE # the sourced file below + # ########## + package_name <- params[["package"]] + utils_file_path <- system.file("validation", "utils-validation.R", package = package_name, mustWork = TRUE) + source(utils_file_path, local = TRUE)[["value"]] +}) + +# Set required packages ---- +suppressPackageStartupMessages(stopifnot(requireNamespace("DT"))) +suppressPackageStartupMessages(stopifnot(requireNamespace("devtools"))) + +# Parse tests ---- + +tests <- as.data.frame(params[["tests"]]) +tests[["validation_data"]] <- vdoc[["get_spec"]](tests[["test"]], vdoc[["specs"]]) +tests[["spec_id"]] <- sapply(tests[["validation_data"]], function(x) x[["spec_id"]]) +tests[["spec"]] <- sapply(tests[["validation_data"]], function(x) x[["spec"]]) +tests[["spec_id_paste"]] <- vapply(tests[["spec_id"]], function(x) paste(x, collapse = "\n"), FUN.VALUE = character(1)) +tests[["spec_paste"]] <- vapply(tests[["spec"]], function(x) paste(x, collapse = "\n"), FUN.VALUE = character(1)) +tests[["desc"]] <- paste0("(#", seq_len(nrow(tests)), "): ", tests[["test"]]) +tests[["with_spec"]] <- vapply(tests[["spec_id"]], Negate(is.null), FUN.VALUE = logical(1)) + +spec_tests <- tests[tests[["with_spec"]], ] +no_spec_tests <- tests[!tests[["with_spec"]], ] + +declared_spec <- vdoc[["spec_id_list"]] +tested_spec <- unique(unlist(tests[["spec_id"]])) +uncovered_spec <- declared_spec[!declared_spec %in% tested_spec] +undeclared_spec <- tested_spec[!tested_spec %in% declared_spec] + +spec_tests[["are_declared"]] <- sapply(spec_tests[["spec_id"]], function(x) all(x %in% declared_spec)) + +# Count tests in the different categories ---- +mask_failed <- !!spec_tests[["failed"]] | spec_tests[["error"]] +mask_skipped <- !!spec_tests[["skipped"]] +mask_declared <- spec_tests[["are_declared"]] +n_pass_dec <- sum(!mask_failed & !mask_skipped & mask_declared) +n_fail_dec <- sum(mask_failed & mask_declared) +n_skip_dec <- sum(mask_skipped & mask_declared) +n_uncov <- length(uncovered_spec) +n_undec <- sum(!mask_declared) + +render_spec_table <- function(t) { + t <- t[trac_matrix_col] + colnames(t) <- names(trac_matrix_col) + t <- t[order(t[["Spec ID"]]), ] + DT::datatable(t, options = list(dom = "ltp"), filter = list(position = "top")) +} + +data_frame_by_row <- function(colnames, data) { + n <- length(data) + n_cols <- length(colnames) + stopifnot(n %% n_cols == 0) + columns <- vector("list", length = n_cols) + for (i in 1:n_cols) columns[[i]] <- unlist(data[seq(i, n, n_cols)]) + do.call(data.frame, setNames(columns, colnames)) +} + +# Select columns to be included in the tables ---- +trac_matrix_col <- c("Spec ID" = "spec_id_paste", "Spec" = "spec_paste", "Test Desc" = "desc", "File" = "file") + +# Check that validation passes and set title ---- +VALIDATION_PASSED <- n_fail_dec == 0 && n_uncov == 0 && n_undec == 0 && n_uncov == 0 # nolint + +result_symbol <- if (VALIDATION_PASSED) "\U02705" else "\U274C" +title <- paste(result_symbol, params[["package"]], params[["version"]]) +``` + +## `r title` +Date: `r format(Sys.time(), "%Y-%b-%d %H:%M:%S")` + +The following document generates a report for R packages, to satisfy the criteria of a "Released" status under the **Non-GxP** project. The QC report contains the following information: + +- **Specifications (specs):** These can be attached to every test that the user adds. +- **Traceability matrix:** Contains test cases with passed, failed, or skipped expectations. +- **Uncovered or undeclared specs** +- **Session Info and System Configuration** + +::: {.infobox .warning} +Please be advised that the QC report generated for this module does not imply validation according to any other GxP criteria. +The QC report only satisfies our internally developed quality checks for non-GxP criteria. +For clinical reporting purposes, it is essential to note that any outputs generated using this module must be checked and verified within a validated system that adheres to the appropriate GxP guidelines. +::: + +---- +# Traceability matrix + +In this traceability matrix only those tests that point to an specification are included. + +Test cases can contain several expectations a test is considered: + + - **passed** if all expectations in the test pass. + + - **failed** if at least one expectation in the test fails. + + - **skipped** if at least one expectation in the test is skipped. + +A test can be both **failed** and **skipped**. + +## Summary + +```{r summary} +data_frame_by_row( + colnames = c("Spec Exists", "Test", "Count", "color"), + data = list( + "Yes", "Pass", n_pass_dec, "white", + "Yes", "Failed", n_fail_dec, if (n_fail_dec > 0) "red" else "green", + "Yes", "Skipped", n_skip_dec, if (n_skip_dec > 0) "red" else "green", + "Yes", "No Test", n_uncov, if (n_uncov > 0) "red" else "green", + "No", "NA", n_undec, if (n_undec > 0) "red" else "green" + ) +) |> + DT::datatable( + rownames = FALSE, + options = list(columnDefs = list(list(visible = FALSE, targets = c(3))), dom = "tp"), + filter = list(position = "top") + ) |> + DT::formatStyle( + c("Count"), + valueColumns = "color", + backgroundColor = DT::JS("value") + ) +``` + +## Passed tests + +```{r passed_test} +render_spec_table(spec_tests[!mask_failed & !mask_skipped & mask_declared, ]) +``` + +## Failed tests + +```{r failed_test} +render_spec_table(spec_tests[mask_failed & mask_declared, ]) +``` + +## Skipped tests + +```{r skipped_test} +render_spec_table(spec_tests[mask_skipped & mask_declared, ]) +``` + +## Uncovered specifications + +```{r uncovered_spec, echo=FALSE} +data.frame("Uncovered Specifications" = uncovered_spec) |> + DT::datatable( + options = list(dom = "ltp"), + filter = list(position = "top") + ) +``` + +## Undeclared specifications + +This should always be empty, as non existant specs are controlled during test execution. + +```{r undeclared_spec, echo=FALSE, results = "asis"} +render_spec_table(spec_tests[!mask_declared, ]) +``` + +# Session Info and System Configuration + +```{r system_conf} +devtools::session_info() +``` + +# List of specifications +```{r spec_list} +j <- vapply( + vdoc[["spec_id_list"]], + function(x) { + eval( + str2expression( + paste0("vdoc[[\"specs\"]]$", x) + ) + ) + }, + FUN.VALUE = character(1) +) |> + gsub("\n", "
", x = _, fixed = TRUE) + +data.frame(spec_id = names(j), spec = j) |> + DT::datatable( + rownames = FALSE, + options = list( + dom = "ltp" + ), + filter = list(position = "top"), + escape = FALSE + ) +``` diff --git a/man/cash-.pack_of_constants.Rd b/man/cash-.pack_of_constants.Rd new file mode 100644 index 0000000..0bb5f82 --- /dev/null +++ b/man/cash-.pack_of_constants.Rd @@ -0,0 +1,20 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/aaa_preface.R +\name{$.pack_of_constants} +\alias{$.pack_of_constants} +\title{Extract constant from pack} +\usage{ +\method{$}{pack_of_constants}(pack, name) +} +\arguments{ +\item{pack}{pack_of_constants} + +\item{name}{target constant + +This function differs from the base list extraction method in that it avoids partial matching of keys and throws +an error if the looked-for constant is not contained within the pack.} +} +\description{ +Extract constant from pack +} +\keyword{internal} diff --git a/man/create_ae_cm_plot.Rd b/man/create_ae_cm_plot.Rd new file mode 100644 index 0000000..4fd38e3 --- /dev/null +++ b/man/create_ae_cm_plot.Rd @@ -0,0 +1,30 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/create_plots.R +\name{create_ae_cm_plot} +\alias{create_ae_cm_plot} +\title{Function to create ae or cm plot} +\usage{ +create_ae_cm_plot( + data, + x_limits, + palette, + sl_info, + vline_vars, + vline_day_numbers, + ref_date +) +} +\arguments{ +\item{data}{Data frame containing the data for the plot} + +\item{palette}{Named vector that contains the colors that are used in the plot} + +\item{limits}{Vector that contains the limits of the plot} +} +\value{ +A ggplot2 object +} +\description{ +Function to create ae or cm plot +} +\keyword{internal} diff --git a/man/create_lb_vs_plot.Rd b/man/create_lb_vs_plot.Rd new file mode 100644 index 0000000..8cf6c1a --- /dev/null +++ b/man/create_lb_vs_plot.Rd @@ -0,0 +1,50 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/create_plots.R +\name{create_lb_vs_plot} +\alias{create_lb_vs_plot} +\title{Function to create lab or vital sign plot} +\usage{ +create_lb_vs_plot( + data, + date, + val, + low_limit, + high_limit, + param, + summary_stats, + x_limits, + palette, + sl_info, + vline_vars, + vline_day_numbers, + ref_date +) +} +\arguments{ +\item{data}{Data frame containing the data for the plot} + +\item{val}{Character name of the variable that contains analyze value} + +\item{low_limit}{Character name of the variable that contains the values of the low limit of the normal range} + +\item{high_limit}{Character name of the variable that contains the values of the high limit of the normal range} + +\item{summary_stats}{Character name of the variable that contains the values of the summary statistic} + +\item{lb_selected_params}{Vector containing the values of the selected parameters} + +\item{day}{Character name of the variable that contains the analyze day} + +\item{params}{Character name of the variable that contains the values of the analyze parameters} + +\item{analysis_indicator}{Character name of the variable that contains the values analysis indicator} + +\item{limits}{Vector that contains the limits of the plot} +} +\value{ +A ggplot2 object +} +\description{ +Function to create lab or vital sign plot +} +\keyword{internal} diff --git a/man/create_vlines.Rd b/man/create_vlines.Rd new file mode 100644 index 0000000..f68341c --- /dev/null +++ b/man/create_vlines.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/create_plots.R +\name{create_vlines} +\alias{create_vlines} +\title{Add vertical lines to plot} +\usage{ +create_vlines(plot, plot_data, vline_vars, vline_day_numbers) +} +\arguments{ +\item{plot}{A ggplot2 object} + +\item{plot_data}{Data of the plot} + +\item{vline_vars}{A list used to define the label and position of dashed lines in the plots} +} +\value{ +A ggplot2 object +} +\description{ +Add vertical lines to plot +} +\keyword{internal} diff --git a/man/explorer_app.Rd b/man/explorer_app.Rd new file mode 100644 index 0000000..42f7945 --- /dev/null +++ b/man/explorer_app.Rd @@ -0,0 +1,19 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/dressing_room.R +\name{explorer_app} +\alias{explorer_app} +\title{Interactive demo/configuration tool for \code{\link[=mod_patient_profile]{mod_patient_profile()}}} +\usage{ +explorer_app(datasets = NULL) +} +\arguments{ +\item{datasets}{\verb{[list(data.frame(n))]} (optional) Datasets available to the module. One of them should be a +demographic subject-level dataset and the rest should be visit-dependent datasets. If not provided, the UI offers a +file input selector that is functionally equivalent.} +} +\description{ +Launch an interactive configuration app for \code{\link[=mod_patient_profile]{mod_patient_profile()}}. This application guides the user through the +configuration of the module, offering an experimental point-and-click interface to the module API. Help is accessible +by hovering over any of the provided parameters. \cr +To try it using demo data, run \code{dv.papo::explorer_app(dv.papo:::prep_safety_data())} in your R prompt. +} diff --git a/man/figures/demo.png b/man/figures/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..649ccbbe33aec71427b2ee8b7a318e5ae53c52f9 GIT binary patch literal 105707 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%0A%5cKcavzM}pG%l<^e)>a?s-oo)%D5b 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 CQOgJb literal 0 HcmV?d00001 diff --git a/man/figures/patient_profile_app.png b/man/figures/patient_profile_app.png new file mode 100644 index 0000000000000000000000000000000000000000..0f3c9a8ac4b73778070e98437c0a913cbf49525a GIT binary patch literal 79563 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 SW5^Ds8{9OxQF86!^Zy1l$W{RW literal 0 HcmV?d00001 diff --git a/man/get_labels.Rd b/man/get_labels.Rd new file mode 100644 index 0000000..1e8b87d --- /dev/null +++ b/man/get_labels.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data_prep.R +\name{get_labels} +\alias{get_labels} +\title{This function will return corresponding labels in a dataset.} +\usage{ +get_labels(dataset, col_names = NULL, keep_as_original = FALSE) +} +\arguments{ +\item{dataset}{Dataset to get labels from.} + +\item{col_names}{Vector of character names of the columns in the dataset.} + +\item{keep_as_original}{Logical TRUE or FALSE: If TRUE, the corresponding column with +no label will return column name, else return NA. +If not assigned, it will return all labels of the the dataset. Otherwise, +only labels of corresponding columns will be returned.} +} +\value{ +Vector containing the labels of the dataset +} +\description{ +This function will return corresponding labels in a dataset. +} +\keyword{internal} diff --git a/man/mock_patient_profile_UI.Rd b/man/mock_patient_profile_UI.Rd new file mode 100644 index 0000000..59471eb --- /dev/null +++ b/man/mock_patient_profile_UI.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mock_patient_profile.R +\name{mock_patient_profile_UI} +\alias{mock_patient_profile_UI} +\title{Mock UI for papo module} +\usage{ +mock_patient_profile_UI(request) +} +\arguments{ +\item{id}{A unique identifier.} +} +\value{ +Shiny UI for the papomodule. +} +\description{ +Mock UI for papo module +} +\keyword{internal} diff --git a/man/mock_patient_profile_app.Rd b/man/mock_patient_profile_app.Rd new file mode 100644 index 0000000..038c27e --- /dev/null +++ b/man/mock_patient_profile_app.Rd @@ -0,0 +1,13 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mock_patient_profile.R +\name{mock_patient_profile_app} +\alias{mock_patient_profile_app} +\title{Run papo mock} +\usage{ +mock_patient_profile_app(auto_update_query_string = FALSE) +} +\description{ +\code{mock_patient_profile_app()} runs the \pkg{dv.papo} module +with dummy data. +} +\keyword{internal} diff --git a/man/mock_patient_profile_server.Rd b/man/mock_patient_profile_server.Rd new file mode 100644 index 0000000..5ef7cf2 --- /dev/null +++ b/man/mock_patient_profile_server.Rd @@ -0,0 +1,15 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mock_patient_profile.R +\name{mock_patient_profile_server} +\alias{mock_patient_profile_server} +\title{Mock server for papo module} +\usage{ +mock_patient_profile_server(input, output, session) +} +\arguments{ +\item{input, output, session}{Internal parameters for shiny.} +} +\description{ +Uses adsl, adae, and adcm data of roche dataset. +} +\keyword{internal} diff --git a/man/mock_with_mm_app.Rd b/man/mock_with_mm_app.Rd new file mode 100644 index 0000000..43bf4ef --- /dev/null +++ b/man/mock_with_mm_app.Rd @@ -0,0 +1,13 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mock_with_mm.R +\name{mock_with_mm_app} +\alias{mock_with_mm_app} +\title{Run an example for Patient profile integrated in the module manager} +\usage{ +mock_with_mm_app() +} +\description{ +Launches an example app that shows a patient profile module integrated in the +module manager surface. Displays data from the \pkg{safetyData} package. +} +\keyword{internal} diff --git a/man/mod_patient_profile.Rd b/man/mod_patient_profile.Rd new file mode 100644 index 0000000..cfb8573 --- /dev/null +++ b/man/mod_patient_profile.Rd @@ -0,0 +1,280 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mod_patient_profile.R +\name{mod_patient_profile} +\alias{mod_patient_profile} +\title{Patient Profile Module} +\usage{ +mod_patient_profile( + module_id = "", + subject_level_dataset_name = NULL, + subjid_var = NULL, + sender_ids = NULL, + summary = NULL, + listings = NULL, + plots = NULL +) +} +\arguments{ +\item{module_id}{\verb{[character]} +Unique Shiny module identifier.} + +\item{subject_level_dataset_name}{\verb{[character]} +Subject-level dataset name.} + +\item{subjid_var}{\verb{[character]} +Unique subject identifier column.} + +\item{sender_ids}{\verb{[character(n)]} (optional) +Identifiers of modules allowed to request the display of target patient IDs.} + +\item{summary}{\verb{[list]} (optional) +Subject-level summary section. +Composed of: +\itemize{ +\item vars +\verb{[character(n)]} +Values to display in the summary section. +Indexes into dataset \code{subject_level_dataset_name}. +\item column_count +\verb{[integer]} +Column count for the summary section. +}} + +\item{listings}{\verb{[list(n)]} (optional) +Listings section. +Composed of: +\itemize{ +\item dataset +\verb{[character]} +Dataset name. +\item default_vars +\verb{[character(n)]} (optional) +Default columns to display. If not specified, the first six columns are +selected by default. +Indexes into dataset \code{dataset}. +}} + +\item{plots}{\verb{[list]} (optional) +Plot section. +Composed of: +\itemize{ +\item timeline_info +\verb{[list]} +Start and end study dates. +Composed of: +\itemize{ +\item icf_date +\verb{[character]} (optional) +Informed Consent Form signing Date. +Indexes into dataset \code{subject_level_dataset_name}. Expects \verb{[Date|POSIXt]} +values. +\item trt_start_date +\verb{[character]} +Treatment Start Date, used also as Day 1 Reference Date. +Indexes into dataset \code{subject_level_dataset_name}. Expects \verb{[Date|POSIXt]} +values. +\item trt_end_date +\verb{[character]} +Treatment End Date. +Indexes into dataset \code{subject_level_dataset_name}. Expects \verb{[Date|POSIXt]} +values. +\item part_end_date +\verb{[character]} (optional) +Participation End Date. +Indexes into dataset \code{subject_level_dataset_name}. Expects \verb{[Date|POSIXt]} +values. +} +\item range_plots +\verb{[list(n)]} +Plots for range-like events (adverse events, concomitant medications, ...). +Composed of: +\itemize{ +\item dataset +\verb{[character]} +Dataset name. +\item vars +\verb{[list]} +Variables of interest for the event. +Composed of: +\itemize{ +\item start_date +\verb{[character]} +Start date. +Indexes into dataset \code{dataset}. Expects \verb{[Date|POSIXt]} values. +\item end_date +\verb{[character]} +End date. +Indexes into dataset \code{dataset}. Expects \verb{[Date|POSIXt]} values. +\item decode +\verb{[character]} +Descriptive event label. +Indexes into dataset \code{dataset}. Expects \verb{[character|factor]} values. +\item grading +\verb{[character]} (optional) +Degree of the event, used for color-coding the plot. +Indexes into dataset \code{dataset}. Expects \verb{[character|factor]} values. +\item serious_ae +\verb{[character]} (optional) +Marker of event seriousness, usually reserved for adverse event datasets. +Indexes into dataset \code{dataset}. Expects \verb{[logical|"Y"/"N"]} values. +} +\item tooltip +\verb{[character(n)]} +Block of text to display as hover information over the left edge of each range. +The names of this list are included as literal text and honor three basic HTML +formatting elements: \verb{}, \verb{}, \verb{
}). The columns the values refer to are +populated with the value on the dataset relevant to any given row. +Indexes into dataset \code{dataset}. +} +\item value_plots +\verb{[list(n)]} +Plots for value-like (lab measurements, vital signs, ...) traces. +Composed of: +\itemize{ +\item dataset +\verb{[character]} +Dataset name. +\item vars +\verb{[list]} +Variables of interest for the trace. +Composed of: +\itemize{ +\item analysis_param +\verb{[character]} +Parameter. +Indexes into dataset \code{dataset}. Expects \verb{[character|factor]} values. +\item analysis_val +\verb{[character]} +Value. +Indexes into dataset \code{dataset}. Expects \verb{[numeric]} values. +\item analysis_date +\verb{[character]} +Date. +Indexes into dataset \code{dataset}. Expects \verb{[Date|POSIXt]} values. +\item analysis_indicator +\verb{[character]} (optional) +Analysis reference range indicator. +Indexes into dataset \code{dataset}. Expects \verb{[character|factor]} values. +\item range_low_limit +\verb{[character]} (optional) +Lower limit of the reference range. +Indexes into dataset \code{dataset}. Expects \verb{[numeric]} values. +\item range_high_limit +\verb{[character]} (optional) +Upper limit of the reference range. +Indexes into dataset \code{dataset}. Expects \verb{[numeric]} values. +\item summary_stats +\verb{[character]} (optional) +Additional value column for summary statistics. +Indexes into dataset \code{dataset}. Expects \verb{[numeric]} values. +} +\item tooltip +\verb{[character(n)]} +Block of text to display as hover information over each point of the trace. The +names of this list are included as literal text and honor three basic HTML +formatting elements: \verb{}, \verb{}, \verb{
}). The columns the values refer to are +populated with the value on the dataset relevant to any given row. +Indexes into dataset \code{dataset}. +} +\item vline_vars +\verb{[character(n)]} +Place vertical dashed lines on days indicated by this dataset columns. +Indexes into dataset \code{subject_level_dataset_name}. Expects +\verb{[integer|Date|POSIXt]} values. +\item vline_day_numbers +\verb{[integer(n)]} (optional) +Place vertical dashed lines on days indicated by this parameter. +Represents a CDISC (non-zero) Study Day. +\item palette +\verb{[character(n)]} (optional) +If a name on this list matches the text on a plot element, the associated color +will be applied to that element. This mapping takes precedence over the +built-in palette. +Contains either an HTML (#xxxxxx) or an R color. +}} +} +\value{ +A list composed of the following elements: +\itemize{ +\item{\code{ui}}: Shiny UI function. +\item{\code{server}}: Shiny server function. +\item{\code{module_id}}: Shiny unique identifier. +} +} +\description{ +\code{mod_patient_profile} is a DaVinci Shiny module that displays patient information on a subject-level basis. It +consists of three sections: summary, listings and plots. +\itemize{ +\item The \code{summary} section shows visit-independent demographic information. +\item The \code{listings} section offers listings for visit-dependent information. +\item The \code{plots} section displays charts for events that happen over a span of time (adverse events, concomitant +medications, ...) or line plots of point-like events (laboratory values, vital sign measurements). +}\if{html}{\out{ +
+Show/hide usage example +
+
+What follows is a sample call to the mod_patient_profile function. +See the
main article of this package for a tutorial on how to parameterize it. +
+dv.papo::mod_patient_profile(
+  module_id = "papo",
+  subject_level_dataset_name = "adsl",
+  subjid_var = "USUBJID",
+  summary = list(
+    vars = c("SUBJID", "SITEID", "ARM", "TRTSDT", "TRTEDT", "AGE", "RACE", "SEX", "BMIBL"),
+    column_count = 3L
+  ),
+  listings = list(
+    "Concomitant Medication" = list(
+      dataset = "cm"
+    ),
+    "Adverse Events" = list(
+      dataset = "adae",
+      default_vars = c("ASTDT", "ASTDY", "AENDT", "AENDY", "AEDECOD", "AESEV")
+    )
+  ),
+  plots = list(
+    timeline_info = c(trt_start_date = "TRTSDT", trt_end_date = "TRTEDT"),
+    range_plots = list(
+      "Concomitant Medication" = list(
+        dataset = "cm",
+        vars = c(
+          start_date = "CMSTDT", end_date = "CMENDT",
+          decode = "CMDECOD", grading = "CMDECOD"
+        ),
+        tooltip = c()
+      ),
+      "Adverse Events" = list(
+        dataset = "adae",
+        vars = c(
+          start_date = "ASTDT", end_date = "AENDT", decode = "AEDECOD",
+          grading = "AESEV", serious_ae = "AESER"
+        ),
+        tooltip = c("AE Start Day: " = "ASTDY", "AE End Day: " = "AENDY")
+      )
+    ),
+    value_plots = list(
+      "Lab Values" = list(
+        dataset = "lb",
+        vars = c(
+          analysis_param = "PARAM", analysis_val = "AVAL", analysis_date = "ADT",
+          analysis_indicator = "LBNRIND", range_low_limit = "A1LO", range_high_limit = "A1HI"
+        ),
+        tooltip = c()
+      )
+    ),
+    vline_vars = c(
+      "Informed Consent Date" = "RFICDT"
+    )
+  )
+)
+
+
+
+
+}} +} +\seealso{ +\code{\link[=mod_patient_profile_UI]{mod_patient_profile_UI()}}, \code{\link[=mod_patient_profile_server]{mod_patient_profile_server()}} +} diff --git a/man/mod_patient_profile_UI.Rd b/man/mod_patient_profile_UI.Rd new file mode 100644 index 0000000..6571d86 --- /dev/null +++ b/man/mod_patient_profile_UI.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mod_patient_profile.R +\name{mod_patient_profile_UI} +\alias{mod_patient_profile_UI} +\title{Patient Profile Module UI} +\usage{ +mod_patient_profile_UI(id) +} +\arguments{ +\item{id}{\verb{[character]} Unique shiny ID. Must match the ID provided to \code{\link[=mod_patient_profile_server]{mod_patient_profile_server()}}.} +} +\value{ +Shiny UI. +} +\description{ +(For use outside of the DaVinci framework)\cr +Places the Patient Profile module UI at the call site of this function. A matching call to \code{\link[=mod_patient_profile_server]{mod_patient_profile_server()}} +is necessary.\cr +} +\seealso{ +\code{\link[=mod_patient_profile]{mod_patient_profile()}} and \code{\link[=mod_patient_profile_server]{mod_patient_profile_server()}} +} diff --git a/man/mod_patient_profile_params.Rd b/man/mod_patient_profile_params.Rd new file mode 100644 index 0000000..fc1902e --- /dev/null +++ b/man/mod_patient_profile_params.Rd @@ -0,0 +1,202 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mod_signature.R +\name{mod_patient_profile_params} +\alias{mod_patient_profile_params} +\title{Dummy function to extract parameter documentation from mod_patient_profile_API} +\usage{ +mod_patient_profile_params( + module_id, + subject_level_dataset_name, + subjid_var, + sender_ids, + summary, + listings, + plots +) +} +\arguments{ +\item{module_id}{\verb{[character]} +Unique Shiny module identifier.} + +\item{subject_level_dataset_name}{\verb{[character]} +Subject-level dataset name.} + +\item{subjid_var}{\verb{[character]} +Unique subject identifier column.} + +\item{sender_ids}{\verb{[character(n)]} (optional) +Identifiers of modules allowed to request the display of target patient IDs.} + +\item{summary}{\verb{[list]} (optional) +Subject-level summary section. +Composed of: +\itemize{ +\item vars +\verb{[character(n)]} +Values to display in the summary section. +Indexes into dataset \code{subject_level_dataset_name}. +\item column_count +\verb{[integer]} +Column count for the summary section. +}} + +\item{listings}{\verb{[list(n)]} (optional) +Listings section. +Composed of: +\itemize{ +\item dataset +\verb{[character]} +Dataset name. +\item default_vars +\verb{[character(n)]} (optional) +Default columns to display. If not specified, the first six columns are +selected by default. +Indexes into dataset \code{dataset}. +}} + +\item{plots}{\verb{[list]} (optional) +Plot section. +Composed of: +\itemize{ +\item timeline_info +\verb{[list]} +Start and end study dates. +Composed of: +\itemize{ +\item icf_date +\verb{[character]} (optional) +Informed Consent Form signing Date. +Indexes into dataset \code{subject_level_dataset_name}. Expects \verb{[Date|POSIXt]} +values. +\item trt_start_date +\verb{[character]} +Treatment Start Date, used also as Day 1 Reference Date. +Indexes into dataset \code{subject_level_dataset_name}. Expects \verb{[Date|POSIXt]} +values. +\item trt_end_date +\verb{[character]} +Treatment End Date. +Indexes into dataset \code{subject_level_dataset_name}. Expects \verb{[Date|POSIXt]} +values. +\item part_end_date +\verb{[character]} (optional) +Participation End Date. +Indexes into dataset \code{subject_level_dataset_name}. Expects \verb{[Date|POSIXt]} +values. +} +\item range_plots +\verb{[list(n)]} +Plots for range-like events (adverse events, concomitant medications, ...). +Composed of: +\itemize{ +\item dataset +\verb{[character]} +Dataset name. +\item vars +\verb{[list]} +Variables of interest for the event. +Composed of: +\itemize{ +\item start_date +\verb{[character]} +Start date. +Indexes into dataset \code{dataset}. Expects \verb{[Date|POSIXt]} values. +\item end_date +\verb{[character]} +End date. +Indexes into dataset \code{dataset}. Expects \verb{[Date|POSIXt]} values. +\item decode +\verb{[character]} +Descriptive event label. +Indexes into dataset \code{dataset}. Expects \verb{[character|factor]} values. +\item grading +\verb{[character]} (optional) +Degree of the event, used for color-coding the plot. +Indexes into dataset \code{dataset}. Expects \verb{[character|factor]} values. +\item serious_ae +\verb{[character]} (optional) +Marker of event seriousness, usually reserved for adverse event datasets. +Indexes into dataset \code{dataset}. Expects \verb{[logical|"Y"/"N"]} values. +} +\item tooltip +\verb{[character(n)]} +Block of text to display as hover information over the left edge of each range. +The names of this list are included as literal text and honor three basic HTML +formatting elements: \verb{}, \verb{}, \verb{
}). The columns the values refer to are +populated with the value on the dataset relevant to any given row. +Indexes into dataset \code{dataset}. +} +\item value_plots +\verb{[list(n)]} +Plots for value-like (lab measurements, vital signs, ...) traces. +Composed of: +\itemize{ +\item dataset +\verb{[character]} +Dataset name. +\item vars +\verb{[list]} +Variables of interest for the trace. +Composed of: +\itemize{ +\item analysis_param +\verb{[character]} +Parameter. +Indexes into dataset \code{dataset}. Expects \verb{[character|factor]} values. +\item analysis_val +\verb{[character]} +Value. +Indexes into dataset \code{dataset}. Expects \verb{[numeric]} values. +\item analysis_date +\verb{[character]} +Date. +Indexes into dataset \code{dataset}. Expects \verb{[Date|POSIXt]} values. +\item analysis_indicator +\verb{[character]} (optional) +Analysis reference range indicator. +Indexes into dataset \code{dataset}. Expects \verb{[character|factor]} values. +\item range_low_limit +\verb{[character]} (optional) +Lower limit of the reference range. +Indexes into dataset \code{dataset}. Expects \verb{[numeric]} values. +\item range_high_limit +\verb{[character]} (optional) +Upper limit of the reference range. +Indexes into dataset \code{dataset}. Expects \verb{[numeric]} values. +\item summary_stats +\verb{[character]} (optional) +Additional value column for summary statistics. +Indexes into dataset \code{dataset}. Expects \verb{[numeric]} values. +} +\item tooltip +\verb{[character(n)]} +Block of text to display as hover information over each point of the trace. The +names of this list are included as literal text and honor three basic HTML +formatting elements: \verb{}, \verb{}, \verb{
}). The columns the values refer to are +populated with the value on the dataset relevant to any given row. +Indexes into dataset \code{dataset}. +} +\item vline_vars +\verb{[character(n)]} +Place vertical dashed lines on days indicated by this dataset columns. +Indexes into dataset \code{subject_level_dataset_name}. Expects +\verb{[integer|Date|POSIXt]} values. +\item vline_day_numbers +\verb{[integer(n)]} (optional) +Place vertical dashed lines on days indicated by this parameter. +Represents a CDISC (non-zero) Study Day. +\item palette +\verb{[character(n)]} (optional) +If a name on this list matches the text on a plot element, the associated color +will be applied to that element. This mapping takes precedence over the +built-in palette. +Contains either an HTML (#xxxxxx) or an R color. +}} +} +\value{ +No return value. +} +\description{ +Generated by \code{write_mod_param_help.R}. +} +\keyword{internal} diff --git a/man/mod_patient_profile_server.Rd b/man/mod_patient_profile_server.Rd new file mode 100644 index 0000000..33ea6fe --- /dev/null +++ b/man/mod_patient_profile_server.Rd @@ -0,0 +1,204 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mod_patient_profile.R +\name{mod_patient_profile_server} +\alias{mod_patient_profile_server} +\title{Patient Profile Module server} +\usage{ +mod_patient_profile_server( + id, + subject_level_dataset, + extra_datasets, + subjid_var, + sender_ids, + summary, + listings, + plots +) +} +\arguments{ +\item{id}{\verb{[character]} Unique shiny ID. Must match the ID provided to \code{\link[=mod_patient_profile_UI]{mod_patient_profile_UI()}}.} + +\item{subject_level_dataset}{\verb{[reactive(data.frame)]} Visit-independent subject information.} + +\item{extra_datasets}{\verb{[reactive(data.frame(n))]} Visit-dependent subject datasets.} + +\item{subjid_var}{\verb{[character]} +Unique subject identifier column.} + +\item{sender_ids}{\verb{[character(n)]} (optional) +Identifiers of modules allowed to request the display of target patient IDs.} + +\item{summary}{\verb{[list]} (optional) +Subject-level summary section. +Composed of: +\itemize{ +\item vars +\verb{[character(n)]} +Values to display in the summary section. +Indexes into dataset \code{subject_level_dataset_name}. +\item column_count +\verb{[integer]} +Column count for the summary section. +}} + +\item{listings}{\verb{[list(n)]} (optional) +Listings section. +Composed of: +\itemize{ +\item dataset +\verb{[character]} +Dataset name. +\item default_vars +\verb{[character(n)]} (optional) +Default columns to display. If not specified, the first six columns are +selected by default. +Indexes into dataset \code{dataset}. +}} + +\item{plots}{\verb{[list]} (optional) +Plot section. +Composed of: +\itemize{ +\item timeline_info +\verb{[list]} +Start and end study dates. +Composed of: +\itemize{ +\item icf_date +\verb{[character]} (optional) +Informed Consent Form signing Date. +Indexes into dataset \code{subject_level_dataset_name}. Expects \verb{[Date|POSIXt]} +values. +\item trt_start_date +\verb{[character]} +Treatment Start Date, used also as Day 1 Reference Date. +Indexes into dataset \code{subject_level_dataset_name}. Expects \verb{[Date|POSIXt]} +values. +\item trt_end_date +\verb{[character]} +Treatment End Date. +Indexes into dataset \code{subject_level_dataset_name}. Expects \verb{[Date|POSIXt]} +values. +\item part_end_date +\verb{[character]} (optional) +Participation End Date. +Indexes into dataset \code{subject_level_dataset_name}. Expects \verb{[Date|POSIXt]} +values. +} +\item range_plots +\verb{[list(n)]} +Plots for range-like events (adverse events, concomitant medications, ...). +Composed of: +\itemize{ +\item dataset +\verb{[character]} +Dataset name. +\item vars +\verb{[list]} +Variables of interest for the event. +Composed of: +\itemize{ +\item start_date +\verb{[character]} +Start date. +Indexes into dataset \code{dataset}. Expects \verb{[Date|POSIXt]} values. +\item end_date +\verb{[character]} +End date. +Indexes into dataset \code{dataset}. Expects \verb{[Date|POSIXt]} values. +\item decode +\verb{[character]} +Descriptive event label. +Indexes into dataset \code{dataset}. Expects \verb{[character|factor]} values. +\item grading +\verb{[character]} (optional) +Degree of the event, used for color-coding the plot. +Indexes into dataset \code{dataset}. Expects \verb{[character|factor]} values. +\item serious_ae +\verb{[character]} (optional) +Marker of event seriousness, usually reserved for adverse event datasets. +Indexes into dataset \code{dataset}. Expects \verb{[logical|"Y"/"N"]} values. +} +\item tooltip +\verb{[character(n)]} +Block of text to display as hover information over the left edge of each range. +The names of this list are included as literal text and honor three basic HTML +formatting elements: \verb{}, \verb{}, \verb{
}). The columns the values refer to are +populated with the value on the dataset relevant to any given row. +Indexes into dataset \code{dataset}. +} +\item value_plots +\verb{[list(n)]} +Plots for value-like (lab measurements, vital signs, ...) traces. +Composed of: +\itemize{ +\item dataset +\verb{[character]} +Dataset name. +\item vars +\verb{[list]} +Variables of interest for the trace. +Composed of: +\itemize{ +\item analysis_param +\verb{[character]} +Parameter. +Indexes into dataset \code{dataset}. Expects \verb{[character|factor]} values. +\item analysis_val +\verb{[character]} +Value. +Indexes into dataset \code{dataset}. Expects \verb{[numeric]} values. +\item analysis_date +\verb{[character]} +Date. +Indexes into dataset \code{dataset}. Expects \verb{[Date|POSIXt]} values. +\item analysis_indicator +\verb{[character]} (optional) +Analysis reference range indicator. +Indexes into dataset \code{dataset}. Expects \verb{[character|factor]} values. +\item range_low_limit +\verb{[character]} (optional) +Lower limit of the reference range. +Indexes into dataset \code{dataset}. Expects \verb{[numeric]} values. +\item range_high_limit +\verb{[character]} (optional) +Upper limit of the reference range. +Indexes into dataset \code{dataset}. Expects \verb{[numeric]} values. +\item summary_stats +\verb{[character]} (optional) +Additional value column for summary statistics. +Indexes into dataset \code{dataset}. Expects \verb{[numeric]} values. +} +\item tooltip +\verb{[character(n)]} +Block of text to display as hover information over each point of the trace. The +names of this list are included as literal text and honor three basic HTML +formatting elements: \verb{}, \verb{}, \verb{
}). The columns the values refer to are +populated with the value on the dataset relevant to any given row. +Indexes into dataset \code{dataset}. +} +\item vline_vars +\verb{[character(n)]} +Place vertical dashed lines on days indicated by this dataset columns. +Indexes into dataset \code{subject_level_dataset_name}. Expects +\verb{[integer|Date|POSIXt]} values. +\item vline_day_numbers +\verb{[integer(n)]} (optional) +Place vertical dashed lines on days indicated by this parameter. +Represents a CDISC (non-zero) Study Day. +\item palette +\verb{[character(n)]} (optional) +If a name on this list matches the text on a plot element, the associated color +will be applied to that element. This mapping takes precedence over the +built-in palette. +Contains either an HTML (#xxxxxx) or an R color. +}} +} +\description{ +(For use outside of the DaVinci framework)\cr +Runs the server that populates the UI returned by \code{\link[=mod_patient_profile_UI]{mod_patient_profile_UI()}}.\cr +Requires a matching call to that function. +} +\seealso{ +\code{\link[=mod_patient_profile]{mod_patient_profile()}} and \code{\link[=mod_patient_profile_UI]{mod_patient_profile_UI()}} +} diff --git a/man/pack_of_constants.Rd b/man/pack_of_constants.Rd new file mode 100644 index 0000000..1db999e --- /dev/null +++ b/man/pack_of_constants.Rd @@ -0,0 +1,46 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/aaa_preface.R +\name{pack_of_constants} +\alias{pack_of_constants} +\title{Build a collection of named constants} +\usage{ +pack_of_constants(...) +} +\arguments{ +\item{...}{Named parameters to be collected as constants} +} +\description{ +Build a collection of named constants +} +\details{ +Shiny uses strings as IDs to link UI and server elements. E.g: +foo_UI(id = ns("foo")) ... +foo_server(id = "foo") + +This pattern makes it easy for programmers to fall on the trap of modifying one instance of the string literal "foo" +without modifying the rest and be unaware of the problem until a bug is hit. It's also easy to mistakes uses of "foo" +as an identifier from other uses (text labels, ...) when, as it's often the case, the parameter is not explicitly +named. +One easy fix consists in using global variables instead of plain string literals. In the case of the previous +example, that would mean: +ID_FOO <- "foo" +foo_UI(ns(ID_FOO)) ... +foo_server(ID_FOO) + +That simple addition makes the purpose of ID_FOO clear and also fails gracefully when not all ID_FOO instances are +updated synchronously along a codebase. It has the drawback of polluting the global namespace with identifier +variables. That's easily solved by creating a container of constants, which is the purpose of this pack_of_constants +alias. +ID <- pack_of_constants(FOO = "foo", BAR = "bar") +ID$FOO +"foo" +ID$BA +Error in \verb{$.pack_of_constants}(ID, BA) : +Pack of constants "ID" does not contain "BA" + +The pack of constants is a plain named list that enforces that all elements have unique, non-null names. +It is tagged as an S3 object to override its extraction operators. + +The use of checkmate is unnecessary, but it's a Good Library(TM) and your module should rely on it anyways +} +\keyword{internal} diff --git a/man/patient_info_UI.Rd b/man/patient_info_UI.Rd new file mode 100644 index 0000000..37ce18f --- /dev/null +++ b/man/patient_info_UI.Rd @@ -0,0 +1,19 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mod_patient_info.R +\name{patient_info_UI} +\alias{patient_info_UI} +\title{Create user interface for the patient information shiny module of \pkg{dv.papo}} +\usage{ +patient_info_UI(id) +} +\arguments{ +\item{id}{A unique ID string to create a namespace. Must match the ID of +\code{patient_info_server()}.} +} +\value{ +A shiny \code{uiOutput} element. +} +\description{ +Create user interface for the patient information shiny module of \pkg{dv.papo} +} +\keyword{internal} diff --git a/man/patient_info_server.Rd b/man/patient_info_server.Rd new file mode 100644 index 0000000..da3a093 --- /dev/null +++ b/man/patient_info_server.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mod_patient_info.R +\name{patient_info_server} +\alias{patient_info_server} +\title{Create server for the patient information shiny module of \pkg{dv.papo}} +\usage{ +patient_info_server(id, record, subjid_var, column_count = 3) +} +\arguments{ +\item{id}{A unique ID string to create a namespace. Must match the ID of +\code{patient_info_UI()}.} + +\item{record}{row object of dataframe: row record for patient.} + +\item{subjid_var}{\verb{[character]} +Unique subject identifier column.} + +\item{column_count}{A number indicating how many items should be in one row} +} +\description{ +Create server for the patient information shiny module of \pkg{dv.papo} +} +\keyword{internal} diff --git a/man/patient_listing_UI.Rd b/man/patient_listing_UI.Rd new file mode 100644 index 0000000..beb1e5e --- /dev/null +++ b/man/patient_listing_UI.Rd @@ -0,0 +1,16 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mod_listing.R +\name{patient_listing_UI} +\alias{patient_listing_UI} +\title{Create user interface for patient listings shiny module of \pkg{dv.papo}} +\usage{ +patient_listing_UI(id) +} +\arguments{ +\item{id}{A unique ID string to create a namespace. Must match the ID of +\code{patient_plot_server()}.} +} +\description{ +Create user interface for patient listings shiny module of \pkg{dv.papo} +} +\keyword{internal} diff --git a/man/patient_listing_server.Rd b/man/patient_listing_server.Rd new file mode 100644 index 0000000..8833e2d --- /dev/null +++ b/man/patient_listing_server.Rd @@ -0,0 +1,34 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mod_listing.R +\name{patient_listing_server} +\alias{patient_listing_server} +\title{Create server for patient listings shiny module of \pkg{dv.papo}} +\usage{ +patient_listing_server(id, data_list, key_value, listings) +} +\arguments{ +\item{id}{A unique ID string to create a namespace. Must match the ID of +\code{patient_listing_UI()}.} + +\item{data_list}{List of data frames containing data for each listing of selected patient.} + +\item{key_value}{Character: Value of selected patient} + +\item{listings}{\verb{[list(n)]} (optional) +Listings section. +Composed of: +\itemize{ +\item dataset +\verb{[character]} +Dataset name. +\item default_vars +\verb{[character(n)]} (optional) +Default columns to display. If not specified, the first six columns are +selected by default. +Indexes into dataset \code{dataset}. +}} +} +\description{ +Create server for patient listings shiny module of \pkg{dv.papo} +} +\keyword{internal} diff --git a/man/patient_plot_UI.Rd b/man/patient_plot_UI.Rd new file mode 100644 index 0000000..4ccbbcc --- /dev/null +++ b/man/patient_plot_UI.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mod_plots.R +\name{patient_plot_UI} +\alias{patient_plot_UI} +\title{Create user interface for patient plot shiny module of \pkg{dv.papo}} +\usage{ +patient_plot_UI(id) +} +\arguments{ +\item{id}{A unique ID string to create a namespace. Must match the ID of +\code{patient_plot_server()}.} + +\item{title}{character: Title of plot module} +} +\description{ +Create user interface for patient plot shiny module of \pkg{dv.papo} +} +\keyword{internal} diff --git a/man/patient_plot_server.Rd b/man/patient_plot_server.Rd new file mode 100644 index 0000000..3edd36d --- /dev/null +++ b/man/patient_plot_server.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mod_plots.R +\name{patient_plot_server} +\alias{patient_plot_server} +\title{Create server for patient plot shiny module of \pkg{dv.papo}} +\usage{ +patient_plot_server( + id, + subject_var, + subject_level_dataset, + timeline_info, + extra_datasets, + range_plots, + value_plots, + vline_vars, + vline_day_numbers, + palette +) +} +\description{ +TODO: Document params (inherit them) +} +\keyword{internal} diff --git a/man/prep_safety_data.Rd b/man/prep_safety_data.Rd new file mode 100644 index 0000000..50a58c4 --- /dev/null +++ b/man/prep_safety_data.Rd @@ -0,0 +1,20 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/prep_safety_data.R +\name{prep_safety_data} +\alias{prep_safety_data} +\title{Prepare safety data} +\usage{ +prep_safety_data(n = 200) +} +\arguments{ +\item{n}{Number of rows to select from the adsl dataset. The first n rows will be +taken. Used to reduce runtime during development.} +} +\value{ +A list of three data frames. +} +\description{ +Modifiy safetyData's adsl, adae, and adcm dummy data for easy use within +\pkg{dv.clinlines}. +} +\keyword{internal} diff --git a/man/pt_info_data_filter.Rd b/man/pt_info_data_filter.Rd new file mode 100644 index 0000000..d2f80de --- /dev/null +++ b/man/pt_info_data_filter.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data_prep.R +\name{pt_info_data_filter} +\alias{pt_info_data_filter} +\title{Filter datasets for patient information section} +\usage{ +pt_info_data_filter(df, subjid_var, columns, selected_key) +} +\arguments{ +\item{df}{TODO} + +\item{subjid_var}{\verb{[character]} +Unique subject identifier column.} + +\item{columns}{TODO} + +\item{selected_key}{TODO} +} +\value{ +A list containing datasets for patient information and plots +} +\description{ +Filter datasets for patient information section +} +\keyword{internal} diff --git a/tests/testthat.R b/tests/testthat.R new file mode 100644 index 0000000..75e5719 --- /dev/null +++ b/tests/testthat.R @@ -0,0 +1,6 @@ +pkg_name <- "dv.papo" + +library(testthat) +library(pkg_name, character.only = TRUE) + +test_check(pkg_name) diff --git a/tests/testthat/apps/misconfigured_app/app.R b/tests/testthat/apps/misconfigured_app/app.R new file mode 100644 index 0000000..c6fac26 --- /dev/null +++ b/tests/testthat/apps/misconfigured_app/app.R @@ -0,0 +1,9 @@ +dataset_list <- list( + "demo" = dv.papo:::prep_safety_data(5) +) + +dv.manager::run_app( + data = dataset_list, + module_list = list("Papo" = dv.papo::mod_patient_profile(module_id = "papo")), + filter_data = "adsl" +) diff --git a/tests/testthat/apps/patient_selector_switching/app.R b/tests/testthat/apps/patient_selector_switching/app.R new file mode 100644 index 0000000..892a0cc --- /dev/null +++ b/tests/testthat/apps/patient_selector_switching/app.R @@ -0,0 +1,129 @@ +dataset_list <- list( + "demo" = dv.papo:::prep_safety_data(5), + "demo2" = dv.papo:::prep_safety_data(10) +) + +module_list <- list( + "Papo" = dv.papo::mod_patient_profile( + module_id = "mock_app", + subjid_var = "USUBJID", + sender_ids = NULL, + subject_level_dataset_name = "adsl", + summary = list( + vars = c( + "SITEID", + "AGE", + "SEX", + "RACE", + "ETHNIC", + "ARM", + "DCREASCD", + "TRT01A" + ), + column_count = 3 + ), + listings = list( + "Adverse Event" = list(dataset = "adae", default_vars = NULL), + "Concomitant Medication" = list(dataset = "cm", default_vars = NULL) + ), + plots = list( + timeline_info = c( + trt_start_date = "TRTSDT", + trt_end_date = "TRTEDT", + icf_date = "RFICDT", + part_end_date = "RFENDT" + ), + vline_vars = c( + "Informed Consent Date" = "RFICDT", + "Study Treatment Stop Date" = "TRTEDT" + ), + vline_day_numbers = c( + "Study Treatment Start Day : Day 1" = 1 + ), + range_plots = list( + "Adverse Events Plot" = list( + dataset = "adae", + vars = c( + start_date = "ASTDT", + end_date = "AENDT", + decode = "AEDECOD", + grading = "AESEV", + serious_ae = "AESER" + ), + tooltip = c( + "AE Term: " = "AEDECOD", + "AE Reported Term: " = "AETERM", + "Primary SOC: " = "AESOC", + "Serious Event: " = "AESER", + "
AE Start Date: " = "ASTDT", + "AE Stop Date: " = "AENDT" + ) + ), + "Concomitant Medication Plot" = list( + dataset = "cm", + vars = c( + start_date = "CMSTDT", + end_date = "CMENDT", + decode = "CMDECOD", + grading = "CMINDC" + ), + tooltip = c( + "Standardized Medication Name: " = "CMDECOD", + "Indication: " = "CMINDC", + "
CM Dose: " = "CMDOSE", + "CM Dose Unit: " = "CMDOSU", + "
CM START Date: " = "CMSTDTC", + "CM End Date: " = "CMENDTC", + "CM START Day: " = "CMSTDY", + "CM END Day: " = "CMENDY" + ) + ) + ), + value_plots = list( + "Lab plot" = list( + dataset = "lb", + vars = c( + analysis_date = "ADT", + analysis_val = "AVAL", + analysis_param = "PARAM", + analysis_indicator = "ANRIND", + range_low_limit = "A1LO", + range_high_limit = "A1HI" + ), + tooltip = c( + "Lab Parameter: " = "PARAM", + "Lab Test Date: " = "ADT", + "Lab Test Visit :" = "AVISIT", + "
High Limit: " = "A1HI", + "Lab Standard Value: " = "AVAL", + "Lower Limit: " = "A1LO", + "
Analysis Indicator: " = "ANRIND" + ) + ), + "Vital Sign Plot" = list( + dataset = "vs", + vars = c( + analysis_date = "ADT", + analysis_val = "AVAL", + analysis_param = "PARAM", + analysis_indicator = "AVISIT", + summary_stats = "AVAL_MEAN" + ), + tooltip = c( + "Vital sign Parameter: " = "PARAM", + "Vital sign Date: " = "ADT", + "Vital sign Visit: " = "VISIT", + "
Vital sign Value: " = "AVAL", + "Vital sign mean value by visits: " = "AVAL_MEAN" + ) + ) + ) + ) + ) +) + +dv.manager::run_app( + data = dataset_list, + module_list = module_list, + filter_data = "adsl" +) diff --git a/tests/testthat/apps/root/app.R b/tests/testthat/apps/root/app.R new file mode 100644 index 0000000..b6f6106 --- /dev/null +++ b/tests/testthat/apps/root/app.R @@ -0,0 +1,19 @@ + +# TODO(miguel): Avoid having to install the package when testing locally by following +# dv.biomarker.general/browse/tests/testthat/app/app.R?at=dev +# to run the current version of the code + +# wrapper around mock_patient_profile_app that updates URL to reflect state of inputs +shiny::shinyApp( + ui = dv.papo::mock_patient_profile_UI, + server = function(input, output, session) { + dv.papo::mock_patient_profile_server(input, output, session) + + shiny::observe({ + shiny::reactiveValuesToList(input) + session$doBookmark() + }) + shiny::onBookmarked(shiny::updateQueryString) + }, + enableBookmarking = "url" +) diff --git a/tests/testthat/setup.R b/tests/testthat/setup.R new file mode 100644 index 0000000..7ca6d2e --- /dev/null +++ b/tests/testthat/setup.R @@ -0,0 +1,177 @@ +is_CI <- isTRUE(as.logical(Sys.getenv("CI"))) + +wait_for_idle_ms <- 1500 # Cope with slow tests + +# validation (S) +vdoc <- local({ + # ########## + # package_name is used # INSIDE # the sourced file below + # ########## + package_name <- "dv.papo" # hardcoded because devtools::check appears to use a different working directory + utils_file_path <- system.file("validation", "utils-validation.R", package = package_name, mustWork = TRUE) + source(utils_file_path, local = TRUE)[["value"]] +}) +specs <- vdoc[["specs"]] +# validation (F) + +# data & params setup + +# params set up +summary <- list( + vars = c( + "USUBJID", + "SITEID", + "AGE", + "SEX", + "RACE", + "ETHNIC", + "ARM", + "DCREASCD", + "TRT01A" + ), + column_count = 3 +) + +listings <- list( + "Adverse Events" = list( + dataset = "adae", + default_vars = c("USUBJID", "AETERM", "AEDECOD", "AESTDTC", "AEENDTC") + ), + "Concomitant Medication" = list( + dataset = "cm", + default_vars = c("USUBJID", "CMDECOD", "CMDOSE", "CMSTDTC", "CMENDTC") + ) +) + +timeline_info <- c( + trt_start_date = "TRTSDT", + trt_end_date = "TRTEDT", + icf_date = "RFICDT", + part_end_date = "RFENDT" +) + +vline_vars <- list( + "Informed Consent Day" = "RFICDT", + "Study Treatment Stop Day" = "TRTEDT" +) + +range_plots <- list( + "Adverse Events Plot" = list( + dataset = "adae", + vars = c( + start_day = "AESTDY", + end_day = "AEENDY", + decode = "AEDECOD", + grading = "AESEV", + serious_ae = "AESER" + ), + tooltip = c( + ## we have to think about how we can make it simpler + "AE Term: " = "AEDECOD", + "AE Reported Term:" = "AETERM", + "Primary SOC: " = "AESOC", + "Intensity: " = "ASEV", + "Serious Event: " = "AESER", + "add_break" = "", + "Treatment Start Date: " = "TRTSDT", + "Treatment Stop Date: " = "TRTEDT", + "add_break" = "", + "AE Start Date: " = "AESTDTC", + "AE Stop Date: " = "AEENDTC", + "AE Start Day: " = "AESTDY", + "AE Stop Day: " = "AEENDY", + "add_break" = "", + "CM or add. Treatment: " = "ACONTRT", + "Action Taken with Study Treatment: " = "AACN", + "Drug Related: " = "AREL", + "Comment for Discont of Treatment: " = "DCTREAS", + "DLT Indicator: " = "ADLT" + ) + ), + "Concomitant Medication Plot" = list( + dataset = "cm", + vars = c( + start_day = "CMSTDY", + end_day = "CMENDY", + decode = "CMDECOD", + grading = "CMINDC" + ), + tooltip = c( + "Standardized Medication Name: " = "CMDECOD", + "Indication: " = "CMINDC", + "Indication Term: " = "CMINDC0", + "add_break" = "", + "CM Dose: " = "CMDOSE", + "CM Dose Unit: " = "CMDOSU", + "add_break" = "", + "Treatment Start Date: " = "TRTSDT", + "Treatment Stop Date: " = "TRTEDT", + "add_break" = "", + "CM START Date: " = "CMSTDTC", + "CM End Date: " = "CMENDTC", + "CM START Day: " = "CMSTDY", + "CM END Day: " = "CMENDY", + "CM START Date Imputation Flag: " = "ASTDTF", + "CM End Date Imputation Flag: " = "AENDTF", + "add_break" = "", + "Planned Sequence of Treatments: " = "TRTSEQP", + "Actual Sequence of Treatments: " = "TRTSEQA" + ) + ) +) + +value_plots <- list( + "Lab plot" = list( + dataset = "lb", + vars = c( + analysis_day = "LBDY", + analysis_val = "LBORRES", + analysis_param = "LBTEST", + analysis_indicator = "LBNRIND", + range_low_limit = "LBORNRLO", + range_high_limit = "LBORNRHI" + ), + tooltip = c( + "Lab Parameter: " = "LBTEST", + "Lab Test Day: " = "LBDY", + "Lab Test Visit :" = "VISIT", + "add_break" = "", + "High Limit: " = "LBSTNRHI", + "Lab Standard Value: " = "LBORRES", + "Lower Limit: " = "LBSTNRLO", + "add_break" = "", + "Analysis Indicator: " = "LBNRIND" + ) + ), + "Vital Sign Plot" = list( + dataset = "vs", + vars = c( + analysis_day = "VSDY", + analysis_val = "VSORRES", + analysis_param = "VSTEST", + analysis_indicator = "VISIT", + range_low_limit = NULL, + range_high_limit = NULL, + summary_stats = "AVAL_MEAN" + ), + tooltip = c( + "Vital sign Parameter: " = "VSTEST", + "Vital sign Day: " = "VSDY", + "Vital sign Visit: " = "VISIT", + "add_break" = "", + "Vital sign Value: " = "VSORRES", + "Vital sign mean value by visits: " = "AVAL_MEAN" + ) + ) +) + +# data +testd1 <- dv.papo:::prep_safety_data(5) +testd1_sl <- testd1[["adsl"]] +testd1_extra <- testd1[setdiff(names(testd1), "adsl")] +rm(testd1) + +root_app <- shinytest2::AppDriver$new(app_dir = "apps/root/") +root_app_url <- root_app$get_url() + +withr::defer(root_app$stop(), teardown_env()) diff --git a/tests/testthat/test-all.R b/tests/testthat/test-all.R new file mode 100644 index 0000000..9e0c2dc --- /dev/null +++ b/tests/testthat/test-all.R @@ -0,0 +1,350 @@ +test_that( + "functional subject_selector" |> + vdoc[["add_spec"]](c(specs$common$subject_selector)), + { + test_pid <- "01-701-1028" + test_tab <- "cm" + + shiny::testServer(mod_patient_profile_server, args = list( + id = "test", + subject_level_dataset = shiny::reactive(testd1_sl), + extra_datasets = shiny::reactive(testd1_extra), + subjid_var = "USUBJID", + sender_ids = c(reactive(list("subj_id" = reactive("test")))), + summary = summary, + listings = listings, + plots = list( + timeline_info = timeline_info, + vline_vars = vline_vars, + range_plots = range_plots, + value_plots = value_plots, + palette = NULL + ) + ), { + session$setInputs(patient_selector = test_pid) + session$flushReact() + expect_equal( + filtered_pt_info_data() |> + select_columns_by_name("USUBJID") |> + unlist(use.names = FALSE), + test_pid + ) + }) + } +) + +test_that( + "functional bookmarking" |> + vdoc[["add_spec"]](c(specs$common$bookmarking)), + { + app <- shinytest2::AppDriver$new(root_app_url) + app$wait_for_idle(wait_for_idle_ms) + + sel_id <- "papo-patient_selector" + + inputs <- list() + inputs[[sel_id]] <- "01-701-1028" + + do.call(app$set_inputs, inputs) + app$wait_for_idle(wait_for_idle_ms) + + bmk_url <- app$get_js("window.location.href") + + bookmark_app <- shinytest2::AppDriver$new(bmk_url) + bookmark_app$wait_for_idle(wait_for_idle_ms) + app_input_values <- app$get_values()[["input"]] + bmk_input_values <- bookmark_app$get_values()[["input"]] + + expect_equal(app_input_values[[sel_id]], bmk_input_values[[sel_id]]) + app$stop() + } +) + +test_that( + "functional jump-to-subject" |> + vdoc[["add_spec"]](c(specs$common$jump_to_subject)), + { + app <- shinytest2::AppDriver$new(root_app_url) + app$wait_for_idle(wait_for_idle_ms) + app$click(input = "jump") + app$wait_for_idle(wait_for_idle_ms) + expected <- "01-701-1033" + actual <- app$get_value(input = "papo-patient_selector") + expect_equal(actual, expected) + app$stop() + } +) + +test_that( + "helpful configuration feedback" |> + vdoc[["add_spec"]](c(specs$common$misconfiguration_feedback)), + { + app <- shinytest2::AppDriver$new( + app_dir = "apps/misconfigured_app/", + name = "misconfigured_app" + ) + + app$wait_for_idle(wait_for_idle_ms) + + validation_errors <- app$get_html(selector = "#papo-validator-ui") + expect_true(grepl("`subject_level_dataset_name` missing", validation_errors, fixed = TRUE)) + expect_true(grepl("`subjid_var` missing", validation_errors, fixed = TRUE)) + + app$stop() + } +) + +test_that( + "patient selector updates after dataset change" |> + vdoc[["add_spec"]](c(specs$common$dataset_change)), + { + app <- shinytest2::AppDriver$new( + app_dir = "apps/patient_selector_switching/", + name = "patient_selector_switching" + ) + + app$set_inputs(`global_filter-vars` = "SEX") + app$wait_for_idle() + + # Check if the first patient was selected (initial state) + testthat::expect_equal(app$get_text("#mock_app-patient_selector"), "01-701-1015") + + # Check if the first male patient was selected when filtered accordingly + app$set_inputs(`global_filter-SEX` = "M") + # assign pat_id only to suppress print + pat_id <- app$wait_for_value(input = "mock_app-patient_selector", ignore = list("01-701-1015")) + testthat::expect_equal(app$get_text("#mock_app-patient_selector"), "01-701-1023") + + # Check if no patient is selected when filtered accordingly + app$set_inputs(`global_filter-SEX` = character(0)) + app$wait_for_idle(2000) + testthat::expect_equal(app$get_text("#mock_app-patient_selector"), "") + + app$stop() + } +) + +column_count_tst <- 4 +records <- testd1_sl %>% dplyr::filter(USUBJID == "01-701-1015") + +test_that( + "Subject level information will be shown in patient information section, + the total number and content of elements is customizable. The default number + of elements in one row is also customizable." |> + vdoc[["add_spec"]](c(specs$summary$columns)), + { + shiny::testServer( + patient_info_server, + arg = list( + id = "test", + record = reactive(records), + subjid_var = "USUBJID", + column_count = column_count_tst + ), + { + session$setInputs(patient_selector = "01-701-1023") + div_class <- paste0("col-sm-", 12 / column_count_tst) + + # check if the number of items equals to number of data columns, and + # if the div class is correct to ensure the number of items per + # is as expected + expect_equal( + length(gregexpr(div_class, output$ui_out$html, fixed = TRUE)[[1]]), + ncol(records) + ) + } + ) + } +) + +test_that( + "Column labels are shown as names in data listings if present" |> + vdoc[["add_spec"]](c(specs$listings$column_labels)), + { + app <- shinytest2::AppDriver$new(root_app_url) + app$wait_for_idle(wait_for_idle_ms) + app$set_inputs("papo-listings-column_selector_adae" = c("USUBJID")) + app$wait_for_idle(wait_for_idle_ms) + + selected_data <- app$get_values()[["export"]][["papo-listings-test_data"]][["filtered_data"]] + expect_equal(attr(selected_data[["USUBJID"]], "label"), "Unique Subject Identifier") + + app$stop() + } +) + +test_that( + "Tab controls allow listing switching" |> + vdoc[["add_spec"]](c(specs$listings$switching, specs$listings$extra_column_selection)), + { + app <- shinytest2::AppDriver$new(root_app_url) + app$wait_for_idle(duration = wait_for_idle_ms) + app$set_inputs("papo-listings-data_selector" = "cm") + app$wait_for_idle() + + target_columns <- c("USUBJID", "CMTRT") + app$set_inputs("papo-listings-column_selector_cm" = target_columns) + app$wait_for_idle() + + selected_data <- app$get_values()[["export"]][["papo-listings-test_data"]][["filtered_data"]] + testthat::expect_equal(names(selected_data), target_columns) + testthat::expect_equal(unique(selected_data[["USUBJID"]]), "01-701-1015") + testthat::expect_equal( + unique(selected_data[["CMTRT"]]), + c("ASPIRIN", "CALCIUM", "HYDROCORTISONE", "NEOSPORIN /USA/", "PREMARIN", "TYLENOL") + ) + app$stop() + } +) + +test_that( + "The content of data listing can be filtered by inputing related text in the + search box on the top right of the listing. It can also be filtered for each + column by inputing/selecting values from the text box below the column + header." |> + vdoc[["add_spec"]](c(specs$listings$filtering, specs$listings$sorting)), + { + app <- shinytest2::AppDriver$new(root_app_url) + app$wait_for_idle(1500) + app$set_inputs("papo-listings-data_selector" = "cm") + app$wait_for_idle(1500) + + target_columns <- c("USUBJID", "CMTRT") + app$set_inputs("papo-listings-column_selector_cm" = target_columns) + app$wait_for_idle(1500) + + listing_properties <- jsonlite::fromJSON(app$get_values()[["output"]][["papo-listings-listing"]])[["x"]] + + testthat::expect_equal(listing_properties[["filter"]], "top") + testthat::expect_equal(listing_properties[["options"]][["searching"]], TRUE) + testthat::expect_equal(listing_properties[["options"]][["ordering"]], TRUE) + testthat::expect_equal(listing_properties[["options"]][["buttons"]][["text"]], "Reset Columns Order") + + filter_html <- listing_properties[["filterHTML"]] + testthat::expect_true(grepl("select multiple", filter_html) && grepl('data-type="factor"', filter_html)) + + app$stop() + } +) + +test_that( + "Column selectors show labels if available" |> + vdoc[["add_spec"]](c(specs$listings$extra_column_selection_labels)), + { + app <- shinytest2::AppDriver$new(root_app_url) + app$wait_for_idle(duration = wait_for_idle_ms) + app$set_inputs("papo-listings-data_selector" = "cm") + app$wait_for_idle() + + select_extra_columns <- app$get_html(selector = "#papo-listings-column_selector") + + matches <- gregexpr('data-subtext="([^"]*)"', select_extra_columns) + data_subtexts <- regmatches(select_extra_columns, matches)[[1]] + data_subtexts <- gsub('data-subtext="|"', "", data_subtexts) + expect_contains(data_subtexts, c("Study Identifier", "Age", "Race")) + + app$stop() + } +) + +test_that( + "Message explains the lack of data for listings" |> + vdoc[["add_spec"]](c(specs$listings$no_data_message)), + { + skip("DT listings provide a 'No data' message by default") + } +) + +test_that( + "Column selectors show labels if available" |> + vdoc[["add_spec"]](c(specs$plots$common$tooltips)), + { + app <- shinytest2::AppDriver$new(root_app_url) + app$wait_for_idle(duration = wait_for_idle_ms) + + # ... [continued from R/mod_plots.R:#umeega] we recover the data from the export + slot + tooltips <- app$get_values()[["export"]][["papo-plot_contents-test_plot_data"]][["tooltips/Adverse Events Plot"]] + expect_true(length(tooltips) == 3 && all(nchar(tooltips) > 200)) + + app$stop() + } +) + +test_that( + "Mild adverse events are colored as such" |> + vdoc[["add_spec"]](c(specs$plots$common$palettes, specs$plots$range$grading)), + { + app <- shinytest2::AppDriver$new(root_app_url) + app$wait_for_idle(duration = wait_for_idle_ms) + + target_color <- grDevices::col2rgb(CONST$default_palette[["MILD"]]) + target_color_as_string <- paste0("rgba(", paste(target_color, collapse = ","), ",1)") + + ae_plot_first_color <- + app$get_values()[["export"]][["papo-plot_contents-test_plot_data"]][["plot_first_line_color/Adverse Events Plot"]] + expect_equal(target_color_as_string, ae_plot_first_color) + + app$stop() + } +) + +test_that( + "Message explains the lack of data for plots" |> + vdoc[["add_spec"]](c(specs$plots$common$no_data_message)), + { + app <- shinytest2::AppDriver$new(root_app_url) + app$wait_for_idle(wait_for_idle_ms) + app$click(input = "jump") + app$wait_for_idle(duration = wait_for_idle_ms) + expected <- "01-701-1033" + plot_messages <- app$get_values()[["export"]][["papo-plot_contents-test_plot_data"]][["plot_messages"]] + expect_contains(plot_messages, "* No Data for Adverse Events Plot.") + app$stop() + } +) + +test_that( + "Parameters for value plots can be selected from a drop-down menu" |> + vdoc[["add_spec"]](c(specs$plots$value$parameter_selection)), + { + test_pid <- "01-701-1028" + subjid_var <- "USUBJID" + lb_tests <- c("Alanine Aminotransferase", "Chloride", "Basophils") + vs_tests <- c("Pulse Rate", "Diastolic Blood Pressure", "Systolic Blood Pressure") + + shiny::testServer( + patient_plot_server, + arg = list( + id = "test", + subject_var = subjid_var, + subject_level_dataset = shiny::reactive(testd1_sl), + timeline_info = timeline_info, + extra_datasets = shiny::reactive(testd1_extra), + range_plots = range_plots, + value_plots = value_plots, + vline_vars = vline_vars, + palette = NULL + ), + { + session$setInputs(patient_selector = test_pid) + session$setInputs(Lab_plot = lb_tests) + session$setInputs(Vital_Sign_Plot = vs_tests) + session$flushReact() + expect_equal(input[["Lab_plot"]], lb_tests) + expect_equal(input[["Vital_Sign_Plot"]], vs_tests) + } + ) + } +) + +test_that( + "Events that exceed ranges get labelled with arrows" |> + vdoc[["add_spec"]](c(specs$plots$range$arrows)), + { + app <- shinytest2::AppDriver$new(root_app_url) + app$wait_for_idle(wait_for_idle_ms) + arrows <- app$get_values()[["export"]][["papo-plot_contents-test_plot_data"]][["arrow_right/Adverse Events Plot"]] + expect_equal(arrows, as.Date(c("2014-07-02", "2014-07-02", NA))) + app$stop() + } +) diff --git a/vignettes/.gitignore b/vignettes/.gitignore new file mode 100644 index 0000000..097b241 --- /dev/null +++ b/vignettes/.gitignore @@ -0,0 +1,2 @@ +*.html +*.R diff --git a/vignettes/a00-papo.Rmd b/vignettes/a00-papo.Rmd new file mode 100644 index 0000000..696990d --- /dev/null +++ b/vignettes/a00-papo.Rmd @@ -0,0 +1,287 @@ +--- +title: "Patient Profile Module" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{Patient Profile Module} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + eval = FALSE, + collapse = TRUE, + comment = "#>" +) +``` + +This guide will help you configure the Patient Profile module for inclusion in DaVinci apps. + +## What does the Patient Profile module do? + +The DaVinci Patient Profile module displays patient information on a subject-level basis. +It is divided into three sections: summary, listings, and plots. + +- Summary: Snapshot of the patient's demographic information that doesn't change with visits. +- Listings: Information that changes with each visit. +- Plots: Visual depictions of events over time, such as adverse events or concomitant medication, + and point-like events like lab values or vital sign measurements. + +The following screenshot shows the module configured to display the popular sample `safetyData` dataset. +Notice the three sections under the titles "Patient Information", "Data Listings" and "Graphical Display": + + + +![](images/complete_display.jpg) + +The next section breaks down the necessary configuration steps to set up this display. + +The final section shows the resulting configuration. + +## How to configure the Patient Profile module? + +The `mod_patient_profile` function takes several arguments, some of which are optional: + +- `module_id`: This is a unique identifier for the Shiny module in your DaVinci app. + +- `subject_level_dataset_name`, `subjid_var`: These are the subject-level dataset name and unique subject identifier column respectively. + +- `sender_ids`: This optional parameter identifies modules that can request the display of target patient IDs. You can read more about it in the dedicated "Module Communication" article. + +- `summary`, `listings`, `plots`: These optional parameters allow you to customize what information is displayed in each of the three section. Let's take a look at each of them separately. + + +### Incremental configuration +As will become apparent, some of these parameters have fields, and some of those fields have subfields. **The complexity of this interface reflects its flexibility, but it can prove overwhelming**. To alleviate this situation, we've made sure that **this module is functional when partially configured and provides clear and helpful error messages when accidentally misconfigured**. + +When a DaVinci application containing a misconfigured `mod_patient_profile` starts it presents descriptive instructions on how to address the problem. Here's a screenshot showing three such help messages: + +If no error is displayed on application start, the blame for any unexpected problems the users encounter should fall on the authors of this module or the infrastructure providers. + +This forgiving behavior makes it possible to start with a minimal empty call to `dv.papo::mod_patient_profile()` and parameterize it incrementally until a satisfactory configuration is reached. + +### The `summary` parameter + +The `summary` parameter is a list that allows to customize the subject-level summary section. It is composed of: + +- `vars`: These are the values you want to display in the this section. They index into the dataset specified by `subject_level_dataset_name`. +- `column_count`: This is the number of columns for the summary section. + +Recall the summary section of the sample image at the beginning of this article: + + +The parameterization that generates that section is: +``` +summary = list( + vars = c("SUBJID", "SITEID", "ARM", + "TRTSDT", "TRTEDT", "AGE", + "RACE", "SEX", "BMIBL"), + column_count = 3 +) +``` +We've broken the `vars` field into three lines to highlight the one-to-one mapping between each var and the their counterpart on the image. + +The bold-faced descriptions of the variables are extracted from the `label` column attribute already present in the dataset. + +### The `listings` parameter + +The `listings` parameter is a named list of elements to include as listings in the "Data Listing" section. + +Recall the listings section in the sample image at the beginning of this article: + + +The parameterization that generates that section is: +``` +listings = list( + "Concomitant Medication" = list( + dataset = "cm" + ), + "Adverse Events" = list( + dataset = "adae", + default_vars = c("ASTDT", "ASTDY", "AENDT", "AENDY", "AEDECOD", "AESEV") + ) +) +``` +Notice how the names on the list (`"Concomitant Medication"` and `"Adverse Events"`) are used as the labels in the blue "Domain" selector. +The mandatory `dataset` field indicates which domain to display under which heading. The optional `default_vars` is the initial selection +of "Columns" to display on the listing. The user can modify that selection. + +The bold-faced listing headings are extracted from the `label` column attribute already present in the dataset. + + +### The `plots` parameter + +The plots parameter is a named list of elements to include as plots in the "Graphical Display" section. + +Recall the plots section in the sample image at the beginning of this article: + +The parameterization that generates that section is: +``` +plots = list( + timeline_info = c(trt_start_date = "TRTSDT", trt_end_date = "TRTEDT"), + range_plots = list( + "Concomitant Medication" = list( + dataset = "cm", + vars = c(start_date = "CMSTDT", end_date = "CMENDT", decode = "CMDECOD", + grading = "CMDECOD"), + tooltip = c() + ), + "Adverse Events" = list( + dataset = "adae", + vars = c(start_date = "ASTDT", end_date = "AENDT", decode = "AEDECOD", + grading = "AESEV", serious_ae = "AESER"), + tooltip = c("AE Start Day: " = "ASTDY", "AE End Day: " = "AENDY") + ) + ), + value_plots = list( + "Lab Values" = list( + dataset = "lb", + vars = c(analysis_param = "PARAM", analysis_val = "AVAL", analysis_date = "ADT", + analysis_indicator = "LBNRIND", range_low_limit = "A1LO", range_high_limit = "A1HI"), + tooltip = c() + ) + ), + vline_vars = c("Informed Consent Date" = "RFICDT") + ) +``` +As with the two previous sections, there is a clear mapping between the `plot` fields and their effect on the displayed charts. +Here's a brief summary of those fields: + +- `timeline_info` configures the extent of the horizontal time axis. +- `range_plots` and `value_plots` describe which plots to include. +- `vline_vars` and `vline_day_numbers` (optional and not used in the example) add extra vertical markers that run through all plots. +- `palette` (optional and not used in the example) is used to fine-tune the color of points, ranges and vertical markers on plots. + +And here's a more detailed account of their properties: + +#### The `plots/timeline_info` field +The `timeline_info` field is a list of date variables in the dataset specified by the `subject_level_dataset_name` parameter. The two mandatory +subfields are: + +- `trt_start_date`: Treatment Start Date, used also as Day 1 Reference Date to derive Study Day numbers. +- `trt_end_date`: Treatment End Date. + +There are two additional optional subfields: + +- `icf_date`: Informed Consent Form signing Date. +- `part_end_date`: Participation End Date. + +They usually envelop and extend the treatment start-end time range. Including them expands the horizontal time range of the plots. + +#### The `plots/range_plots` field +The `range_plots` field is a named list of elements to include as plots for range-like events (adverse events, concomitant medications, etc.). Each of them has three members: + +- `dataset`: Dataset name from which to pull the information. +- `vars`: Variables of interest for the event. They index into `dataset`: + + - `start_date` and `end_date`: Beginning and end of the range. + - `decode`: Description of the event. + - `grading`: Intensity of the event. Used for color-coding ranges. + - `serious_ae`: Marker of serious adverse event. Overlays a `SAE` legend on top of events that require special attention. + +- `tooltip`: Defines a block of text to display as hover information over the left edge of each range. It is specified as a named list of `dataset` variable names. The names of this list are included as literal text and honor three basic HTML formatting elements: ``, ``, `
`. The columns the values refer to are populated with the value on the dataset relevant to any given row. + +#### The `plots/value_plots` field +The `value_plots` field is a named list of elements to include as plots for value-like traces (lab measurements, vital signs, etc.). Each of them has three members: + +- `dataset`: Dataset name from which to pull the information. +- `vars`: Variables of interest for the event. Only the first three are mandatory. They index into `dataset`: + + - `analysis_param`: Variable describing the parameter to plot. + - `analysis_val`: Value associated to each time point. + - `analysis_date`: Date of sample collection. + - `analysis_indicator`: Used for color-coding the marker on the plot. Usually indicates whether a value is inside or outside of range. + - `range_low_limit`: Lower limit of the range considered normal for this particular parameter. + - `range_high_limit`: Higher limit of the range considered normal for this particular parameter. + - `summary_stats` : This variable supplements `analysis_val` and is useful for datasets that have more than one measurement per `analysis_date`. It should point to a variable that summarizes all measurements on a single visit through a centrality calculation (mean, median, etc.). + +- `tooltip`: Defines a block of text to display as hover information over the left edge of each range. It is specified as a named list of `dataset` variable names. The names of this list are included as literal text and honor three basic HTML formatting elements: ``, ``, `
`. The columns the values refer to are populated with the value on the dataset relevant to any given row. + +#### The `plots/vline_vars` field +The `vline_vars` field places vertical dashed lines on days indicated by this dataset columns. It indexes into the dataset `subject_level_dataset_name` and expects values of type `integer`, `Date` or `POSIXt`. + +#### The `plots/vline_day_numbers` field +The `vline_day_numbers` field requires a vector of integers, representing CDISC (non-zero) Study Days. It places vertical dashed lines on the positions corresponding to those days. + +#### The `plots/palette` field +The `palette` field requires a named list of colors. If a name on this list matches the text on a plot element, the associated color will be applied to that element. This mapping takes precedence over the built-in palette. It contains either an HTML (#xxxxxx) or an R color. As an example, if the desired color for an element tagged "Relevant" is yellow and for another tagged "Irrelevant" is gray, this would be the appropriate palette definition: +``` +palette = c("Relevant" = "yellow", "Irrelevant" = "gray") +``` + +## Complete sample configuration + +As promised, here's the configuration resulting from aggregating all the previous steps: + +``` +dv.papo::mod_patient_profile( + module_id = "papo", + subject_level_dataset_name = "adsl", + subjid_var = "USUBJID", + summary = list( + vars = c("SUBJID", "SITEID", "ARM", "TRTSDT", "TRTEDT", "AGE", "RACE", "SEX", "BMIBL"), + column_count = 3L + ), + listings = list( + "Concomitant Medication" = list( + dataset = "cm" + ), + "Adverse Events" = list( + dataset = "adae", + default_vars = c("ASTDT", "ASTDY", "AENDT", "AENDY", "AEDECOD", "AESEV") + ) + ), + plots = list( + timeline_info = c( + trt_start_date = "TRTSDT", + trt_end_date = "TRTEDT" + ), + range_plots = list( + "Concomitant Medication" = list( + dataset = "cm", + vars = c( + start_date = "CMSTDT", + end_date = "CMENDT", + decode = "CMDECOD", + grading = "CMDECOD" + ), + tooltip = c() + ), + "Adverse Events" = list( + dataset = "adae", + vars = c( + start_date = "ASTDT", + end_date = "AENDT", + decode = "AEDECOD", + grading = "AESEV", + serious_ae = "AESER" + ), + tooltip = c( + "AE Start Day: " = "ASTDY", + "AE End Day: " = "AENDY" + ) + ) + ), + value_plots = list( + "Lab Values" = list( + dataset = "lb", + vars = c( + analysis_param = "PARAM", + analysis_val = "AVAL", + analysis_date = "ADT", + analysis_indicator = "LBNRIND", + range_low_limit = "A1LO", + range_high_limit = "A1HI" + ), + tooltip = c() + ) + ), + vline_vars = c( + "Informed Consent Date" = "RFICDT" + ) + ) +) +``` diff --git a/vignettes/a01-data_requirements.Rmd b/vignettes/a01-data_requirements.Rmd new file mode 100644 index 0000000..083d1f0 --- /dev/null +++ b/vignettes/a01-data_requirements.Rmd @@ -0,0 +1,28 @@ +--- +title: "Data requirements" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{Data requirements} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +Data sets and their variables to be used to display the patient profile must fulfill the conditions listed below: + +- The accepted types for date variables are (`Date`) or date-time (`POSIXt`) but not plain character strings. + +- All datasets must provide a unique shared subject identifier variable. + +- The mandatory subject-level dataset should also provide variables for: + - treatment start dates + - treatment end dates + +- All visit-dependent datasets used referred to by the `range_plots` parameter should additionally provide variables for : + - start dates + - end dates + - "decode" description of the event + +- All visit-dependent datasets used referred to by the `value_plots` parameter should additionally provide variables for : + - analysis date + - parameter + - value diff --git a/vignettes/a02-communication.Rmd b/vignettes/a02-communication.Rmd new file mode 100644 index 0000000..ed626ff --- /dev/null +++ b/vignettes/a02-communication.Rmd @@ -0,0 +1,45 @@ +--- +title: "Communication with other DaVinci modules" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{Communication with other DaVinci modules} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + eval = FALSE, + collapse = TRUE, + comment = "#>" +) +``` + +DaVinci modules can direct `mod_patient_profile` to select and display information associated to any particular subject ID. When the Patient Profile is so instructed, it switches to the target subject ID and takes focus from the application, effectively *jumping* to a patient profile display as a result of a simple user interaction, such as a mouse click. + +Examples of modules implementing that functionality are `dv.clinlines` and several of the `dv.biomarker.general` displays. + +## Configuration + +Configuring `mod_patient_profile` to communicate with some other module usually involves setting up two parameters, one in each of the two modules participating in the exchange. On the receiver end, the `sender_ids` parameter lists the identifiers of modules Patient Profile will listen to. On the sender side, the specifics may vary, so we will provide an example using the `dv.clinlines` module. + +## Example + +This is a sketch of the portions of code relevant to establish communication between the Patient Profile and Clinical Timelines modules: + +```{r} +module_list <- list( + "Patient Profiles" = dv.papo::mod_patient_profile( + module_id = "mod1", + ..., # ommitted for brevity + sender_ids = c("mod2") + ), + "Clinical Timelines" = dv.clinlines::mod_clinical_timelines( + module_id = "mod2", + ..., # ommitted for brevity + receiver_id = "mod1" + ) +) +``` + +Notice how Patient Profile can specify more than one module as the source of "jumping" messages. diff --git a/vignettes/images/complete_display.jpg b/vignettes/images/complete_display.jpg new file mode 100644 index 0000000000000000000000000000000000000000..18678058a5dd6c285340d650df25b11a0c4a24ac GIT binary patch literal 153829 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 (hF!*o$pOF+x@oVA_3 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ℑ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 literal 0 HcmV?d00001 diff --git a/vignettes/images/info.png b/vignettes/images/info.png new file mode 100644 index 0000000000000000000000000000000000000000..1d2a6b00bcd6105614cd2860f45614ec35f00bd0 GIT binary patch literal 46342 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 z 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∓;b1T{MFn zV+Ci4PoW`2X|rf5T60DtYR%HB2;w-|Ja-Rlz5Jb_b#?}oqZLY(m&w^Vhh@Rjv>jyCBM}myD zx`Dj1i4PMXB(?Q61e)9yQARF$XC=C581fNswsH=}pn)COf{nmplj?d;9-|}t7bApS zOk2pwwrgsV|APg;T`U|z8X=qZke^X!sg2nxNyvwz$Cv%7mjhI;&0q$aG9-SF9*!mA zW0pC^_9hf7mcBCwJn%Q`xs+Jrb@}$IajX$qp6B}3a;%t78L<7gb3zbmZN5TwZP%}? zj0Wh1&i3Zo1GN_MsVEsJ$=WD|zVaUeqWhTUkWs=RdDtroVsls_Z^=l5B0;qsih5g`Gz7qP1gT!BW)L|s2Yomo8qCY5 zkk9We>Ko<^X}nFUxE2m++_Y^crG-VrV<+75rC3qh!94NtLFphmoxUqUdZt24Viduz zb&W}J5_|~gcC+gOZ^WC?z}oaxX^VT}?t<|hKLx$yFRyzY;UvVONSYE~d_ia|1h6$F zK#X1K_*8hgNlK{Omf`d2mu&S16OJa>2F@F8sajMNC+>Kyx5vH&tL5&DD_?WNLzm{V zu6|*tYE6Yf3HU_nu@NZ+&g&ZTPmPr{@em5e@3~^EpQ;PyD|z-X{2>q!Y+s$1B(>vT zNbCQQ{E9crRJPLJ;>+_DuRop2<$F?r=Yi9YSxm|YObLIuaX)XP({4e>!-XFJ%Qw#L zOI3%=rlWgnA18P3GT*2=c(-tu_)=UArscGD1@HQv{m*wnzgJ?Jf@ zv3m7;n0@WOm;XK`e)IfoD9n1rKcN--sTrFn8 zWn9&;h~)uMY%msS8#xu%)5`5qr&29r?82^AyPQ31SV}`!4(EX@5;ZvD=NTz2JT@?3 z9*4E}I;0}W)e=ZJ%>r5Oy_T`FWdg`(?K(H@BF6Bxtl$NlNnzZN%qj8F?BgeTBSlD7 zR-;cO&juB3yoY<#)lKvR>=UyxiTs7b2DMTLZ7XbUmRpl?39-E9#8UzFJY!5?B`pXw zGGtOr!jcqtEXF4zOc8z*s%wG`pNkHK6<~)6vA&OCwWmam;I=c%0YINYD<`3u2>snA z+~Grg;a$q8XST*!Y3p=$@d+R?aK_B#daLa>d6dQdV^OM02`{^`)DXG-+g~n8x}uoJ z%uu!O0qDqh7oQSRs3X3SdBV96g4@_WFrAZ|8hlgwI`9&B{Va4l>0N;nb_2&f_Tn&_ z@QcYX0FrnO!gfCvsTMY;OWtyb)uCm{?d3#2Kw8lCf@(uphzT3#;j_JP20gYMs_ToF zb#;wHMYY9oZ(kKj=I=D6h^*yMLNU>(HsrNLp)Fi2V#-HQ5FQOKTpY(o58KrV(aMb) z@4J0zlQo$A4VS8iRXTELoHd1{A|rpGc7b_v~%oIb0PIWkt;_f)e7o znTHu*2KgF%oTt3bWY9T=QSTG z5t7vdL{{w!S;8?3_Ja-Qa-G=V2ee1mCfK@M2LT>|5MLF~BpjB*jE zDsmi5)0HK-k4LdwmQY(gc2oPMsD`)h?VS5v!CBP7FO%P0n+XeohjfGa6@cgY`=M7l z@HD%8^=O{Ks=F75?HgQQ7TPtKTIYql$yEY(F)x#Yg08X!>0u>$D4Ewzn$InQs3>$( zFI?H+N~*I2ljy0HNKz>5%tBzG;y2=g)u98`<@PLUa|LK#+|0s*6oO>~EUidnjtvEm zhdK>lMi6r>R*9feCcmwaA(}&O@Ts$<4DYgGbg~3$GL&+rt+M;eaK341)semkKwl4- z;w~ws;Rj`vyZI4E(X_vZnspm6#2I{}2w6mUY~hIcTVYX_`!*9i>=q_2<3rlkL4U5y_!W}oI2TzXjCYJ3A)iW! zt=iUB(TlPOJ(|?NigN`!6fe3DR>7Erv&DV^^sNs!NIC?pXE9RCy&g&>4(2K;7}T>R ze4@Yn7_7@`{1|n~&J;LKlIwt?azbAO-5G^3bpy?QK|U-QZw`8!uuc?` z1NL?vb3I?_K8cuPJD~~)B?!4<70KElT-f*x9154CjmU!6XGhnm6iF#azi>HUYSPT9 z8eoE(ROMwNULRGGb+4d0dlN(GomWC~b?bS-_{%H`NnJ`2SiK}0_=)>;NmHSNdagMx zmYvkI_Ia}3+n+zoUyhyB}-}Tsjg3rEZdiF4@Vjj>x4-9uP|NMyW&zAPr z&M_J z9#Xs5OgST3I8Ah0uOqX!}SdZMN&2XN9E7pINc;n&x{WYx@Kz_QxE!ARQx5$ zc9>j#dZ%B%rz$cXe^yTPVTecd^$JOFT z-G7(2Z+H6W`tEm4%Yh?r)mwow7o*>dhL6ButfYiYbKERBId>P8zXe#wsJ`*q;fUYn z*Np7qgl4jOM0Wg_5iAHy!3gBgiu^OgGhPwuse^1Ki8`y~Qeq3^Av#3=byRW66~$FfoJ=|om-eE65-}dEX|w{8h#9sc z+*9J;-|+tYzW2ZP>^u3NUM}nGVBwnt-;bF;0+;RJeKt5ASgfw8Uak)XmxN$#3YYQH zP(p&64w~cu2$VyucezlhP#t!`S{c~11cI*hJ5z)~$U2B}LdCij62q>6729ZUT`7O5 zH;GgGh4xL576XW=8U%N`MSEIiN6CguXd5QSJ+THbz}VB1d|YFNPiPMMi+Nzv03vIo z;5&gHxKccXKT>p&JUY?^rP#?4$B<|nw!p3gCNffFU}el?TR{ec1j1 zs0l$#hR`V9h5k*wnpA$gzzDpn7mz#=CAYvqMoM_YHc$7b8k=+It|?LxIm5;DOWAEn zmLpgiIm!s0Np(qN*$APyePLc92Hq7{~o(8cVE-Npi? z62y~EPyJ9HzDZ*bCwh}YC@tiFnX0}8SR0+c_G?mDD$hfrxbprKfIpx9!`1)AX;{-M zKgB50C@#epAl=YEbt@=S-&(Tow14+9W(EHU^viZidfs|>(gZ^oFxU?HkU zgXu9G{!V&@M1;+>_NfuJXx3?N-39Gz!2?!tl2XU&ae+_1AF6m?*?Y9IEQ46TLaj5A zq%ArnJVta5B&myT5M|>~3h2BOc-PBvtQ=BEaA{k%KQ$H2md3j<}M>B80 zsX21>ln#&Mm6$&peLG=0%C$$7KvJ?g;0NF(qX&ut!am7rXbqm85xjY&ZiGz^S^i90 z=kpABVwk8fd3E4L*%aOWnaap_|T$yen!bmGhC-N%C=3+7> zgcJ(Fj!X!p5UK9JuGiUAeqmPkA|fv(=Q4gM^XILnKn6xx+3WITwWlz;yS5vs;nN6aU~*=jmJ35CV?X*C=5Uj zSj}@%@W(z1SL|D*T3Tp$Yf_JU6=_%-RV;#yBiGE9AWjrIV2_zKW>#KWMeI& z>w&|99KfB3=`64_s6rz3J<(n}jY0O9waU0zh4km*H!Y=)L!zeXXTKjUm zU({0P<59eHyOYDr*;fuOP`JNZjiSUqc+aGMm9ZUaKf&%SR3>DF^BUepm)F}kQNqD% z@B^SyHo+P-(v0eY2naqWQqU>9NoQ$P!G7oAJXY0UQAB01CpQkyvp_jgUy>ML;iC1lS9O4r)eKfX{Q4!2FdM|B( z^oJWCPhiThFhvAAXdSt^3_&%tny>po*LM{8P-aQ1)WHpU( z+v`z;7bs4IRB5S75AjwXUD>&2bj8GMkpx@1K^YMYdnSankQ_J zjMDW)MuM+9J);lS&u;J0w!ugDMp(6_Jy;t?!1eAge57y~g6rXlQzF&aS7U9rD-Z)goJ585;@kE!JuSlYN-0o8 z0%+tqZc~&G%J!J76#1c*_uZqH2c*yoM9rY$G!dXiyr~STJtc za#{|pA~H8|As0#$Jba%G#38nnC>IMd4KHW#`=-Io%=I|NyH6#xF%0KW;X`mI6Ezt14vTk&ixucC}7!J<^`F3eIx+Sl~x zDjvd|NN;*=x}HBh?BbK#IUM-OOAhV&M!ajlirz;?=a+`0G8Jkgiz5yG#^VP{Y(e78 zHU%zkO(N;0jRakp@X-{cM`4wdMz(M$-p$F)Sbo(h<1W*m?wcm z7h_w5Ttm?`dk>qU%E4{fBFYPc6S>P4Btm{MIUYn#jU#CFYSq1HZa$Q@6;U-jqbNQP zY6xPrtBq+8dtwm##todsp|M3kXRksp_~Jz|IF`u{cV46R^!CNO20wcndfw6G|Ll^)^dkNWOOk&afyBTR8267xx4QU@%GDYy*g*dQpS;^3;&W#iaHMik%Q^2~c

CCsk)%nP-9M00d}}$yWz1Z2teyak=p>_a8b- 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 Z9Bck2XItJ38NS{^yG>E?`v*Ul{}*?aRzd&( literal 0 HcmV?d00001 diff --git a/vignettes/images/plots.jpg b/vignettes/images/plots.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d8a467309a75df7bf42ede8be58809ab25b73d4f GIT binary patch literal 103807 zcmeFa1zeTO^Emv_-Jo=LcS(wrfV3c@#G$(p1;GN5PANg@R*^O^=#-E~R7#`-q@>qK@bK+jD!Lq0Sx}8L_$N{%>hoekJ|y9eV+#z-~vd<5FWU@fwv&Q zNx?k;ylsO}5wfuW&jxQ$93p*iS60=~q8H>9;O7+-1d{xM!jk-AlKevS0{oJ~0+J#k zfE(%VcUyos+(M*1t#DOH`}kFmgA6P}0e4(LN7=Uy9i-6@;bi+boDT_kPY*HRN8ZQB zi9rScOvK;r;r4=?4mfv*AO#2$9UTK54HE+c0}Bfi8O4iJF>SjDwqBKv-Cqj!i;ZTu_QvNLUcA1PKcZ3l|5M91o9Nkb#;(@E^nO zbBG8Nx{3rU%LpM8A)yc~m zO2R031(Wo6)V+rgv(&S}cR%7V*I}Hz{=#OR z&N(3tb=-J)MvjENC!u^7;^yrPC~9{T8tUHY@n00D(p_VoYjRk8%=FbNC0?slh~`Zb zJLZv^%chmro5eHE;M-L@x#^d%W2zoMbyJnb7B{ai79z&ve;u�Ggk8{+yXM05`ZaI5+|lf?Q^ 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 X_~dwjM>Th41UW4YtPWEqzn}RpC5Q06g3S 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 QiPcHW00E%?0O5cC*)vjh3IG5A literal 0 HcmV?d00001 diff --git a/vignettes/qc.Rmd b/vignettes/qc.Rmd new file mode 100644 index 0000000..87bb735 --- /dev/null +++ b/vignettes/qc.Rmd @@ -0,0 +1,32 @@ +--- +title: "Quality Control" +output: + rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{Quality Control} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>", + echo = FALSE +) +``` + +```{r, params, echo = FALSE, include = FALSE} +val_param_rds <- "../inst/validation/results/val_param.rds" +val_param_rds_exists <- file.exists(val_param_rds) +if (file.exists(val_param_rds)) params <- readRDS(val_param_rds) +``` + +```{r, results = "asis", echo = FALSE} +if (val_param_rds_exists) { + res <- knitr::knit_child("../inst/validation/val_report_child.Rmd", quiet = TRUE, envir = environment()) + cat(res, sep = "\n") +} else { + "No quality control results found" +} +```