Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion R/create_nepexplorer_app.R
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
3 changes: 1 addition & 2 deletions R/creatinine_data_fcn.R
Original file line number Diff line number Diff line change
Expand Up @@ -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]])


Expand Down
41 changes: 31 additions & 10 deletions R/init_nepExplorer.R
Original file line number Diff line number Diff line change
Expand Up @@ -11,27 +11,48 @@
#' @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%
c(
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)
}
3 changes: 1 addition & 2 deletions R/nepexplorerMod.R
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
})
Expand Down
102 changes: 102 additions & 0 deletions R/validation_checks_util.R
Original file line number Diff line number Diff line change
@@ -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
}
}
56 changes: 28 additions & 28 deletions data-raw/meta_nepExplorer.csv
Original file line number Diff line number Diff line change
@@ -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
4 changes: 2 additions & 2 deletions data-raw/meta_nepExplorer2.csv
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Binary file modified data/meta_nepExplorer.rda
Binary file not shown.
Loading
Loading