diff --git a/R/create_nepexplorer_app.R b/R/create_nepexplorer_app.R index aad3908..3429407 100644 --- a/R/create_nepexplorer_app.R +++ b/R/create_nepexplorer_app.R @@ -41,7 +41,7 @@ if (is.null(mapping)) { "visit_col" = "VISIT", "visitn_col" = "VISITN", "baseline_flag" = "BLFL", - "baseline_values" = "Y", + "baseline_values" = list("Y" = "Y"), "normal_col_high" = "STNRHI", "id_col" = "USUBJID", "age_col" = "AGE", diff --git a/R/creatinine_data_fcn.R b/R/creatinine_data_fcn.R index 2d0b78a..2c96149 100644 --- a/R/creatinine_data_fcn.R +++ b/R/creatinine_data_fcn.R @@ -15,10 +15,9 @@ creatinine_data_fcn <- function(df, settings) { .data[[settings$measure_col]], .data[[settings$value_col]], .data[[settings$baseline_flag]]) - #get baseline creatinine levels for each subject for hover text baseline_creat <- creatinine_data %>% - filter(.data[[settings$baseline_flag]] == settings$baseline_values) %>% + filter(.data[[settings$baseline_flag]] == settings$baseline_values$Y) %>% select(.data[[settings$id_col]], BASELINE = .data[[settings$value_col]]) diff --git a/R/init_nepExplorer.R b/R/init_nepExplorer.R index 8294744..b5a4ba8 100644 --- a/R/init_nepExplorer.R +++ b/R/init_nepExplorer.R @@ -11,6 +11,26 @@ #' @export init_nepExplorer <- function(data, settings) { + + # check for any missing required settings and warn user + missing_settings <- check_required_settings(expected_settings, settings) + + if (length(missing_settings) > 0) { + warning(paste("The following required nepExplorer settings were not detected:", + paste(names(missing_settings), collapse = ", "))) + } + + # check for any missing columns that are specified in settings + missing_cols_results <- lapply(c("labs", "vitals", "dm"), + function(domain) check_expected_cols(domain, settings, data)) + + missing_cols_msgs <- Filter(Negate(is.null), missing_cols_results) + + if (length(missing_cols_msgs) > 0) { + warning(paste(missing_cols_msgs, collapse = "\n")) + } + + # subset vital signs dataset to blood pressure tests vs_sub <- data$vitals %>% filter(.data[[settings[["vitals"]]$measure_col]] %in% @@ -18,20 +38,21 @@ init_nepExplorer <- function(data, settings) { settings[["vitals"]]$measure_values$DIABP, settings[["vitals"]]$measure_values$SYSBP )) - + + # stack labs and vitals vs_labs <- data$labs %>% bind_rows(vs_sub) - + + #subset dm dataset to usable columns dm_sub <- data$dm %>% dplyr::select(any_of(c(settings[["dm"]][["id_col"]], - settings[["dm"]][["treatment_col"]], - settings[["dm"]][["race_col"]], - settings[["dm"]][["age_col"]]))) - - # left join to keep all rows in dm + settings[["dm"]][["treatment_col"]], + settings[["dm"]][["race_col"]], + settings[["dm"]][["age_col"]]))) + + # left join labs/vitals to keep all rows in dm anly <- dm_sub %>% dplyr::left_join(vs_labs, - by = c(settings[["labs"]][["id_col"]], - settings[["labs"]][["treatment_col"]])) - + by = setNames(settings[["dm"]][["id_col"]], settings[["labs"]][["id_col"]])) + list(data = anly, settings = settings) } diff --git a/R/nepexplorerMod.R b/R/nepexplorerMod.R index f7cef0f..4e15688 100644 --- a/R/nepexplorerMod.R +++ b/R/nepexplorerMod.R @@ -118,10 +118,9 @@ nepexplorer_server <- function(input, output, session, params) { measure_values[grep("nepFC", names(measure_values))]) # update selectize to reflect what's specific in metadata - shinyWidgets::updatePickerInput(session, "measures", - choices = measures, + choices = measures[!is.na(measures)], selected = fold_change_measures ) }) diff --git a/R/validation_checks_util.R b/R/validation_checks_util.R new file mode 100644 index 0000000..7e0359a --- /dev/null +++ b/R/validation_checks_util.R @@ -0,0 +1,102 @@ +#' Expected Settings List +#' +#' This list defines the expected settings for different data domains. +#' Each domain contains specific columns and values that are required for data processing. +#' +#' @format A list with the following structure: +#' \describe{ +#' \item{labs}{A list containing the expected settings for laboratory data: +#' \describe{ +#' \item{id_col}{Column name for the subject identifier (e.g., "USUBJID").} +#' \item{measure_col}{Column name for the measure parameter (e.g., "PARAM").} +#' \item{measure_values}{A list of measure values and their corresponding descriptions +#' (e.g., list("CREAT" = "Creatinine")).} +#' \item{value_col}{Column name for the measurement value (e.g., "STRESN").} +#' \item{unit_col}{Column name for the measurement unit (e.g., "STRESU").} +#' \item{studyday_col}{Column name for the study day (e.g., "DY").} +#' \item{visit_col}{Column name for the visit description (e.g., "VISIT").} +#' \item{visitn_col}{Column name for the visit number (e.g., "VISITN").} +#' \item{baseline_flag}{Column name for the baseline flag (e.g., "BLFL").} +#' \item{baseline_values}{Value indicating baseline (e.g., "Y").} +#' \item{normal_col_high}{Column name for the upper limit of normal range +#' (e.g., "STNRHI").} +#' } +#' } +#' \item{dm}{A list containing the expected settings for demographic data: +#' \describe{ +#' \item{id_col}{Column name for the subject identifier (e.g., "USUBJID").} +#' } +#' } +#' \item{vitals}{A list containing the expected settings for vital signs data: +#' \describe{ +#' \item{id_col}{Column name for the subject identifier (e.g., "USUBJID").} +#' \item{measure_col}{Column name for the measure parameter (e.g., "PARAM").} +#' } +#' } +#' } +expected_settings <- list(labs = list("id_col" = "USUBJID", "measure_col" = "PARAM", + "measure_values" = list("CREAT" = "Creatinine"), + "value_col" = "STRESN", + "unit_col" = "STRESU", + "studyday_col" = "DY", + "visit_col" = "VISIT", + "visitn_col" = "VISITN", + "baseline_flag" = "BLFL", + "baseline_values" = list("Y" = "Y"), + "normal_col_high" = "STNRHI"), + dm = list("id_col" = "USUBJID"), + vitals = list("id_col" = "USUBJID", "measure_col" = "PARAM")) + +#' Check Required Settings in a List +#' +#' This function checks if a given list contains all the required elements specified in another list. +#' It allows for additional elements at any nesting level and prints out a message listing the missing settings, if any. +#' +#' @param required_list A list specifying the required elements. +#' @param actual_list A list to be checked against the required elements. +#' @param parent_key (Optional) A string used internally to track the full key path during recursion. +#' Default is an empty string. +#' @return A list of missing elements, if any. +check_required_settings <- function(required_list, actual_list, parent_key = "") { + missing_elements <- list() + + for (name in names(required_list)) { + full_key <- if (parent_key == "") name else paste(parent_key, name, sep = "$") + + if (!name %in% names(actual_list)) { + missing_elements[[full_key]] <- required_list[[name]] + } else if (is.list(required_list[[name]])) { + if (!is.list(actual_list[[name]])) { + missing_elements[[full_key]] <- required_list[[name]] + } else { + nested_missing <- check_required_settings(required_list[[name]], actual_list[[name]], full_key) + missing_elements <- c(missing_elements, nested_missing) + } + } + } + + return(missing_elements) +} + +#' Check for Missing Columns in Data +#' +#' This function checks for any columns specified in the settings object that are not present in the data. +#' It returns a message listing the missing columns, if any. +#' +#' @param data_domain A string specifying the data domain to check (e.g., "labs", "vitals", "dm"). +#' @param settings_list A list containing the settings for each data domain. +#' @param data_list A list containing the data for each domain. +#' @return A string message listing the missing columns, or NULL if all expected columns are present. +check_expected_cols <- function(data_domain, settings_list, data_list) { + + expected_cols <- settings_list[[data_domain]][!grepl("_values$", names(settings_list[[data_domain]]))] %>% unlist() + + missing_cols <- setdiff(expected_cols, colnames(data_list[[data_domain]])) + + if (length(missing_cols) > 0) { + paste("The following columns were specified in", data_domain, "settings but not found in the", + data_domain, "dataset: ", paste(missing_cols, collapse = ", ")) + } else { + NULL + } +} diff --git a/data-raw/meta_nepExplorer.csv b/data-raw/meta_nepExplorer.csv index 08a6770..4dd7a52 100644 --- a/data-raw/meta_nepExplorer.csv +++ b/data-raw/meta_nepExplorer.csv @@ -1,28 +1,28 @@ -text_key,domain,col_key,field_key,type,label,description,multiple,standard_adam,standard_sdtm -id_col,vitals,id_col,,column,ID column,Unique subject identifier variable name.,FALSE,USUBJID,USUBJID -value_col,vitals,value_col,,column,Value column,Vitals result variable name.,FALSE,AVAL,VSSTRESN -measure_col,vitals,measure_col,,column,Measure column,Vitals measure variable name,FALSE,PARAM,VSTEST -studyday_col,vitals,studyday_col,,column,Study Day column,Visit day variable name,FALSE,ADY,VSDY -visit_col,vitals,visit_col,,column,Visit column,Visit variable name,FALSE,AVISIT,VISIT -visitn_col,vitals,visitn_col,,column,Visit Number column,Visit number variable name,FALSE,AVISITN,VISITNUM -measure_values--SYSBP,vitals,measure_col,SYSBP,field,Systolic value,Value used for Systolic Blood Pressure in the specified measure column,FALSE,Systolic Blood Pressure (mmHg),Systolic Blood Pressure -measure_values--DIABP,vitals,measure_col,DIABP,field,Diastolic value,Value used for Diastolic Blood Pressure in the specified measure column,FALSE,Diastolic Blood Pressure (mmHg),Diastolic Blood Pressure -unit_col,vitals,unit_col,,column,Unit column,Unit of measure variable name,FALSE,,VSSTRESU -vs_baseline_flag,vitals,vs_baseline_flag,,column,Vital Signs Baseline Flag,Column for assigning VS baseline visits,FALSE,ABLFL, -vs_baseline_values--Y,vitals,vs_baseline_flag,Y,field,Vital Signs Baseline Flag value,Value used for VS Baseline in the specified baseline column,FALSE,Y, -measure_values--ALB,labs,measure_col,ALB,field,Albumin value,Value used for Albumin in the specified measure column,FALSE,Albumin (mg/dL),Albumin -measure_values--ALB/CREAT,labs,measure_col,ALB/CREAT,field,Albumin/Creatinine Ratio value,Value used for Albumin/Creatinine ratio in the specified measure column,FALSE,Albumin/Creatinine, -measure_values--BUN/CREAT,labs,measure_col,BUN/CREAT,field,Blood Urea Nitrogen/Creatinine Ratio value,Value used for Blood Urea Nitrogen/Creatinine ratio in the specified measure column,FALSE,Blood Urea Nitrogen/Creatinine, -measure_values--nepFC_BICARB,labs,measure_col,BICARB,field,Bicarbonate value,Value used for Bicarbonate in the specified measure column,FALSE,Bicarbonate (umol/L),Bicarbonate -measure_values--nepFC_BUN,labs,measure_col,BUN,field,Blood Urea Nitrogen value,Value used for Blood Urea Nitrogen in the specified measure column,FALSE,Blood Urea Nitrogen (mmol/L),Blood Urea Nitrogen -measure_values--nepFC_CA,labs,measure_col,CA,field,Calcium value,Value used for Calcium in the specified measure column,FALSE,Calcium (mmol/L),Calcium -measure_values--nepFC_CL,labs,measure_col,CL,field,Chloride value,Value used for Chloride in the specified measure column,FALSE,Chloride (mmol/L),Chloride -measure_values--CREAT,labs,measure_col,CREAT,field,Creatinine value,Value used for Creatinine in the specified measure column,FALSE,Creatinine (mg/dL),Creatinine -measure_values--CYSTC,labs,measure_col,CYSTC,field,Cystatin C value,Value used for Cystatin C in the specified measure column,FALSE,Cystatin C (umol/L),Cystatin C -measure_values--eGFR,labs,measure_col,eGFR,field,eGFR value,Value used for the Estimated Glomerular Filtration Rate in the specified measure column,FALSE,eGFR (mL/min),eGFR -measure_values--eGFRcys,labs,measure_col,eGFRcys,field,eGFRcys value,Value used for the Cystatic C-based Estimated Glomerular Filtration Rate in the specified measure column,FALSE,eGFRcys (mL/min),eGFRcys -measure_values--nepFC_PHOS,labs,measure_col,PHOS,field,Phosphate value,Value used for Phosphate in the specified measure column,FALSE,Phosphate (mmol/L),Phosphate -measure_values--nepFC_K,labs,measure_col,K,field,Potassium value,Value used for Potassium in the specified measure column,FALSE,Potassium (mmol/L),Potassium -measure_values--nepFC_SODIUM,labs,measure_col,SODIUM,field,Sodium value,Value used for Sodium in the specified measure column,FALSE,Sodium (mmol/L),Sodium -baseline_flag,labs,baseline_flag,,column,Baseline Flag column,Column for assigning baseline visits,FALSE,ABLFL,LBBLFL -baseline_values--Y,labs,baseline_flag,Y,field,Baseline Flag value,Value used for Baseline in the specified baseline column,FALSE,Y,Y +text_key,domain,col_key,field_key,type,label,description,multiple,standard_adam,standard_sdtm +id_col,vitals,id_col,,column,ID column,Unique subject identifier variable name.,FALSE,USUBJID,USUBJID +value_col,vitals,value_col,,column,Value column,Vitals result variable name.,FALSE,AVAL,VSSTRESN +measure_col,vitals,measure_col,,column,Measure column,Vitals measure variable name,FALSE,PARAM,VSTEST +studyday_col,vitals,studyday_col,,column,Study Day column,Visit day variable name,FALSE,ADY,VSDY +visit_col,vitals,visit_col,,column,Visit column,Visit variable name,FALSE,AVISIT,VISIT +visitn_col,vitals,visitn_col,,column,Visit Number column,Visit number variable name,FALSE,AVISITN,VISITNUM +measure_values--SYSBP,vitals,measure_col,SYSBP,field,Systolic value,Value used for Systolic Blood Pressure in the specified measure column,FALSE,Systolic Blood Pressure (mmHg),Systolic Blood Pressure +measure_values--DIABP,vitals,measure_col,DIABP,field,Diastolic value,Value used for Diastolic Blood Pressure in the specified measure column,FALSE,Diastolic Blood Pressure (mmHg),Diastolic Blood Pressure +unit_col,vitals,unit_col,,column,Unit column,Unit of measure variable name,FALSE,,VSSTRESU +baseline_flag,vitals,vs_baseline_flag,,column,Vital Signs Baseline Flag,Column for assigning VS baseline visits,FALSE,ABLFL, +baseline_values--Y,vitals,vs_baseline_flag,Y,field,Vital Signs Baseline Flag value,Value used for VS Baseline in the specified baseline column,FALSE,Y, +measure_values--ALB,labs,measure_col,ALB,field,Albumin value,Value used for Albumin in the specified measure column,FALSE,Albumin (mg/dL),Albumin +measure_values--ALB/CREAT,labs,measure_col,ALB/CREAT,field,Albumin/Creatinine Ratio value,Value used for Albumin/Creatinine ratio in the specified measure column,FALSE,Albumin/Creatinine, +measure_values--BUN/CREAT,labs,measure_col,BUN/CREAT,field,Blood Urea Nitrogen/Creatinine Ratio value,Value used for Blood Urea Nitrogen/Creatinine ratio in the specified measure column,FALSE,Blood Urea Nitrogen/Creatinine, +measure_values--nepFC_BICARB,labs,measure_col,BICARB,field,Bicarbonate value,Value used for Bicarbonate in the specified measure column,FALSE,Bicarbonate (umol/L),Bicarbonate +measure_values--nepFC_BUN,labs,measure_col,BUN,field,Blood Urea Nitrogen value,Value used for Blood Urea Nitrogen in the specified measure column,FALSE,Blood Urea Nitrogen (mmol/L),Blood Urea Nitrogen +measure_values--nepFC_CA,labs,measure_col,CA,field,Calcium value,Value used for Calcium in the specified measure column,FALSE,Calcium (mmol/L),Calcium +measure_values--nepFC_CL,labs,measure_col,CL,field,Chloride value,Value used for Chloride in the specified measure column,FALSE,Chloride (mmol/L),Chloride +measure_values--CREAT,labs,measure_col,CREAT,field,Creatinine value,Value used for Creatinine in the specified measure column,FALSE,Creatinine (mg/dL),Creatinine +measure_values--CYSTC,labs,measure_col,CYSTC,field,Cystatin C value,Value used for Cystatin C in the specified measure column,FALSE,Cystatin C (umol/L),Cystatin C +measure_values--eGFR,labs,measure_col,eGFR,field,eGFR value,Value used for the Estimated Glomerular Filtration Rate in the specified measure column,FALSE,eGFR (mL/min),eGFR +measure_values--eGFRcys,labs,measure_col,eGFRcys,field,eGFRcys value,Value used for the Cystatic C-based Estimated Glomerular Filtration Rate in the specified measure column,FALSE,eGFRcys (mL/min),eGFRcys +measure_values--nepFC_PHOS,labs,measure_col,PHOS,field,Phosphate value,Value used for Phosphate in the specified measure column,FALSE,Phosphate (mmol/L),Phosphate +measure_values--nepFC_K,labs,measure_col,K,field,Potassium value,Value used for Potassium in the specified measure column,FALSE,Potassium (mmol/L),Potassium +measure_values--nepFC_SODIUM,labs,measure_col,SODIUM,field,Sodium value,Value used for Sodium in the specified measure column,FALSE,Sodium (mmol/L),Sodium +baseline_flag,labs,baseline_flag,,column,Baseline Flag column,Column for assigning baseline visits,FALSE,ABLFL,LBBLFL +baseline_values--Y,labs,baseline_flag,Y,field,Baseline Flag value,Value used for Baseline in the specified baseline column,FALSE,Y,Y diff --git a/data-raw/meta_nepExplorer2.csv b/data-raw/meta_nepExplorer2.csv index 2485c67..327bf51 100644 --- a/data-raw/meta_nepExplorer2.csv +++ b/data-raw/meta_nepExplorer2.csv @@ -8,8 +8,8 @@ visitn_col,vitals,visitn_col,,column,Visit Number column,Visit number variable n measure_values--SYSBP,vitals,measure_col,SYSBP,field,Systolic value,Value used for Systolic Blood Pressure in the specified measure column,FALSE,Systolic Blood Pressure (mmHg),Systolic Blood Pressure measure_values--DIABP,vitals,measure_col,DIABP,field,Diastolic value,Value used for Diastolic Blood Pressure in the specified measure column,FALSE,Diastolic Blood Pressure (mmHg),Diastolic Blood Pressure unit_col,vitals,unit_col,,column,Unit column,Unit of measure variable name for Blood Pressure,FALSE,STRESU,VSSTRESU -vs_baseline_flag_col,vitals,vs_baseline_flag,,column,VS Baseline Flag,Column for assigning baseline visits for Blood Pressure,FALSE,ABLFL, -vs_baseline_values--POS,vitals,vs_baseline_flag_col,POS,field,VS Baseline Flag value,Value used for Baseline in the specified baseline column for Blood Pressure,FALSE,Y,Y +baseline_flag_col,vitals,vs_baseline_flag,,column,VS Baseline Flag,Column for assigning baseline visits for Blood Pressure,FALSE,ABLFL, +baseline_values--Y,vitals,vs_baseline_flag_col,Y,field,VS Baseline Flag value,Value used for Baseline in the specified baseline column for Blood Pressure,FALSE,Y,Y lab_unit_col,labs,lab_unit_col,,column,Unit column,Unit of measure variable name,FALSE,STRESU,STRESU measure_values--ALB,labs,measure_col,ALB,field,Albumin value,Value used for Albumin in the specified measure column,FALSE,Albumin (g/L),Albumin measure_values--BICARB,labs,measure_col,BICARB,field,Bicarbonate value,Value used for Bicarbonate in the specified measure column,FALSE,Bicarbonate (umol/L),Bicarbonate diff --git a/data/meta_nepExplorer.rda b/data/meta_nepExplorer.rda index 48f8e16..a7c010a 100644 Binary files a/data/meta_nepExplorer.rda and b/data/meta_nepExplorer.rda differ diff --git a/docs/articles/get_started.html b/docs/articles/get_started.html index f314de5..c7f4847 100644 --- a/docs/articles/get_started.html +++ b/docs/articles/get_started.html @@ -5,61 +5,45 @@ -