From a08ca88906ddb54cd3f44b3f864ac756837ae9f4 Mon Sep 17 00:00:00 2001 From: Preston Burns Date: Thu, 6 Jun 2024 21:33:28 +0000 Subject: [PATCH 1/4] #136 move control of fold change labs in patient profile out of mappings tab and into selectize within module --- R/nepexplorerMod.R | 24 +++++++++++---- R/patient_profile_charts.R | 1 - R/patient_profile_mod.R | 12 ++------ data-raw/meta_nepExplorer.csv | 54 +++++++++++++++++----------------- data/meta_nepExplorer.rda | Bin 1367 -> 1370 bytes 5 files changed, 48 insertions(+), 43 deletions(-) diff --git a/R/nepexplorerMod.R b/R/nepexplorerMod.R index 4adb40e..e7a2c1b 100644 --- a/R/nepexplorerMod.R +++ b/R/nepexplorerMod.R @@ -14,7 +14,7 @@ nepexplorer_ui <- function(id) { sidebar <- sidebarPanel( selectizeInput( ns("measures"), - "Select Measures", + "Select Patient Profile Fold Change Measures", multiple = TRUE, choices = c("") ), @@ -42,6 +42,14 @@ nepexplorer_ui <- function(id) { main <- mainPanel( + # HTML header with style specifications. + tags$head( + tags$style( + # hide measure values from mappings tab that we want controlled within "measure" dropdown + HTML("div.field-wrap:has(label[id^='sg-mapping-labs-measure_col-measure_values--nepFC_']) { display: none; }" + ) + ) + ), useShinyjs(), # Scatter PLot + Summary Table UI creatinineScatterUI(ns("scatter")), @@ -98,15 +106,21 @@ nepexplorer_server <- function(input, output, session, params) { }) # Populate sidebar control with measures and select all by default - observe({ + observeEvent(param(), { measure_col <- param()$settings$labs$measure_col measures <- unique(param()$data[[measure_col]]) + measure_values <- param()$settings$labs$measure_values + + # go through metadata file and grab measure values with prefix "nepFC" + fold_change_measures <- intersect(measures, + measure_values[grep("nepFC", names(measure_values))]) + + # update selectize to reflect what's specific in metadata updateSelectizeInput(session, "measures", choices = measures, - selected = measures + selected = fold_change_measures ) - }) animate <- reactive(input$animate) @@ -134,7 +148,7 @@ nepexplorer_server <- function(input, output, session, params) { #Patient Profile (demo tables + lab line charts) observeEvent(selected_subject(), { if (length(selected_subject()) == 1) { # avoid triggering patient profiles if there isn't a subject - patientProfileServer("patprofile", df = param()$data, + patientProfileServer("patprofile", df = param()$data, selected_measures = input$measures, settings = param()$settings, subj_id = selected_subject()) } }, ignoreInit = TRUE) diff --git a/R/patient_profile_charts.R b/R/patient_profile_charts.R index 1df4bc9..d342ebb 100644 --- a/R/patient_profile_charts.R +++ b/R/patient_profile_charts.R @@ -180,7 +180,6 @@ drawULNFoldChange <- function(adlb, settings, "Calcium", "Chloride", "Phosphorus", "Potassium", "Sodium")) { - adlb_FC <- adlb %>% filter(.data[[settings$measure_col]] %in% labs) %>% group_by(.data[[settings$measure_col]]) %>% diff --git a/R/patient_profile_mod.R b/R/patient_profile_mod.R index ea3be71..ba427eb 100644 --- a/R/patient_profile_mod.R +++ b/R/patient_profile_mod.R @@ -30,7 +30,7 @@ patientProfileUI <- function(id) { #' @import dplyr #' @importFrom plotly renderPlotly #' @importFrom magrittr %>% -patientProfileServer <- function(id, df, settings, subj_id) { +patientProfileServer <- function(id, df, selected_measures, settings, subj_id) { moduleServer( id, function(input, output, session) { @@ -95,15 +95,7 @@ patientProfileServer <- function(id, df, settings, subj_id) { output$ULN_FC <- renderUI({ - default_labs <- c(lab_settings$measure_values$BICARB, - lab_settings$measure_values$BUN, - lab_settings$measure_values$CA, - lab_settings$measure_values$CL, - lab_settings$measure_values$PHOS, - lab_settings$measure_values$K, - lab_settings$measure_values$SODIUM) - - available_labs <- intersect(patient_df[[lab_settings$measure_col]] %>% unique(), default_labs) + available_labs <- intersect(patient_df[[lab_settings$measure_col]] %>% unique(), selected_measures) if (length(available_labs) > 0) { drawULNFoldChange(adlb = patient_df, settings = lab_settings, diff --git a/data-raw/meta_nepExplorer.csv b/data-raw/meta_nepExplorer.csv index 752181d..bb62405 100644 --- a/data-raw/meta_nepExplorer.csv +++ b/data-raw/meta_nepExplorer.csv @@ -1,27 +1,27 @@ -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 (g/L),Albumin -measure_values--Albumin/Creatinine,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--BICARB,labs,measure_col,BICARB,field,Bicarbonate value,Value used for Bicarbonate in the specified measure column,FALSE,Bicarbonate (umol/L),Bicarbonate -measure_values--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--CA,labs,measure_col,CA,field,Calcium value,Value used for Calcium in the specified measure column,FALSE,Calcium (mmol/L),Calcium -measure_values--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--PHOS,labs,measure_col,PHOS,field,Phosphate value,Value used for Phosphate in the specified measure column,FALSE,Phosphate (mmol/L),Phosphate -measure_values--K,labs,measure_col,K,field,Potassium value,Value used for Potassium in the specified measure column,FALSE,Potassium (mmol/L),Potassium -measure_values--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 +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 (g/L),Albumin +measure_values--Albumin/Creatinine,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--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/meta_nepExplorer.rda b/data/meta_nepExplorer.rda index 09e0c34938b59555443074b03a0bfe60266410b2..50e1311d69d0d969ab8f13be07c76f03aa917548 100644 GIT binary patch literal 1370 zcmV-g1*Q5zT4*^jL0KkKS;Egt5Xf5HF%{`b`5llVXX-{8Oh|KLCX0RR92&;`C* zu4LiMxO5FV00}}!r-b!3sqIrV^%*riMroiLBRxs!Hm3BU>S>QsFwwM#&|uPKG!lAZ zPstijP-&r{0MIl502*ij00L7;lT%FwKm$Rb0000027mw>0CAy{O)_WzV1P6kGyn{m z000I|fM^vYf@sk+H8zQpQwE`wY(|iNq#lU$jR3?N8&g5-soN(#=4q~*cNlSKNhEm^M3hL5^&-VZ)oLV&e_D^8k|uQ_jUTs&143~|(^)4#II<+Y{SvZ{1D34)mF|w#`QqdW# z%UPEaCWMr0;DO&sWs&mI&st3OV>+rq1jVZMC>+xA&kXgPe*n`=VjjnY_lPqa1AGhR z!y$KYAqm9elHIi3thPYoSI3g=6uRXttLqSH1RjClD_N1YAHPIIP$m$Fx>`{MlE_yR z4q&W6H0j3RMT2NbLo7ldq;~PHYPmc##UP_23Lv4&II=r!c2Wu@Ro-#yVj8%%JEo}i zIgLr=-rS$B3)y--Zo$LzBflJas*ESWGgvg~hP$0dQ3`2*ap}NmBMz8Fh9X9zGLm)D zJy)|TCuAQY6(OhV*9;jyp@SJe=a8i-7lY0Z@7%>F&f zs;^yd*6i52Ov;jR4k(*ovG_E^oqIhnp*z|)Mo?ORWKs{KX0{gDz2VQk9wBN-K#n#5 z-gu>}8=$EuiN}q@bqx%`pmkz!;4E-0M5SKB>s?wTyBIM-{BO1^G& zqe@azqI)$#EH=UaxVRhEf~1}bLdboG9%D`{bsFHu2`YduY7S1zV=y^Z$VHm3Jd~*1yxiRk{1X> z)LbR5qUFo3LaI(jB%c?DL9vP_i>^x}@V}JcS+6`AQRgo69Z@F;t`SH*FE630d&QCE zkf`cCCVNNb^F(RwrTl2-RFL~s@h6Wt3vR_^ zpA|LxnXnfuo(rFfxuytq(GLRu7DVgW(likAIGG7JkaynX7Lw1`*7=s(wIsZfgIiT}mikxmpOFtgIcfJs7*R{#J2 literal 1367 zcmV-d1*rN$T4*^jL0KkKS!X}*V*mwMf5HF%|M%46llVXX-{8Oh|KLCX0RR92&;^-o zd6SD}goJ<$B?=~{nGBgUJrhq*4H^cT9*}5hp`d60)6@U~s-L84WEe^0(LDkg3`_~2 z!Z0IDBLZorLrpX=krHVW)Se{TBQ*^gXaHyc28Mw38UO*1G&nS9&@>tYCLl62G5`Zj zG5`P=AOKX7Oqw)J873-vpOL1i={+N9v{C7%)dti(Oaw4B4eFkuru36_ER+j{n#?=c z3+)0GZ!L$j-;PT@dT%oNNq!mup6s!P4`;Ti2&JeY31&KO|EQANVWKa-?rjo50DVw8 zSDaP1XA0|r<*XjQF_9DcjqU5uGm>S|F##1v3J9kE88VV!hz>PKaxNSLI#J31vWI73 zWAS}40o&A-VIWA`Fhng@B^MB5l9Q#rp`7g+k&zeew6d8P2(<|}Co!HbV6$zs%Bm#a z0icjjm9`K;@+quyz%UDwfK_!IM}nl1J+zS}5+jz8VxsD`5=1>!9}Of-sUr%JA9g$W zWjR@@&PwmES1Y_54le{ktJHe40|-8W`=KJVvw%>bJmx_cS*@8Bc3&U?+LFF9C1EJw zHypf9sVrQ1Qx#oEX=j4aX~%ynuiJKPbIn<;hP!21TCCh|Nvoj7rBt?1e3DI+#oG3B zXgK3VO49A?k&#sKC`7WVKT0{?nDEvsKD)Ab-IFy{BgWY^A5xO6$k;M0Z8BGJtSFA! zYf!SNRFOnx#pq^N_pYbdzH-gGd)I^t^2ldqvy#$OsE8-fj&ob&crey6^^%@K7|w}Q zL71jBV!4=gyj>>Z_3w*|?w(FM?hi$4W}P}GP1N?QU4BOlT#Xei$;7c)7*rJGo>e=xJ7fjfF?F0E zVr z#&P6-UK*;eO>t^_HLjB)q?`kSCde##bVQzgf2tHGE`8CA7M`S15074@_SeMkW!-0v zt^G#KIpL2k4Gk2BI{NP7FS zcz4#FPvx^wq|d}}$aqhn-6!Ze68e6VzP#JkL*0WvGo||%HukE;V+BdXYbk?FLntM5 zYolCO62{Xcl!i&;25_DTh=_*ciNRWEhIAN_h+s?M^AcJD#vD@ZkZ3fa&6Jr7ko3PQ zFYy`TX?K=Ln2_YnE~s|h3-D%MIbi97&)L~;GqQi4yY9E6TPK%h@zkQih;UU!e7kN( zCA3^6uA=43u0pC#7Yv?0eCD-C2B;6v+735sC@OcXD z>fnNq(%mABkZdzaojRIh>SkK0Rs7lT#Jnj;G#hGfQOBDLq?k1o9=|pO=*mLduvsTf zHFq*zE?GJ5d25nhhvP&!*}5?&n_n=_L%`r-B;Y~acObNue+7xig*4HA3IT@rDTPH0 Zq$mfs?Qu{LTl5qBUC9*TLP4DWy^NEMd7uCQ From 892a025136bbec2d2d0d574731e168f7ce028121 Mon Sep 17 00:00:00 2001 From: Preston Burns Date: Thu, 6 Jun 2024 21:40:02 +0000 Subject: [PATCH 2/4] update man --- man/patientProfileServer.Rd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/man/patientProfileServer.Rd b/man/patientProfileServer.Rd index 60c77d3..3a87030 100644 --- a/man/patientProfileServer.Rd +++ b/man/patientProfileServer.Rd @@ -4,7 +4,7 @@ \alias{patientProfileServer} \title{Patient Profile Module Server} \usage{ -patientProfileServer(id, df, settings, subj_id) +patientProfileServer(id, df, selected_measures, settings, subj_id) } \arguments{ \item{id}{module id} From 6ce8079f30cf20bfa0fbf785c13e4723ee5e6812 Mon Sep 17 00:00:00 2001 From: Preston Burns Date: Mon, 10 Jun 2024 19:41:59 +0000 Subject: [PATCH 3/4] add missing argument documentation --- R/patient_profile_mod.R | 1 + man/patientProfileServer.Rd | 2 ++ 2 files changed, 3 insertions(+) diff --git a/R/patient_profile_mod.R b/R/patient_profile_mod.R index ba427eb..139d35d 100644 --- a/R/patient_profile_mod.R +++ b/R/patient_profile_mod.R @@ -22,6 +22,7 @@ patientProfileUI <- function(id) { #' #' @param id module id #' @param df lab dataset in tall format with creatinine lab +#' @param selected_measures vector of tests to include in fold change chart #' @param settings settings object with column mappings #' @param subj_id single subject ID as character string #' diff --git a/man/patientProfileServer.Rd b/man/patientProfileServer.Rd index 3a87030..236c983 100644 --- a/man/patientProfileServer.Rd +++ b/man/patientProfileServer.Rd @@ -11,6 +11,8 @@ patientProfileServer(id, df, selected_measures, settings, subj_id) \item{df}{lab dataset in tall format with creatinine lab} +\item{selected_measures}{vector of tests to include in fold change chart} + \item{settings}{settings object with column mappings} \item{subj_id}{single subject ID as character string} From 6610233f856b462a7a308adfe4c809211bf408b4 Mon Sep 17 00:00:00 2001 From: Preston Burns Date: Mon, 10 Jun 2024 20:17:43 +0000 Subject: [PATCH 4/4] update standalone app example to reflect changes --- inst/examples/standalone_app.R | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/inst/examples/standalone_app.R b/inst/examples/standalone_app.R index be7cf0b..d70eab4 100644 --- a/inst/examples/standalone_app.R +++ b/inst/examples/standalone_app.R @@ -10,18 +10,18 @@ if (!interactive()) { } new_mapping <- list(labs = list("id_col" = "USUBJID", "measure_col" = "TEST", - "measure_values" = list("CREAT" = "Creatinine", + "measure_values" = list("CREAT" = "Creatinine", #specified measures "CYSTC" = "Cystatin C", "eGFR" = "eGFR", "eGFRcys" = "eGFRcys", "ALB/CREAT" = "Albumin/Creatinine", - "BICARB" = "Bicarbonate", - "BUN" = "Blood Urea Nitrogen", - "CA" = "Calcium", - "CL" = "Chloride", - "PHOS" = "Phosphorus", - "K" = "Potassium", - "SODIUM" = "Sodium" + "nepFC_BICARB" = "Bicarbonate", #foldchange measures + "nepFC_BUN" = "Blood Urea Nitrogen", + "nepFC_CA" = "Calcium", + "nepFC_CL" = "Chloride", + "nepFC_PHOS" = "Phosphorus", + "nepFC_K" = "Potassium", + "nepFC_SODIUM" = "Sodium" ), "value_col" = "STRESN", "unit_col" = "STRESU", @@ -45,6 +45,9 @@ vitals = list("id_col" = "USUBJID", "treatment_col" = "ARM", "measure_col" = "TE "vs_baseline_flag" = "BLFL", "visit_col" = "VISIT", "visitn_col" = "VISITN", + "studyday_col" = "DY", + "value_col" = "STRESN", + "unit_col" = "STRESU", "measure_values" = list("DIABP" = "Diastolic Blood Pressure", "SYSBP" = "Systolic Blood Pressure") )