From a7b8eaaa39b3f10f43db6056bd0fcd725a83ca29 Mon Sep 17 00:00:00 2001 From: Jeff Thompson <160783290+jthompson-arcus@users.noreply.github.com> Date: Wed, 9 Oct 2024 09:34:24 -0400 Subject: [PATCH 01/24] Pass additional modifying functions in arguments of `merge_meta_with_data()` --- R/fct_appdata.R | 8 ++++++-- man/merge_meta_with_data.Rd | 7 ++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/R/fct_appdata.R b/R/fct_appdata.R index f0ab2b9a..303026da 100644 --- a/R/fct_appdata.R +++ b/R/fct_appdata.R @@ -57,6 +57,9 @@ get_raw_csv_data <- function( #' @param expected_columns A character vector with the columns that should be #' expected in the data frame. If missing, these columns will be added with #' missing data (thus, will be made explicitly missing). +#' @param .add_fns A list of additional functions to be applied to the data. The +#' functions should take the merged data object as argument and return the +#' modified merged data object. #' #' @return A data frame. #' @export @@ -66,7 +69,8 @@ merge_meta_with_data <- function( meta, expected_columns = c("LBORNR_Lower", "LBORNR_Upper", "LBORRESU", "LBORRESUOTH", "LBREASND", "unit", - "lower_limit", "upper_limit", "LBCLSIG") + "lower_limit", "upper_limit", "LBCLSIG"), + .add_fns = list(fn1 = apply_study_specific_fixes) ){ stopifnot(is.data.frame(data)) stopifnot(inherits(meta, "list")) @@ -112,7 +116,7 @@ merge_meta_with_data <- function( "item_value" = VAL, "reason_notdone" = LBREASND ) |> - apply_study_specific_fixes() + purrr::reduce(.add_fns, \(x1, x2) {x1 |> x2()}, .init = _) attr(merged_data, "synch_time") <- synch_time merged_data } diff --git a/man/merge_meta_with_data.Rd b/man/merge_meta_with_data.Rd index de890352..145ac05c 100644 --- a/man/merge_meta_with_data.Rd +++ b/man/merge_meta_with_data.Rd @@ -8,7 +8,8 @@ merge_meta_with_data( data, meta, expected_columns = c("LBORNR_Lower", "LBORNR_Upper", "LBORRESU", "LBORRESUOTH", - "LBREASND", "unit", "lower_limit", "upper_limit", "LBCLSIG") + "LBREASND", "unit", "lower_limit", "upper_limit", "LBCLSIG"), + .add_fns = list(fn1 = apply_study_specific_fixes) ) } \arguments{ @@ -19,6 +20,10 @@ merge_meta_with_data( \item{expected_columns}{A character vector with the columns that should be expected in the data frame. If missing, these columns will be added with missing data (thus, will be made explicitly missing).} + +\item{.add_fns}{A list of additional functions to be applied to the data. The +functions should take the merged data object as argument and return the +modified merged data object.} } \value{ A data frame. From f091000349ec6c9944d82f79589429148a6633fe Mon Sep 17 00:00:00 2001 From: Jeff Thompson <160783290+jthompson-arcus@users.noreply.github.com> Date: Wed, 9 Oct 2024 14:42:22 -0400 Subject: [PATCH 02/24] Recode to use base R and character values --- R/fct_appdata.R | 10 +++++----- man/merge_meta_with_data.Rd | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/R/fct_appdata.R b/R/fct_appdata.R index 303026da..f5f016b4 100644 --- a/R/fct_appdata.R +++ b/R/fct_appdata.R @@ -57,9 +57,9 @@ get_raw_csv_data <- function( #' @param expected_columns A character vector with the columns that should be #' expected in the data frame. If missing, these columns will be added with #' missing data (thus, will be made explicitly missing). -#' @param .add_fns A list of additional functions to be applied to the data. The -#' functions should take the merged data object as argument and return the -#' modified merged data object. +#' @param .add_fns A character vector of additional functions to be applied to +#' the data. The functions should take the merged data object as argument and +#' return the modified merged data object. #' #' @return A data frame. #' @export @@ -70,7 +70,7 @@ merge_meta_with_data <- function( expected_columns = c("LBORNR_Lower", "LBORNR_Upper", "LBORRESU", "LBORRESUOTH", "LBREASND", "unit", "lower_limit", "upper_limit", "LBCLSIG"), - .add_fns = list(fn1 = apply_study_specific_fixes) + .add_fns = "apply_study_specific_fixes" ){ stopifnot(is.data.frame(data)) stopifnot(inherits(meta, "list")) @@ -116,7 +116,7 @@ merge_meta_with_data <- function( "item_value" = VAL, "reason_notdone" = LBREASND ) |> - purrr::reduce(.add_fns, \(x1, x2) {x1 |> x2()}, .init = _) + Reduce(\(x1, x2) do.call(x2, list(x1)), .add_fns, init = _) attr(merged_data, "synch_time") <- synch_time merged_data } diff --git a/man/merge_meta_with_data.Rd b/man/merge_meta_with_data.Rd index 145ac05c..8eb41b80 100644 --- a/man/merge_meta_with_data.Rd +++ b/man/merge_meta_with_data.Rd @@ -9,7 +9,7 @@ merge_meta_with_data( meta, expected_columns = c("LBORNR_Lower", "LBORNR_Upper", "LBORRESU", "LBORRESUOTH", "LBREASND", "unit", "lower_limit", "upper_limit", "LBCLSIG"), - .add_fns = list(fn1 = apply_study_specific_fixes) + .add_fns = "apply_study_specific_fixes" ) } \arguments{ @@ -21,9 +21,9 @@ merge_meta_with_data( expected in the data frame. If missing, these columns will be added with missing data (thus, will be made explicitly missing).} -\item{.add_fns}{A list of additional functions to be applied to the data. The -functions should take the merged data object as argument and return the -modified merged data object.} +\item{.add_fns}{A character vector of additional functions to be applied to +the data. The functions should take the merged data object as argument and +return the modified merged data object.} } \value{ A data frame. From 1ff5c2d9ffe0321f6225528563944495aa9a75ad Mon Sep 17 00:00:00 2001 From: Jeff Thompson <160783290+jthompson-arcus@users.noreply.github.com> Date: Wed, 9 Oct 2024 15:39:22 -0400 Subject: [PATCH 03/24] Move additional merging functions to metadata --- R/fct_appdata.R | 10 ++++------ R/fct_data_helpers.R | 6 ++++++ data-raw/metadata.xlsx | Bin 56106 -> 56939 bytes data/metadata.rda | Bin 3383 -> 3445 bytes man/merge_meta_with_data.Rd | 7 +------ 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/R/fct_appdata.R b/R/fct_appdata.R index f5f016b4..29a2c937 100644 --- a/R/fct_appdata.R +++ b/R/fct_appdata.R @@ -57,9 +57,6 @@ get_raw_csv_data <- function( #' @param expected_columns A character vector with the columns that should be #' expected in the data frame. If missing, these columns will be added with #' missing data (thus, will be made explicitly missing). -#' @param .add_fns A character vector of additional functions to be applied to -#' the data. The functions should take the merged data object as argument and -#' return the modified merged data object. #' #' @return A data frame. #' @export @@ -69,8 +66,7 @@ merge_meta_with_data <- function( meta, expected_columns = c("LBORNR_Lower", "LBORNR_Upper", "LBORRESU", "LBORRESUOTH", "LBREASND", "unit", - "lower_limit", "upper_limit", "LBCLSIG"), - .add_fns = "apply_study_specific_fixes" + "lower_limit", "upper_limit", "LBCLSIG") ){ stopifnot(is.data.frame(data)) stopifnot(inherits(meta, "list")) @@ -116,7 +112,9 @@ merge_meta_with_data <- function( "item_value" = VAL, "reason_notdone" = LBREASND ) |> - Reduce(\(x1, x2) do.call(x2, list(x1)), .add_fns, init = _) + Reduce(\(x1, x2) do.call(x2, list(x1)), # Apply next function to output of previous + meta$settings$add_fns %||% "identity", # Return merged data if no additional functions + init = _) # Initiate with the merged data attr(merged_data, "synch_time") <- synch_time merged_data } diff --git a/R/fct_data_helpers.R b/R/fct_data_helpers.R index 09cb6e54..2336249e 100644 --- a/R/fct_data_helpers.R +++ b/R/fct_data_helpers.R @@ -29,6 +29,12 @@ get_metadata <- function( meta <- lapply(sheets, function(x){ readxl::read_excel(filepath, sheet = x, col_types = "text") }) + if ("settings" %in% names(meta)) + meta$settings <- + meta$settings |> + as.list() |> + lapply(\(x) as.character(na.omit(x))) + if(length(expand_tab_items[nchar(expand_tab_items) > 0 ] ) == 0) return(meta) if("items_expanded" %in% names(meta)) warning({ "Table 'items_expanded' already present. The old table will be overwritten." diff --git a/data-raw/metadata.xlsx b/data-raw/metadata.xlsx index 182428f71f28ba346b6c05d7c7254cbab5807042..e6cfc5eb7b8f7acf857d85ee8acc9690dab52248 100644 GIT binary patch delta 12038 zcmZ8{1y~$Qv-aZd?(XjH?vmiLI0Ov@4YIfdXK@G+T!RJ@g1fsf8XyFBg7a_k-T$0> zzuD*6si}Iqre|uZy1Tk6o8b=I;E1)=;NbBAhyY{&06+t9X$x+GzyJX981=+_upo2| zjc*p)DKy>1YpoM+tmlCZTA!YNi@C#ms=zk-(zHrH61A}>k?`ZUulE;$*7xDqX^j|S zHD%SXY-UwQm6n}Uu8bMgADErlni{9-DCE5bULN1v)Lmk;k-Av-ipsxyykr*Rrd^l_ zD`8S2ij!_dXFG{7jU_m1+`kG{v&R9kYt}7VTrOi7euy79*h_ak{m7nbJAeJ$PC3uL z)vm8gO|qNV{Dj2oK3bA8CHjqr-b{%~x~U#cy2yzNAE#G>TGul9JZuag`co#qs`8Bu zFQM4(HcHwv<|oiakly5W(DWX1WyFCdd>cWeeAv;%F`^1h`+jK*ixsmr#nBlrI(yg`muee9AFyPH`tPV`}I*vGN}Q^SCq2TlRhgX zB2;%E^yre7kn=A7A~-5q45Q@Sf11XF3AX9C@^A~Q>t@YOFcv;qHcXyo2_0RG-I{?>ptvIa~bPreeFrm!i) zRZ#}%U)CR+HLfr)ot$`+`|xl=rkl$(vSKFJAhW9S$|Lxd^@zOgu=qKT=ax^H@wCq< zRjs|zdgykAvfkr6r*Hr0l$wg-*q>;lIz?Iq@14~Lw`i(TqdCmc5=K`^}!*uXLY)4&S`u| zCGcW>vww&it(H$^N=>dTl4{hlsXj6AdXFxL=XZ8@4)tnpRSi$UL!i6&4(&c&R=o4* z7}6yXQ#Ksoxj-ODQmpECFaDOg8rk4glan1pu(1-sJ1d<>ThzWaZ}O z#OdqeT&)Lj-4;d<1X{dwpM7^4^&!(hs>icNYYHm_zX8I+SJupBujuQibqFC;c_w`A~LqVRS)xIsB-u%&fTen$|i_G<8H7O3G%YB z=)kcI`gVVrILffir4`psY*By**O=~+ywc3 z98u)%1AfFkqYD>J^NNwJ2{y{0nX0$;Y>(WLxf{)q!N%EaEbyn`h0u>~pZ&Z<$}s#4 zUoCdU_8Y8Lstc4(ThI&=q!p89;;=8LkUO6RC0{p%yb|(W?P{v^_UzbJQ~>?_>b3(P z-6nvQh7&n#j2q44Out2uPH+Dap3?R06X)J%&TemWK8vsJTF)meOxlKBTwSPioUb0~ zPwJ}U^Mv5|w8}ORy7Hfs1h5V3Tw6KNdD?|egdb#7SxRl?#ANcFL~82#2nR>^DSgi0 ze0oH>`Jsz2xqjFF3?ip`n_mVpiCkB4?Rq(!#<1BZ3yR2v;j7e80m|tn2_35D6)yYd z$!8H!PmVOY+uW&yS1+lcj;f(9j`u8~>73(ropE!JoY=O13geaF4jg(Kp5`!j(Mkf} zG~K`5URw@e7ofs`H0Gn$IR;>*viBpo&&?Q0%zU;Q4S9p0vjbb*vK9$C>Zo@8xc4u#{|mT%|IW6GE=0 z_I$?`7kQ5Dx1!)bskHX4+dzWs<7aS+Kpa-3eQ=fyG0} zZC;Z<-2_^>^$Uf0ObUl;NiY#WzaNN50RSec4W) z(O_Qdco-QaeJ8T@H2@~~w@scUOnslxi{5gi0^s9e!g z%v4CNNsAM#x0hOyIQ2DOP|_uuwB|*wMfI%fm)Be-7Rho_gn#+(KPmSI7CpIzZU6%1 zCh$2aC-BEQ*EL-yDO1}?wCoc5zxDJ&ocULWATPupy>8~pMeN<)1zn^43BsrznE9OU z&=7Hn0@h+6vElg>7jkFE6LPq*0h|6M9bvm-#N@It5!EU2g(o$Y&Bx0;a&@6RUq0sR z&HJ263ofU5I5gpI!t~l>QBG27wlW~qX=Z&cb|=<>{m7qo(9H03-iFDmnoDHHU_2|M z0_>WO0{dfGzc9y<>ju)yFUpvB$21U$j%pKoUh~I#t68h{GGUyQTy{$G$zj{f^Sg0n zV-=^|ioj@IvB^8Zr`%ojp(@Xu7c=!-ZZsqT_D!;WDUe`^@B1&eWP*3p>E`uYKFe0M zl_}3z@@O5VpSLa2ei|jI<5BM9?sd~|SJ9iC4Kl~P%-mJ$e(jOd?~^r~Q7~n<)?5w{ zB%IPhQ2NcuC@0|>w~RrdC9D}99!9vMO(JjcE?CI{lEV3peSd@Q15M}=Yeyp2{rl=o zxAfQAv4Nn&&YW!nZOFj3w@MF-onWe>PJ4BiO0^2PXs$YvK{g>y8*WYHc!U6hrnUd; zG&k<-$jqQTJ7Cgs@THSLdFoL6rQ*x`z{7b_wy&H;p~ng;J?xrb=G_;)CE*efG}OPm z{QXN!UBe9JMppzz9KqOFKce%g@OL1~;MRiXghTId2zi>!=<9vD?s|+`zDVXi1PM3G zL2e(elUIF4%IQ~E)Pl=gN>j>)A+G-KDITV-Gc3!l1_&$9*HYKyh$RtxsmQ86Y7GvQ ztz}RO*AQigI-ZAYgQ&uZfco~yiMmzCZux1q)an7ZgId=}ifm7i47C7k#t!kyL|sr- za>Elly(BUo5a*8A%eQsRK=qG|_kzdx^DS!(R!^USf}|qF=g9fJzo=ELRO9&X;{jj# zkSu@nV&P#3orHW!hn%jSKRjZczD z63G|Emi=3xKkFXxKd%OiixY$TJjcoH3l9JkWBvK|!5ui9n8GueKjQ2t z8_YaCVp;ZtJ1)gq!nu|IvgU}`W@BsZ{(;p4nqhOkHEUgpsig0`?FXPayUn=a!gWDmada>96?{(3m&?Nd3I4R|A$;$G>Z^dSic>?UKQ=~TZ z*RSju1dmdQxki>I3q6m*ow&UjBE6r{x+UIX$F*Eork8<_^5-j@Ubq0@QapRmuAC6& zBJTrj@5MCjDU~&8bE5l_`HS7Fk6XSM`$sdL=Cd^x)$GxA(k$NcGz4rk4Nnxi`DUnM zhs-;K&o7D>Qm3-4`X6SKKNn)cd{;!OPn13)fb}HMwZxW?nWM2#qUfW6)oI@0u?tN? z4cja!m+MLpjkbpWQI75ZhXdOD_#c)e>@-_n2z9Ylgz)UjgctIX4wCx^>0JC!Z?_cG zumZO;)2LtyFYG zO@^sK6Eo73Ql|)=Kchf;ONKC#OOsS=ja8OPO8UhIP~BNPdP`Y~UuEgz5<0%&!M%xA zOD0p*peg&)NKY*`xlY~m!|ItMYK&fKTKK%Naa?%b+L7)~r0J`n&%8DCM~gF7^jAlA z(EFpuCRy4V(pYI=yZA=dXvBG%>{l!D1E_4zlzjzS&=IZl2e!nCCSO;z*E?<0o`% z$0RQUHP{%VZ+7wo&TQz?s6mLF^9zgq{mO5^^2giM%7HSzVVvRW5~rHMb?JTmK$ZdI=H#46}tnz(l=ZJ8?K-qS^={DGsn+VJ>m7WOK5IL!Ubm#RS+sTF9ON%O3`qo zcg4HnsB4t`sT;wZu;1Z?ag^3$8$Rm9N(cUgSEbN~a?&7H?~G`?lpzYG<+}$yWXFNh zZj@gB+1U}}Dy*?6=!s$CqdxOIo&p7B>3%-jKl)7ksoJf z>85GYO=0n_t`QvkM8f7V6Y>Nd6Io&#zh1)IAMw5Xn7Zi1@23<$Mj$_B0ePC%%j0eJc{N446D-#wSL&Oel#~J#PV7*=g3Wq>Nx~%{_X}8 z>rDsPVyY`uQbWqM=+P8(_b;jzx6QcG6t=&5!_vB>%50^{-}8=b%Z%)(h6ro7#;n@k zE*OIwh=o8TGY0$uN~s?0Pj}DH_3c4z9j2Yn*ORl0lVzUoTc4ipcbi}KXFcEF3#Bc# zXn_JY*4^Arfs&H>k-&ldE04gcFP$g-4^nG4ogjae+3P#V==I$(=+@-p{$9ZEloZ2; zo9%bQ#bo=+_hN6p&F($Po*01X3>t|xia2BCk1auYyT&bf=`txd+!)8ANuF`^Yq5}4 ztc%Nqyq_vXH*@m4eVTK)F|9;CI$m%|BiU{e0y-jdF|DVYgFct$s|smeCNkjayMc_i|8! ztCQ9x{jtMgMa)Rd$8xp5P>IpX8-A^Su-TDG3^xayM+yv6+v10m*h$>M^tix2Glu!kZyp`jJoiEvGjAd zzS@P6a@1;%m%QM$g%jff5}!p*#>v%1u(FXz` zZJCg9vI~>QjV74t(D5hlUqa{;uIot~yzqim8}LW}sH0ctm0TRCY4`=iYvV0r5)aEF9MfTJCGJyu#!=JH@lC@|HL5R*bT;=&f zJ1satVuzQt7VR6sF6&W`f{~BHGlk+b!W<8I7!qc$o2Gd7vru* z+9LMOPNDjg3i<#g8*Od%TFz&XLP^fP10kpp_Jp|HhTIS^57xUMe_yNC-Tbl4yO!A9 zXK2&SIDvAmX!~ojy7AF(?QJxj1i}v7PjO3EjlGvSW5<8AZ;q}MbWjT_0L?>=?>(R& z#2;ldiRo1qvy+&UZsg*^eq~7;j$VhIKmF4!pkIhxpvV%`s1SH0hQMcn>L;QhUPy|IYZO-G3EVa_0 z1h56DXe;la)OylMglL~^1#(-(Jd0CZZ(+#wsop_X+dyFx&6MC2SifkM1(h{MdFJiz zTio*plG`98Ak8j6zB#)xoKWh;p-kWJmGTs-5K&+9CSY!^p2APepCwlC!6Pcj&pp2C z7rmt`xm8r@m4x&OB<&J6IKOI5x|m;ohCSg47H}f|;)jBqDs(eM3i|ql7g_M)tzQS9 zQ-1l))PM5Z=rs|+oU=-E{2i;$WL)h6Vq7D4RFI3sz_sN7e?)PpSLV-jHCs6BTXguA zL~{E0BeS*hm1?%sV#_=RTOLx_NY^jPKNinFKn%*lQA8MC*RuB%GhgB}70ms#2t#`$ zLnn^2mcEW-C*PutMFWj~{WPYjT5c|aZdpC?5Q$knfpee|bt&2Uqd4rqOQFn!+vVqK z-qW}QmKJ(>UWgp>>Up`p>?YQ<0AOA&B{t-`I5p@lFr5#5OI#j2l4lDh_1>lZj#wDhK6RTxZ5Jxpoi`n%pvVyum z$E-ZFA(qhG@!=n(1P8h_I)rB(C$cP8cXzFA@6lmv(sm{4p*>&+sjcY;l*Jg9o3{|) z3lPp()Fk2g^uEd)w)YB?t|NeB)eBjRb{o3;@ih|Wz z?P*Lu24+38$E_w_y+wO6!AfCyeF0&=Y$5sPgBOun#o@E}a%r=2&LPssSBeUdqPVzYXw3Bm;sF85%z-rXYZFU#_LLq@3Lb)gwf1*v|t1Ju!)EXmZ*3MoTm zdETgXG0zg>=r-YDQtR5Fi7^Xh^C;4~X9?e+hsKZ6%o2tw5*&xaMdLxWF|KS4QV(u; zbXBEt_2mWt`^2X8g#qHpT(o(=tb2$ri1ERf5xFU+XwwCAEku0M?8#iAXlrPLN&P-p z{+5Q_j~s9y5jsdZ!^G5YtXkIS3XTJd9ZyG<`J&i9(Oondx(y=Ao3zKb*4u8zqeDc2 z_^};}amkTxQW8LA(z}jmysQ2pyQD~}*^S&}q$UP|Y%baOxd0l+orl70^9>|tM8{j6 z5T9#>n7JXMw9)_?C#c}k+^E;CE|Ll_fW@adod=?$cM9r=mNk zo?5r9$bP&|{nfLBVy>eCsxQU|RDbwf-SOw0eTL7lG-Lw_J6`-KeazEqg{WU1kAcjn zR*$Y|#Yk1B(*_1OR{$tjWLuntYPQ#nC^4J?MC?S35c24qYOZH5(P^ zz4#A?0B~nmzvFK02ySH6Yn5Ults8Q^W@TJ~y-SEfxX1tI+V!s? zpgji8!D%-wT=rFAp^t2B|?TSLBK1%=0WC7q#dA|vHIKYzrtmq%q_Jq9dGTn9)6{j}p`B!XrvinxPz zRPTGn5Y2VEAB-=y(b&HB^!W6oppCI-fW~~P*{3!Xnw1Nk306K)m3rexWJzFcF9l^w zDUR+2kcex}fE)xlNRH~VMpBwsr&cF3LK0V(o3N&|6n`K5T)n4*e^GoZCzS&oglw@I zoON3Xt(?q3h(1_d9|Th~+YE_!A|$5~&4JkkFOo(jBBmi=|N2%5DrbYhrcUK5P%*)} zzSznVY*^hbS_cX!KG4t!N&FjhTK^*m*NiY0p6%PUM53x3D*YfAR^hLF)7^_O&(unzgX-JOy*?D_s6 zpq*1O$;Pe71}aJ8{fyV5H4g$;GugtRG~zP9gGFh7JS)qBre$%!39M|Oq|6h`iCq6%s=!IqItmX(6-&fMZP|3Fc zyH`k10M{D6$V$>@+L|N7kOcLjjQu?=aQkbrHEug{YR^{bc%Hz7`ce!$dH)7`3LD1? zc%HM$1;gJTk{z*Q2%|t9`4%$1QJUeV61_=Y<18kstpwG4Owm>xJX4*nzO`KZGWp#o zg@Tav65Xp{!}Ii>NXGRoj5TU%M8YwIdaV8qGC#jK6`z zKq18E^r2Ww?n6*qn(VXnxbma6av8IGXzZ7J6B(P~{(Zq^jC(rw$q! z!+lFaJNc1VtjJzjrFxi$Qy+HUC#FZ1uc90IGP+W}v=qR_vOs#bm9G}(!OGzUFkpp{~UWbYH#{T^6SCbJxN^9 zj;G0oOwY?Cad?zoM599cnf>x)o?En^7W`Cv*!l@RdmA*a} zER*UWnoh;tQ!x23(3CVw^!Cc~{BHKq;b>wWkVpN=OQfd#ly@MvS_X|M2NPs`^?JZ@ z>)fGb%!^Qd8EHQf11XGWR`$!4`p}UC`YS!vo|U2Y$c20wLej1JAcLw2GY8}Ku-TrI z8#DU&6YP4O_zNzHR9ue6Jr}3yCH|$~F=etT;C}mPwr|Dzof|eYs>a*uyVmrL@5Wn> zCzs+-{2115Ktz#cV?8nvFdd*zkyLCkiJz;t$k^|wodY5wHf$T)S>N54WfCaxuuvA2 z@n^~Jr(8OWEQ%XTG7NhP7{#ZMyr>af>TZS08T84f%_`+_++{ZOw-No_!*JCKr4$-C z3f(5TM91DLfFVhhfzO7kE_joKPyh6Q{t=P-JMP9Q*HxjxnSq*WIjFDWd}Hh!t=#4K zytVioSqyDvXe2{GI3~Mq&Yc(4^bKkFW{v{^Cy}FS?tA~&CAD(m3}kORv|$uuR>j<| zY7O?-evrp){|cKn4`n(}O`PrajTU&!@3~ifh86?-|ILdu9oH~!Z28*IfZ!ghE@6)( z(p}nU+H1BNSdi)p#HRxL(CqE}6P#V2HK9Lw>2LSk+NV{Yt>^Qx6MHzu9LWbrxIx*B z4N&{KcmMc7RI}GNXR_3{{>y$(oiA`YE|IYf!@^c%>&&`8vs=adW`q<Y4*zT?Y{G9=l)We;8znF_0u6wb0=2MBx&S1e-Wx~7cBmn@h3`zV{efd z?TNQ|2A&$CCq=Jg-)!@9O~L2|?>()Sf20P%Yk|hEMK8*1)(Re3={!o6*@%W&U(HlG z%XBM85Sb10|A)Ru^xc|DuEP{e5B$*u(A#D|Dfh4`K{d)F5&4)X1puStB%-Q`rUoR# z0swRHe|<;zKfa@u2%*N0_?>o7h3y}8o18&l&#y9Ya8xO|2oD@&wlJmU(tA2>7gn_^ zb}meIJ|sQ!nGlG&n^j@+02~&-K_kVAOqFI+XMniKfS#F)SQsWQn}3WnX;1M9-#6Vp zz6s*@-XjHQB~7)43akF_uKw|yIH>0&tKPrEDv^(U^n#F%3ZXto z_LC6p*qp1LY1Z;S-F{3-?;*8!l#=HC?%Ux88nBCtCEM?KiQ;x2U?;a(>JoZ=0pd|R z|23exZn2MKxlP9Y$eD9$t2foz>!qt{zMzt-Sq5g#scvu(F)7jEH7{Luc+@Q&y`VB1 zV~Y_ZZ>1$X2$dYXdndbWwZ6BP5nkkPfHx_$Aro>IOv=MRlSgLlZMnsUiIM#49wB5X zA_K`VL>Iv)khHn3rpmVGCt@{;$fQ;Mg#*??u!jAv( zmj;#zWepB@6?T=TMwSsS1Lg)j-q*U!oXTTthz-@jN2qe(KAS4&x*=ok$Ie_Et_cI2 zg!L;1u^gKuW2FMv0&Siopq;(5gH;jqRFse2C*8ZrNSbU#tId-VQ|iEYK(~taZ*Xp4 zQC8Qw)?ini9AncTQqf?m*W;byGtgxoQJ)O1SGz##DlAn+Rk>qexckO!uIOl`>WC9< zUtOGppPmnd-Tnnx{*|#uWJ_dUT$;WF^QT^=k(W0f2}LdZC`lVy`{e{45}}fT4B>Q? zv7QG15aCg9J6bEIcMSo^H^?R#0#e(V@R8%XhGB_0gNpU?SSOR1Mumde#ePw`Vu~0t zTu*vx`Dnd#gPBFi>Gr7X^dTi)dFhpeK8-}v6G5iW=U6Q+5Tnf+$oJ)Mhn%1su)QcP zDDjdt?RsqFHPFYW5sRuL-zbm+bR5Aa+hG!r%i(77t?f8Ht5VG9ccq)#-r9xt=TCHs z;xVmi2OXj@b{|ZJbp@YP7GBARL$2rXNy|B1Oc1wn)#isxr!E_tL@Gp&kw;WU<3xtF zVvXx)EhtvC7k22yK9qSJQ@~J=DWcSOfUwHi`m@g@OXfVDy+>|UhJLK#{p!5ZAE$nD!#?e*>Y;jkTS?LwJ4DnNt z+bO2-u+tvDXhu0JdMdk4P50%FT@LWeVF{0(r+GY=MO1#5m`S06jeaqwtnoWjpS~f0 zr2ACBLXv!eEw>Z4G_MjN|%HSM!nIuk_e<3J(5Zm(P9+NMFm-yOa$bW$%AwyT*vyuX#Rp-!qfs-{BT06eo{ znXeLWqQT|b%tUS7_WK~-cM@+>p`Rrp-u?#DNRYskfyE@G$=eu@KYl#aG&htp8DrZ# zHhbT%qa8p14#-xVGyrEve1Mq*(@F}!F|FH!jU_oTLzu|HX4-I-`nQ>o&SG%7WH<~L zm`utF<`5ht#R^9Y`VFpVgB2PVeakbWryZObU!DDAkO!zdK!*v zC#nEWG?vV_U19FKOC=7ditm`FGY?5gug21ZTB(&jdlzB+wzMS7kgAngcNuG8_{uUi(Xc4BZfPyZ%!+ z%WeCVb53&nr7tLDI(+^0GRA0R93@^SjBUol)o3d4Phdcm^XtEzhQ4%U_(skqDj3kK zZr2=X>~@0#De4m*`kKNa<7iqYJ%zSI5l zOg}bPtoQ^`Pje%1e?}~S!j!TJYvbsTvLA!}8svVkuR@y<8^0=1ZTtjwMt^DK5Y_!f zm(DF2>s08SMQ^^a6b$5cCa$P<3jPZ6`rfCXmg4KS+aV)2te0)h$)sZKZP(t zH8-*4=A6|h<)Rm}n(k?m z!Q80f^XcAApE|mlbs;;af^NKwBH+>O#U9O@oPlf?4eoaAcL$9mLC zlX2i81Q&V21KFHE=*JozPX2|)_I)DJu0n^&+K3=WW?o4BeZ^Q6$PvvSE8Ojk2*n2t z3`{l5rOZ-yYDy7iO{8Q!47;dZvOPNNh9`0HqsNQ)$w6u&&5c>grA)amaDVEM!1s&T zU?L5yM%fl!64ZZde!+QDIxzU)vnfi-e=0?x8vvxxVd&pO1j+#iqLH#|tHHo>0RF8V z{_pz7f13=WfLW($$p5W=0sx5rl|rdY3~q>ioZb4rcueqMaom z|97?Y-yki{zaR%F=-+AKe}m|F|A1hG!QE5%;J{f@*aLpBG%o@8^DH*`KjSkE0Q#!` z_u(TBUYV7Ky^{x%&xyeLD1&Pi$-v_ZsNjG(R#;CJ=p_Sq97?*Y{*~a*^TWoe{UvRo zWSRP3@<|01+%?Y%+oSRK5@~@Sc1`myX$U1(w7>}q(y;Qn;Hd>^xQN#PaJLRVm}!v} zj-e3%wyYxoyDVap{}ZF3b6%YP-9vz56F6&;j{M(v0svtD9{@@Vcxh1_7P}S9(?SSl zUt)zdYzG@INy8#^fwPw+Ve@*xot=c>GpL}n4@|x+4ZAV`E|{PPQ}rQ$qn24=SBAii zP_EzTUoOcC7p&j-U()ptISI~RQH2FfLpdyj+G+^UawGtN3Hn=rS`#$;=j#6fvNXKJ delta 11161 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ɍt8eK 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 diff --git a/man/merge_meta_with_data.Rd b/man/merge_meta_with_data.Rd index 8eb41b80..de890352 100644 --- a/man/merge_meta_with_data.Rd +++ b/man/merge_meta_with_data.Rd @@ -8,8 +8,7 @@ merge_meta_with_data( data, meta, expected_columns = c("LBORNR_Lower", "LBORNR_Upper", "LBORRESU", "LBORRESUOTH", - "LBREASND", "unit", "lower_limit", "upper_limit", "LBCLSIG"), - .add_fns = "apply_study_specific_fixes" + "LBREASND", "unit", "lower_limit", "upper_limit", "LBCLSIG") ) } \arguments{ @@ -20,10 +19,6 @@ merge_meta_with_data( \item{expected_columns}{A character vector with the columns that should be expected in the data frame. If missing, these columns will be added with missing data (thus, will be made explicitly missing).} - -\item{.add_fns}{A character vector of additional functions to be applied to -the data. The functions should take the merged data object as argument and -return the modified merged data object.} } \value{ A data frame. From 5d4a44449045d521bb5b6d64ff39940b40b53aa7 Mon Sep 17 00:00:00 2001 From: Jeff Thompson <160783290+jthompson-arcus@users.noreply.github.com> Date: Thu, 10 Oct 2024 10:01:55 -0400 Subject: [PATCH 04/24] Adjust `%||%` to check for empty values, not just `NULL` --- R/golem_utils_server.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/golem_utils_server.R b/R/golem_utils_server.R index 69be451b..7f6e6177 100644 --- a/R/golem_utils_server.R +++ b/R/golem_utils_server.R @@ -21,7 +21,7 @@ drop_nulls <- function(x) { x[!sapply(x, is.null)] } -#' If x is `NULL`, return y, otherwise return x +#' If x is empty (`NULL` or 0 length), return y, otherwise return x #' #' @param x,y Two elements to test, one potentially `NULL` #' @@ -30,7 +30,7 @@ drop_nulls <- function(x) { #' @examples #' NULL %||% 1 "%||%" <- function(x, y) { - if (is.null(x)) { + if (length(x) == 0) { y } else { x From 64514052a7df7e16435a76400b8cc24ac041809d Mon Sep 17 00:00:00 2001 From: Jeff Thompson <160783290+jthompson-arcus@users.noreply.github.com> Date: Thu, 10 Oct 2024 10:02:38 -0400 Subject: [PATCH 05/24] Specify `add_fns` as `post_merge_fns` --- R/fct_appdata.R | 2 +- data-raw/metadata.xlsx | Bin 56939 -> 56973 bytes data/metadata.rda | Bin 3445 -> 3459 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/R/fct_appdata.R b/R/fct_appdata.R index 29a2c937..2e8d9870 100644 --- a/R/fct_appdata.R +++ b/R/fct_appdata.R @@ -113,7 +113,7 @@ merge_meta_with_data <- function( "reason_notdone" = LBREASND ) |> Reduce(\(x1, x2) do.call(x2, list(x1)), # Apply next function to output of previous - meta$settings$add_fns %||% "identity", # Return merged data if no additional functions + meta$settings$post_merge_fns %||% "identity", # Return merged data if no additional functions init = _) # Initiate with the merged data attr(merged_data, "synch_time") <- synch_time merged_data diff --git a/data-raw/metadata.xlsx b/data-raw/metadata.xlsx index e6cfc5eb7b8f7acf857d85ee8acc9690dab52248..698d7fe0cffe0fb67083a9e81466f10578011cdb 100644 GIT binary patch delta 4532 zcmY+IS3I0ix5j5imk`l=7s=?o3(*H5qxTlQ6QaL*7m1hXLN4*B!bEQ%hjNU8dVDpqweqvuIUZ4Vuju?eAxD{*O3Zb~ih@)4M8YOBjA2$}#nGXF z&I&*qzCA`XzxlxYYhwr{hIHgDKRQsqme)*Cn2GN7d!cCvzPeJ4zOuhqXPIH>vwEG} z?qvOjnxp-t4^vLr05Q@A@cueo8VgdbP`$2M{a$A58|nLmjQu^Tfp1uXN6R(Tk!>~e zhxL1^5%uo6GWNzfx~0-y^2MacY8A(-A$}nvn=90Zlw<=}!P-);49}`37Vqo!ezrI; z3TS!-C&{`GFKzbRF%kTM)%JSkZ=fPFifcB=Bj~=PPf^`^?>UK+(O^~8M|8XL zYJ77clASw0YRzM?0;0B?t-HLoBQCJIkKfdUTP^Y=OWxW?&e@qbkqD>-F^+cL@&c}u zs1>Zg{0=mtwY_?S^*xSyiu_ieHXSKX<5OUlK=MN3fcg1;V9^D^@v;`)ciF}H%ZDj< zy4G#_$ASmNP62T4(d&*SqX9ZWj)lxa5>7m+Bqf@U&4!uXTIfoZ= z!7GoIKFB-mG~$RNZz(KGXl}q(hrm9lwDskAeThul_T!gS;-c5#`ySg5V{>$3cecuX zjKwGk}ehQg--ePBkB?t5q42#o>=@pA;un<74Dp2ShGaKT+h6fvOQtQ2|nVE zV_HWVon;elED-rbUF~nH2nkB`PpBRFSG}GT>_EKRcM;iz7fb*d-d!KlXoowtvp!H4 z8CO5EdvrXxm6q@D4!<3jlE_6T$Nh$ffgEctRtaq|bZT!f>bOF*p(AnX))6k_FG)GB zb$yM2dw|T0cd+zM#i&RHQNQj9i${RmSyRWk$9?4_av<*kO(px^pm*i#h4UO!W?sy~ zPGH9MXEMroIXL`7P$+546vQMj*xGGjibjfwv4{<*D07ru~?1E=FsV6_eAP@;W(3+YK zkmL_=cgq6@J!S>TVt4WWlH%@?HwIGh5;QWgwNP1n7Zs}`Oe#j87!o^zRgqh`dqt`c zJ`Vnc>r@9xK(Zo-vCFt3H#s&;fk^ZbO&!|da6NS{7ir7nNo=`^FC2ug$wFQDa3mG8 z<%YLNNKT(SKGY&^|1FW2@>7RL(U)uh$?%maEQhbY3Tk*qbc;&VBb@eKi_&#dT2=d4dNV*Rq} zGb?wLQS|eWSHJo_)6*$c%`Bu@2Ho~Ta<7s{Xlaa4?pM!kx})hN2dcw8-)-0due--H zsM^0Q-|6l%GCpb5`kbkvdX2w%zfiWCL!jU>x23QN*St?tV!KmYGB|!Jl$v?=@N*Uo zInSKE%I$QzOY*Ye_`0ucyMrLCM`a-*EUW ztwIfTXXrwS$MY{IlAZ}6YToyq+nyF@p732xy@Vk;K4K+8LtrgcjKthmgnHXSTzsRh zHLzUDua^On-Z9m8BXx?OKF8Dyo;ug?+%mGEJg>KAWV6GWUaM0=vL8=7AD#OR@;E72 zX9VGPr1pfQUwDday0<|PGV-u8vTRqMXvjwpvldqV1yMb8L` z9xR9M8xcYvso)D)7GS0CZb$jhZum0VGST(pb}8p)RtUQZn>sC|ag%}=S9P%$65E&h zbgkmg?ZCPa9Ir;w&vBz{aRwTfBG?J+1n^_FFzh2@(?qmN{|M{0zvJMLAg$N(A*mJ3 z7IylxKYPmGIlugE6OdGyRc3IKc$F53|Ha`nPfGg$0a4?+Ad*E2JLyt{w4m*dcXnlgrG zJ+do4gMJ_X9{bPpd9Kq-+xFJKYc1V*U*c5O9BeXF_HZaDG2W}SBj*v$)LZvq);zrm z`s`alVXwv241jVbMJeZOA?`EhC$|i7KSVJM<>Wn8+t;sd=X#^mbDz!d&Qkg(87I#T67PIP4c8|>pR>MhKiiN>vbFJJ3_h6V_&L$bT3C_oAe_q<{rIi;8XfJbO;m& zr(2ksR`I%!^LA3}HNFrGmig!u&)BH+_;#hqyf`$h;kp4Rm>|F7Ae1ZMDH20gD;@pN zascAYOjgf96sgF}Q1Pn(g?RmuxoU<8|%d zEc5yXRS895d_SkoD~=FH>^Y_B8JrR0g-aedm1V25GrvQSXjks|3IF0|RZ>N`rNS1WTeh8&3qFOE+@c?P?xIh(A5}? zhUXFlh5eWL1TtpKVV&Mvd-Gj(2VQ`^w5w*p#XCVToS!f!R<$?rXV%@N=mKrj_n39I z!+;UeA|{GSyY!Gl@%LgA~Gd92L-W?E#q`MnN2-+V(c zd`bhvlUjw%_Pbuj)u)K_T;8(f!?a8`X7;df;6%9DJ6@`v;_q1n?k)F0tY{ZGL3z@C zfex`Tz%d*U?CO;0`WH!N#NK(1&A(|=d>-{1en#5})0U!+(&H1#QI)gqpbK&H!rHVwBSw*FD^4^3J$j^v*v z22_4?nC(Om%xN_=$AyjvX@&E)u~k&BiD#2XO{Xe3hP1+^y7PI)Mm2l%$_!mrJk_sbElTQsgZ` z=F6jd2$KOjjoW|d3cR%Z6-nNiF4=ip=XIEba*N`}aO=zLFT<2=JAU1g>F@1D1S!!= z3Y3ZLTaL9w@_^xrw1(2<_f;>(Nh7iAh?gs7GX4p|UcGG2LSM)vocTXkASNiXF2ukK z=qEYmol|pVCF1p5#Rp?7@hKsjUCEiAheV&1aZ(%CRa?I2-C6p6dqIh#rlzvq2;5QR z1t;$|cy#fumrtCv7fauf4R-Xh8<@4fa{X(NsR z8hq7H1gh(QU1>9Yt2@OdPjq%<7zg|&fD+D8GBSJd-mX46n0f4d7GqfF<}R4QEXtiP~HGxA!b z|K^Dm=ZNvd21HhzDwg9J{ko}gx(EL4h!B>_a#JkBhMYom9LcDD4`rl*oJ6^K2c@uZ zE9C*vIc?3+83A=!!ncHmyCQfG7r}MP=|O~b`;&1`TLrCz+{2hDT=#qK09n}2@PMt# z5Nc(+HXiEHJ|?(A=7zggaU*xhgBmx%#b7)8B^F;$hH~@MXw0>jE@#-va$*56u13Jr zQ?Hm$TjbewFJtNqa^f?^lc0xMXGHw+;h0bgsX>r-S3k=OTaM;Oqujyd`f- zs?f#{;3JfENTe|u>&sFf8Rgg6>d*b-z!QroT+zdEhX1x zOXL1aM{m_EwaR#1WP8Q}DpFI`6R3E5;`!M|Pde9!Hr#^(7MeYRl>ZvfYo&n<%LeCG zZM6;Q$=X|J1!I+ceojZT+B4R{x#L~!);ltkY!ZX#1?z3=FGJcuvA?iQc$KPT3PrMl zHy^x_erd*sox|$x6Fau6G6GTVPUx3x>2}mOd2cc z7Xfm{zpi+lGG6EzhIw{t^*38IEfVZ+&A0q^oAdaz-!#)lc&7J9zK{>|qy!<>x*VQl z?lr_G_|aXcRwyUJ@EftHO=ToKU)D3zwbB(AaZ?ey^>v%GVdCDEj)2%T@(fo#ZNZXU zf?{$#WvBR{w=88n%_nK5|MMkaI{6s3O9JjqQh}Y5 z0?^ms?xYG#nfgZ1oDzUxnQrjalmPT0_+?5376QK!n5G3_n*28y&W{H=O_MSH*HAzp zwEz6Ze+P^3O<~2qJ-A{ZW}1uPe;YflQa2C!P4 z7;K+`!!k7frCcEC4>&9hakFCZLljn}d4pyDa6sz@=e3AIC>jo1(Y{I5(W0=c$2XXb z7KNUJqi98_JxGR8gqDFwi~>{@1Tj1eH;)ktfdKzZ(cS-drz8-Kk%#htw6k(hVbE|^ z5gG($%__pUyFj)sN^o};4($Tz=M

p!vUe0T#^Z|BDB6im=>auyBqOG{p+Qaz}3P aBUS*K3oc+aVMXINg6=#Oe$mAL9QYqa#jHE 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 literal 3445 zcmV-*4T|zYT4*^jL0KkKS|KLCXKmZT{00IaG zA_3qLUOt7)=XxFRurW13HHocKQkPnMUf>#_pirOyqLdJ6Awx`>H1Y?jFpPSD34~x1 zA&AJpm=gjGG#VjH_Ntzf)EI2rMLkT6fCh)Drh`BLXlMWfKmY&%5<*Q9r|lYPqf=2lO@zpx z^*v0Q8UQo{N2q#+N2mrpK&c`VO%p*F6KMrJm`oEu8Aj5cr>2uY(`q)OX$=ADC$W>g zL{zIpIA-aQwh=X{a*izx)E$6f!rtO7t-+|c2sgegD21&;164>V`+K_bQBeP(6;$-Z z#walm5vo;tDi)-fL?O(QjM*O*Y7Kazn=hy}wF9#sgMxI<(ku?T|g$38s^EEDNfBP89a0~ykl z8wD2;0Fe+9lT5}O!oL^-G((){InK%1>UOHP60Bf`>-ipuRQ2@ZkKuKleHO;P{tYWr z4Owp+hkBx_!%c5xL=C((B0b>hfAV-$Qlo~mK0gm8c3R6u7FLEccktFhQ zo`a7}D)f8y{CMG?g3phN!-phQ5U!_gnqH!^q_6al&|;y#!r*MS1Co+kT*1ed#$RQd zep=yYloOgl@)u9D4)xpG+nS3xF<{|X{HWi+*zVE~CzB_^t_CznAuMj^uPyLy`6$8d zXyY_NA>udOt7wA5E5HCYe8`Wo6=gIQMN|P;002Y;L`18!_<&>if!B%RX}z zRy=VViJV&WCYG6Xd(*|O7P?n}3$i90A>BnKWikK(WbY~79p5H}=xM#(+(1HEb5=-P z_GH;a%*iiMAb`bGMW`LHJdg(A2&ou`6%iJq1Rr#$0v-$&1G`Zq64?r}K;uK0=yf^= zLlng>V!=bq^}{ zK!ywq4|%ff6n;q!1KR*_^dy{?R^Wrx7vG`dC%P5lc7oa z^8MC+4VYVlgD=9?vf1wyC(PiJlm)mKUxM)inQ`#RB$7!a{I|mIJi!hbA*0=PFil|_ z5@RW3l1Japt3VIOu1O@4NjX5+2hQ;s`w$(0;$KG!=|G$quaZKf-sxoMe+OfQ+*$mc zj-}0NY)OW#J1vg8RaSPkP8RcCwrv@+U9nAT;VRms?j4e5EdMqm+jrvzWBTMyiPzI> zl5M9=sZ}^Gt9dHyBPllUydEbVvh{tj`Yz8pvxiCJ_x8uw{fo6MV3(zzlrb$5Hv|NH~;`3zQGscrb)N!HEvR06f0>Kre>v|rI#@7>>#1cyE#ud8->7G?vt<$ zYo~hhAi0qiN!HR!uW2vqM0KVVqcu{KD)fi7IV3MRr**DR+IlcZcg}od)!wcxV>vGA zZEa4i`N_67N!yUThpXXNi_2EJt$MZ9YtyuzoJz4O(yU6f>`>656e5Od5ksj$C~r`T z6rmI}W=$E&u`1I~_$9u%I%woknPg(2;SU7TB8qfH7j#7&Y!Qn9!7{{}iG5QlCACh@ zNWZx06g!pUT3>YlvO}~xv*5)cfb_9*x|e!gOr-0>6;;1P)!0-l7xSJR)7B5jU_={g+J_sYx83K!u!AnyaxP#$+^>ET}Hf@-}l zI4E}H2f<|uTT%rWLy2?PLzjgG#)g4I=`HZ|0)@F5F<}rea&&V`=LmBo zDoCV<7s%>$H>uD(P@cS}0@7e~Y=w4MC#m9kUZtD{)3E2}e439610b>sBFMM&m@d$v zts-G3&=_^^w|1rhrlGGq^Z9k_#=QP*a$ZASLQ2K4vYJ}UQq(#+{!e4t>-3G{xVkm` zQ^(FRXG%%O%D!n)BrHJ3aBnCKw;cDYnJIKAC^{1iK*rBwAA^sI+!oN4l2DbBP?eHU zm7HSO#bX$>y<+&bQ(qBY7qhRJ38hf&I~IivvS~YVUr~ZX;U7D$6g=Fc5xh{}>+SB6 zsH(3QyMI4ctw=yQ(0B(AQCRZ(kE!OjU2h}fUjfr+u66in8n7-1wH6EHrRm10lcLtJ zTcH*JP>4bzfIW>kUdt_1NGVTpvlu<(lM(`4ti}&{B*cK1D=~xKNiiTL%FJN*l1xYm zaBY&k`t zAM&ml4bYmQJ~4O8`QwoIrG+IXui^Jk*Q<_IB#j3vw#^ib62o-4%_FmNa4BgoE|p~z zQi@V3RMd_o44}~w`KYBVoZ_arvBa|`x79xeaKL_IqcOr_=}lwVFitoqjp`C)yw?V) zyNG*#@%_`|_wcKM9}q~VinfiBz=<~=mEe~!3r{Z{thB2p2}KwuJ@s&G9F++Khar7K znF=szatzccg0P8@`IcC1Ed@e3oc%mjlGJ^wcJOGmx>iad4nf5d%@(j&Ffgg0FHDIt zy|aTw9BV9JHJ4KgS$A=BB8pwzX2E$OMl)o$ykMVQFQTcU%l95u)h6R>zF`J45B-fG znPbAy7Xy7GDc1QR9QnGZDO^r&1v?g6DoM3MH68Uw zo0_Fmhɍt8eK z@V&ler;>F~Z4k`Svqw9TC{ z!uLSwcB9!oY2I~IkifNsD#u%%3AHds)G{6RrKtI!mc(b=ObbRsyfr6a@~|6bjdQ^e z9oGOpcbs+HiwF>c-3;?d0zj&hQjED(MT|XK)1bV3>73V~(_N?3Hm#E~qLP(RDn$rV zl9eV`gye?Tqn_-cHBE?K*~LqzEb9j7bkF!CffGIP|WbNxL}3U4y#5tPJGwc*&1 z&EMRarxhU$b%jWkDN;zJg!L&A&NCLB?-oNyXzxz&(K))E(=jzOS?xzGw#l_*qq_*C*(`RlHpLQVhaKCJl8!V~+fcPCB}tR$yRlWAho4uK>T1zA zwJTpmR_0u>R3#9M5aSq8cB~dk!AnIg3{jrV*+Ogar77AKZ(u=^fEDa$0W03 zrTovXu*h3{6T3Ep>P?i_ Date: Thu, 10 Oct 2024 10:07:32 -0400 Subject: [PATCH 06/24] Add `pre_merge_fns` setting --- R/fct_appdata.R | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/R/fct_appdata.R b/R/fct_appdata.R index 2e8d9870..b04a1b1e 100644 --- a/R/fct_appdata.R +++ b/R/fct_appdata.R @@ -75,7 +75,10 @@ merge_meta_with_data <- function( synch_time <- attr(data, "synch_time") %||% "" merged_data <- data |> rename_raw_data(column_names = meta$column_names) |> - readr::type_convert(clinsight_col_specs) |> + readr::type_convert(clinsight_col_specs) |> + Reduce(\(x1, x2) do.call(x2, list(x1)), # Apply next function to output of previous + meta$settings$pre_merge_fns %||% "identity", # Return renamed data if no additional functions + init = _) |> # Initiate with the renamed data add_timevars_to_data() |> # fix MC values before merging: fix_multiple_choice_vars(expected_vars = meta$items_expanded$var) |> From 7cf9ee48eca4a7ca5979f8e89511e00682831cbd Mon Sep 17 00:00:00 2001 From: Jeff Thompson <160783290+jthompson-arcus@users.noreply.github.com> Date: Thu, 10 Oct 2024 12:54:31 -0400 Subject: [PATCH 07/24] Add inline function to check existence of an object for `dplyr` mutations --- R/fct_data_helpers.R | 2 +- R/golem_utils_server.R | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/R/fct_data_helpers.R b/R/fct_data_helpers.R index 2336249e..f53a0911 100644 --- a/R/fct_data_helpers.R +++ b/R/fct_data_helpers.R @@ -150,7 +150,7 @@ add_timevars_to_data <- function( dplyr::mutate( edit_date_time = as.POSIXct(edit_date_time, tz = "UTC"), event_date = as.Date(event_date), - day = event_date - min(event_date, na.rm = TRUE), + day = day %|_|% event_date - min(event_date, na.rm = TRUE), vis_day = ifelse(event_id %in% c("SCR", "VIS", "VISEXT", "VISVAR", "FU1", "FU2"), day, NA), vis_num = as.numeric(factor(vis_day))-1, event_name = dplyr::case_when( diff --git a/R/golem_utils_server.R b/R/golem_utils_server.R index 7f6e6177..6502381d 100644 --- a/R/golem_utils_server.R +++ b/R/golem_utils_server.R @@ -52,3 +52,19 @@ drop_nulls <- function(x) { x } } + +#' If x does not exist, return y, otherwise return x +#' +#' @param x,y Two elements to test, one potentially not existent +#' +#' @noRd +#' +#' @examples +#' mtcars2 %|_|% mtcars +"%|_|%" <- function(x, y) { + if (exists(deparse(substitute(x)))) { + x + } else { + y + } +} From ba6c086731f3e116167613ec9db3f05ea6dc8d8f Mon Sep 17 00:00:00 2001 From: Jeff Thompson <160783290+jthompson-arcus@users.noreply.github.com> Date: Thu, 10 Oct 2024 13:25:48 -0400 Subject: [PATCH 08/24] Impute `event_name` from `event` instead of `event_name` --- R/fct_data_helpers.R | 8 ++++---- R/sysdata.rda | Bin 798 -> 788 bytes data-raw/internal_data.R | 2 +- data-raw/metadata.xlsx | Bin 56973 -> 56973 bytes data/metadata.rda | Bin 3459 -> 3459 bytes 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/R/fct_data_helpers.R b/R/fct_data_helpers.R index f53a0911..ee66f6d7 100644 --- a/R/fct_data_helpers.R +++ b/R/fct_data_helpers.R @@ -151,9 +151,9 @@ add_timevars_to_data <- function( edit_date_time = as.POSIXct(edit_date_time, tz = "UTC"), event_date = as.Date(event_date), day = day %|_|% event_date - min(event_date, na.rm = TRUE), - vis_day = ifelse(event_id %in% c("SCR", "VIS", "VISEXT", "VISVAR", "FU1", "FU2"), day, NA), + vis_day = ifelse(grepl("^SCR|^VIS|^FU", event_id), day, NA), vis_num = as.numeric(factor(vis_day))-1, - event_name = dplyr::case_when( + event_name = event_name %|_|% dplyr::case_when( event_id == "SCR" ~ "Screening", event_id %in% c("VIS", "VISEXT", "VISVAR") ~ paste0("Visit ", vis_num), grepl("^FU[[:digit:]]+", event_id) ~ paste0("Visit ", vis_num, "(FU)"), @@ -161,9 +161,9 @@ add_timevars_to_data <- function( event_id == "EOT" ~ "EoT", event_id == "EXIT" ~ "Exit", form_id %in% c("AE", "CM", "CP", "MH", "MH", "MHTR", "PR", "ST", "CMTR", "CMHMA") ~ "Any visit", - TRUE ~ paste0("Other (", event_name, ")") + TRUE ~ paste0("Other (", event, ")") ), - event_label = dplyr::case_when( + event_label = event_label %|_|% dplyr::case_when( !is.na(vis_num) ~ paste0("V", vis_num), event_id == "UN" ~ paste0("UV", event_repeat), TRUE ~ event_name diff --git a/R/sysdata.rda b/R/sysdata.rda index 0e2f6218e3017d3128b79ff35a00ec33fc31bee1..1c5599e04272b6071c08721c6c458328d8251a72 100644 GIT binary patch delta 774 zcmV+h1Nr=(29yR4LRx4!F+o`-Q(3K`LJN@&9De|y00I=#Q1of2Xk^4>4GkFvCKE#@ z4qy{Z0%R}%69m8j0OkQSz$QZg0WeGe01jXiOaf#u022hj002mkfeeB)z^Uyf(rrk2 zAP+{=P326t7w8iF6G54sa?rMA!v@+`(2xVT5p`iSNEHJUM1}}$2}44hh(Ygk=P)a{ zqJK!KjBU(9_dOVT{NN91yq!spJdh(p1Xq-d;4~tlOj?+)S5P?F6oHE?`WStRRE%i@ zK-x(lD>?sr>o6y4s%4~SW{9tE$o{kzmKcqFdvOOc_(~(Kw(2z1EJRn7w1r1SU_82J zPXa=zGz^&MlA1vkG?2BS2{eQui31QQXn#nCge46F8XE?N&@ezIKlA4aC6S4wG$l5L z2?P!jUZ#s&6NyT6aR4x;Izs6rm(+7;DiBart%M~H!$ZOVpkZXkAxXg<>w!t436TU8 z8gW8!Gq8fWlXeqhFqxYOD!B#RQu1d~X7H|RYnlv}a)iGx`}rAabW~9#sa=2c@Jk5TI%hXEA98FVwG}LT@(O13YmC zSJ?IJBtlrtCV}l8r0g@mIPqMh7Yxv>3zwV{G7vWms-o9_*6b!046uY2pp;}Sz0d%~ zM5RwWYKK(}EeYl-G#?#=DH)Zg z00L5JH7DXx`Y2>%7$LL-(UVL}f#`DpnqU(lfB={#000Lt38n!u7yt=^U;qFlNFa?g z(Ha<({FL^I>O&9*sPabirkl+g#J zHb(`-q|pS(f(i{dkwL)Dq6;QX+D(kcW>~>n&|k?fCVP`R#bngivJ5W3P>6-lqJOlA z;$Mm43_@H`D&A^pWza9M1jrw^r=ltIF-D{eKxhH)?}T;u7J<0|*bo4}XE7Pz|a}fOeJxLGf#yhfr>{_A8Gq$2K;7)k_}* zWyd8h#QPDWu7*GZD&|1LFBYn-04h;!lGYO-xb81p0kNTxM%xp$po--EB6M5);>nxV zb>uQc%;+G*(y>qiI+pYSunk8}oTYDZw-Z;$(ijIib@Jy>+yM48hC&n#LU|2FZGgr3 z7JGCfb-**nFll{HyJ;d4&TKW0aPB8*ssYD}=ODahwP||zK_dbN)H1dRGG9@mV0gje zpg{qv&_Yab0XvZz>bcRyY8YG-$f>OJ+Cq_%yv!vwpKCDTLXc`a&u>u+rx_U}3{ofm Oi@744C`bdk@|%FDc2j%+ diff --git a/data-raw/internal_data.R b/data-raw/internal_data.R index a388f16d..8a706bf9 100644 --- a/data-raw/internal_data.R +++ b/data-raw/internal_data.R @@ -34,7 +34,7 @@ clinsight_col_specs <- c( "subject_id" = "c", "event_id" = "c", "event_date" = "D", - "event_name" = "c", + "event" = "c", "event_repeat" = "i", "form_id" = "c", "form_repeat" = "i", diff --git a/data-raw/metadata.xlsx b/data-raw/metadata.xlsx index 698d7fe0cffe0fb67083a9e81466f10578011cdb..352e0713fe37c947509b55298dce9bb820eff6fd 100644 GIT binary patch delta 4836 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 Z0syrCvi|9yD21s{IR71{wb=@s{{T>iJuv_P delta 4822 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 Q#9}$p|2~=B6 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 delta 3458 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 Date: Thu, 10 Oct 2024 14:23:13 -0400 Subject: [PATCH 09/24] Fix broken tests --- tests/testthat/_snaps/fct_appdata.md | 64 +++++++++--------- .../testapp-raw/altered_metadata.xlsx | Bin 54515 -> 54533 bytes 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/tests/testthat/_snaps/fct_appdata.md b/tests/testthat/_snaps/fct_appdata.md index ec24ab51..f07a5a64 100644 --- a/tests/testthat/_snaps/fct_appdata.md +++ b/tests/testthat/_snaps/fct_appdata.md @@ -30,45 +30,45 @@ Code df[c(1, 1000, 2000, 3000, 4000, 5000), ] Output - # A tibble: 6 x 23 - site_code subject_id event_id event_date event_name event_repeat form_id - - 1 9600 9600-001 SCR 2022-11-09 Screening 1 DM - 2 NA NA - 3 NA NA - 4 NA NA - 5 NA NA - 6 NA NA - # i 16 more variables: form_repeat , edit_date_time , day , - # vis_day , vis_num , event_label , item_name , - # item_type , item_group , item_value , item_unit , - # lower_lim , upper_lim , significance , reason_notdone , - # region + # A tibble: 6 x 24 + site_code subject_id event_id event_date event event_repeat form_id + + 1 9600 9600-001 SCR 2022-11-09 Screening 1 DM + 2 NA NA + 3 NA NA + 4 NA NA + 5 NA NA + 6 NA NA + # i 17 more variables: form_repeat , edit_date_time , day , + # vis_day , vis_num , event_name , event_label , + # item_name , item_type , item_group , item_value , + # item_unit , lower_lim , upper_lim , significance , + # reason_notdone , region --- Code df Output - # A tibble: 543 x 23 - site_code subject_id event_id event_date event_name event_repeat form_id - - 1 9600 9600-001 SCR 2022-11-09 Screening 1 DM - 2 9600 9600-001 SCR 2022-11-09 Screening 1 DM - 3 9600 9600-002 SCR 2022-01-01 Screening 1 DM - 4 9600 9600-002 SCR 2022-01-01 Screening 1 DM - 5 9600 9600-002 SCR 2022-01-01 Screening 1 DM - 6 9600 9600-002 SCR 2022-01-01 Screening 1 STE - 7 9600 9600-002 SCR 2022-01-01 Screening 1 STE - 8 9600 9600-002 SCR 2022-01-01 Screening 1 VS - 9 9600 9600-002 SCR 2022-01-01 Screening 1 VS - 10 9600 9600-002 SCR 2022-01-01 Screening 1 VS + # A tibble: 543 x 24 + site_code subject_id event_id event_date event event_repeat form_id + + 1 9600 9600-001 SCR 2022-11-09 Screening 1 DM + 2 9600 9600-001 SCR 2022-11-09 Screening 1 DM + 3 9600 9600-002 SCR 2022-01-01 Screening 1 DM + 4 9600 9600-002 SCR 2022-01-01 Screening 1 DM + 5 9600 9600-002 SCR 2022-01-01 Screening 1 DM + 6 9600 9600-002 SCR 2022-01-01 Screening 1 STE + 7 9600 9600-002 SCR 2022-01-01 Screening 1 STE + 8 9600 9600-002 SCR 2022-01-01 Screening 1 VS + 9 9600 9600-002 SCR 2022-01-01 Screening 1 VS + 10 9600 9600-002 SCR 2022-01-01 Screening 1 VS # i 533 more rows - # i 16 more variables: form_repeat , edit_date_time , day , - # vis_day , vis_num , event_label , item_name , - # item_type , item_group , item_value , item_unit , - # lower_lim , upper_lim , significance , reason_notdone , - # region + # i 17 more variables: form_repeat , edit_date_time , day , + # vis_day , vis_num , event_name , event_label , + # item_name , item_type , item_group , item_value , + # item_unit , lower_lim , upper_lim , significance , + # reason_notdone , region # get_appdata works: produces the expected output diff --git a/tests/testthat/fixtures/testapp-raw/altered_metadata.xlsx b/tests/testthat/fixtures/testapp-raw/altered_metadata.xlsx index ad8313e478731c2e2619cac987700691ee3ac304..ea325c99efdf79f9f391da9ae70e0749ecdc1634 100644 GIT binary patch delta 8841 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 Date: Thu, 10 Oct 2024 14:31:44 -0400 Subject: [PATCH 10/24] Further generalize `add_timevars_to_data()` --- R/fct_data_helpers.R | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/R/fct_data_helpers.R b/R/fct_data_helpers.R index ee66f6d7..d14bc984 100644 --- a/R/fct_data_helpers.R +++ b/R/fct_data_helpers.R @@ -151,22 +151,22 @@ add_timevars_to_data <- function( edit_date_time = as.POSIXct(edit_date_time, tz = "UTC"), event_date = as.Date(event_date), day = day %|_|% event_date - min(event_date, na.rm = TRUE), - vis_day = ifelse(grepl("^SCR|^VIS|^FU", event_id), day, NA), + vis_day = ifelse(grepl("^SCR|^VIS|^FU", event_id, ignore.case = TRUE), day, NA), vis_num = as.numeric(factor(vis_day))-1, event_name = event_name %|_|% dplyr::case_when( - event_id == "SCR" ~ "Screening", - event_id %in% c("VIS", "VISEXT", "VISVAR") ~ paste0("Visit ", vis_num), - grepl("^FU[[:digit:]]+", event_id) ~ paste0("Visit ", vis_num, "(FU)"), - event_id == "UN" ~ paste0("Unscheduled visit ", event_repeat), - event_id == "EOT" ~ "EoT", - event_id == "EXIT" ~ "Exit", - form_id %in% c("AE", "CM", "CP", "MH", "MH", "MHTR", "PR", "ST", "CMTR", "CMHMA") ~ "Any visit", - TRUE ~ paste0("Other (", event, ")") + grepl("^SCR", event_id, ignore.case = TRUE) ~ "Screening", + grepl("^VIS", event_id, ignore.case = TRUE) ~ paste0("Visit ", vis_num), + grepl("^FU[[:digit:]]+", event_id, ignore.case = TRUE) ~ paste0("Visit ", vis_num, "(FU)"), + grepl("^UN", event_id, ignore.case = TRUE) ~ paste0("Unscheduled visit ", event_repeat), + toupper(event_id) == "EOT" ~ "EoT", + toupper(event_id) == "EXIT" ~ "Exit", + grepl("^AE|^CM|^CP|^MH|^PR|^ST", form_id) ~ "Any visit", + .default = paste0("Other (", event, ")") ), event_label = event_label %|_|% dplyr::case_when( !is.na(vis_num) ~ paste0("V", vis_num), - event_id == "UN" ~ paste0("UV", event_repeat), - TRUE ~ event_name + grepl("^UN", event_id, ignore.case = TRUE) ~ paste0("UV", event_repeat), + .default = event_name ), .by = subject_id ) |> @@ -174,7 +174,7 @@ add_timevars_to_data <- function( factor(site_code, levels = order_string(site_code)), factor(subject_id, levels = order_string(subject_id)) ) - if(any(grepl("^Other ", df$event_name))) warning( + if(any(is.na(df$event_name) | grepl("^Other ", df$event_name))) warning( "Undefined Events detected. Please verify data before proceeding." ) df From 325c27df2d58a574a6bf8691003e49e50a54a42b Mon Sep 17 00:00:00 2001 From: Jeff Thompson <160783290+jthompson-arcus@users.noreply.github.com> Date: Thu, 10 Oct 2024 16:00:12 -0400 Subject: [PATCH 11/24] Initialize region field --- R/fct_appdata.R | 1 + 1 file changed, 1 insertion(+) diff --git a/R/fct_appdata.R b/R/fct_appdata.R index b04a1b1e..40f3d36f 100644 --- a/R/fct_appdata.R +++ b/R/fct_appdata.R @@ -115,6 +115,7 @@ merge_meta_with_data <- function( "item_value" = VAL, "reason_notdone" = LBREASND ) |> + dplyr::mutate(region = region %|_|% "Missing") |> Reduce(\(x1, x2) do.call(x2, list(x1)), # Apply next function to output of previous meta$settings$post_merge_fns %||% "identity", # Return merged data if no additional functions init = _) # Initiate with the merged data From 25065001f9b2b3e74d70f5501474cb1dc1eb7118 Mon Sep 17 00:00:00 2001 From: Jeff Thompson <160783290+jthompson-arcus@users.noreply.github.com> Date: Fri, 11 Oct 2024 09:31:59 -0400 Subject: [PATCH 12/24] Add mid-merging functions --- R/fct_appdata.R | 36 +++++++++++++++++++++++++++--------- data-raw/metadata.xlsx | Bin 56973 -> 56987 bytes data/metadata.rda | Bin 3459 -> 3484 bytes 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/R/fct_appdata.R b/R/fct_appdata.R index 40f3d36f..55efdda0 100644 --- a/R/fct_appdata.R +++ b/R/fct_appdata.R @@ -83,21 +83,20 @@ merge_meta_with_data <- function( # fix MC values before merging: fix_multiple_choice_vars(expected_vars = meta$items_expanded$var) |> dplyr::right_join(meta$items_expanded, by = "var") |> - dplyr::filter(!is.na(item_value)) |> + dplyr::filter(!is.na(item_value)) |> + readr::type_convert(clinsight_col_specs) |> + Reduce(\(x1, x2) do.call(x2, list(x1)), # Apply next function to output of previous + meta$settings$mid_merge_fns %||% "identity", # Return renamed data if no additional functions + init = _) |> # Initiate with the renamed data dplyr::mutate( - suffix = ifelse(item_name == "ECG interpretation", "LBCLSIG", suffix), - suffix = ifelse(is.na(suffix), "VAL", suffix), - # TODO: improve code below to handle exceptions in a more general manner - suffix = ifelse(suffix %in% c("LBORRES", "VSORRES", "EGORRES") | - item_group %in% c("Cytogenetics", "General"), - "VAL", suffix) + suffix_names = suffix_names %|_|% ifelse(is.na(suffix) | grepl("ORRES$", suffix) | item_group == "General", "VAL", suffix) ) |> - dplyr::select(-var) |> + dplyr::select(-var, -suffix) |> dplyr::mutate( edit_date_time = max(edit_date_time, na.rm = TRUE), .by = c(subject_id, item_name, event_name, event_repeat) ) |> - tidyr::pivot_wider(names_from = suffix, values_from = item_value) |> + tidyr::pivot_wider(names_from = suffix_names, values_from = item_value) |> add_missing_columns(expected_columns) |> dplyr::mutate( LBORNR_Lower = as.numeric(ifelse(!is.na(lower_limit), lower_limit, LBORNR_Lower)), @@ -124,6 +123,25 @@ merge_meta_with_data <- function( } +#' Apply study-specific suffix fixes +#' +#' These changes are study/EDC-specific and part of the legacy code for ClinSight. +#' +#' @param data A data frame +#' +#' @return A data frame. +apply_study_specific_suffix_fixes <- function(data) { + dplyr::mutate(data, + suffix = ifelse(item_name == "ECG interpretation", "LBCLSIG", suffix), + suffix = ifelse(is.na(suffix), "VAL", suffix), + # TODO: improve code below to handle exceptions in a more general manner + suffix_names = ifelse(suffix %in% c("LBORRES", "VSORRES", "EGORRES") | + item_group %in% c("Cytogenetics", "General"), + "VAL", suffix) + ) +} + + #' Apply study-specific fixes #' #' These changes are probably study-specific and need to be changed accordingly. diff --git a/data-raw/metadata.xlsx b/data-raw/metadata.xlsx index 352e0713fe37c947509b55298dce9bb820eff6fd..de630fc117416f78e47565bc018a32dfb2c46387 100644 GIT binary patch delta 5037 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 delta 5023 zcmZ9QXHXMNx5pEz^cH#vNUxzvm)=5`CLkT;0YQp_C}`*c5?VmOgf5^V0VFi(h|&b4 z_fVyG=|#9cez@;@?|%B7|Jj*yX3p-+{ukLy2yZ5=oFF5k8;5gIR%G)oR zqIWYjsa(u~H>fkvt~K#!4>x-2sj>cpwR(3s){Q;wb*E0)bwKmOtK;lXHdFv_sbLCX zn*y%{3^yZ_jgOAEf~~Zp3z^}yD=dLgP=T44r%J?lrYa2grFy*X7Edctlz65rFT-0o z#*ZsZ(Fl4&Nhi=#ex+)WMxydBS2eb*tYy}K10zF`d3!U5va0>n;)fh+nF}W*&!=NM zCSHT9oGTlV3+vnHgoh}y+H@O$?_>DgL$IxYrXJ5Es%t@-Z{p`qIGSS@3tPGt#Qr+H ze+{IxZH32%+lkv~-kK8}YHIeaz1!kAoTl>lW7*=^rf9ik3DiOKQ_2VmnwES76q|a- z;k*BkQNB9bLb=k%RK6=zY5s}0py6zKAc^+wLVIe8Vgm_ch+$U*PA*?<Y3PnawZZOOIj^5xyR*G- zIb=XBzRHrC?RM28B~~4F=>9!5#5wm=u$!Fy9k}nTG8nAYFR1nG#6l6nHqXodD1bZ3 z&KoIcx8|cdOa)t*To@0ni%=ShuZ17ckfMxu z=jE4#ve_Ol>FTtgyLwU)%goNEoa=@>x0KPYbB+v?^rdPQLLx!7_j@? zqNf?Nx)RVM|4^Yl7e1%Ar0R8P$@b3S+h&aSg`Sd$X^)~6eO1r=kD%Gyq)_ysruP>q z%ZqlZ3c-2nr}I=ELxn`1y)o#B7Ou^W^U_oOvEM(mNZ~J z4`R$isKbLqRnOS>PHcD8YiOj;Pi)E#<%&rJS$9oggxpiAN1GwB?3BK|{+u)Vv+=6O zBqKetCzetlP8F`y9E)qWqVZZ47%|CAnIxQz|9*s+n^^t}`{68Szxl~Y3fJ#I20W-Z z_D$?tx~`T-Aqbbz1CoEzjGB*}F@do29(f)~d*4V8!r%95dV@L9Quv)+`OF!(g8_$J z!@f)5Qp?D-e7oPmO9Kgz2^a!0YMJZbl}K;S8DKKqDE>0!pb{VaYgJ9x6R9d!i;`(X zCBuLS4JHt|4VxP(;?JEYBu9LrV?}_eNnnVXB%~y5?4IZ`r`UW{JCB$)PnmnshftfK z(E8v$T8y)i?^-4LVwbbq#im!MC_{m=_WYXl$KJ-Wxx72gxbO&*EHy7QKcmEQrzBsk zr6MwseoevHRy#=+_)($X0GZi6}- zp2ro-w&Fx8#BXPkE06u;ig(6$DbS^Hh&yuZ4e2~&X*C~)+ASNcXz}4J2I^MU#5^?} z4eE~PW8xVex>Q_{v=p3m-Am|#*)YMP;CF8sR#d)f+;%VRjl5>ndD3zpv*et;YMYYC z!1WWg)-JUCoez0fDinV+JXLKux!5A&S|GBnk}KwFGUcPhvR)b)70S#28HWspABEqR z;%`=)==8aa`Jn*f8K$Cm@jk_IXOZk(N&Xws>a#r!A}x@!P0ZqQwqzoqNM zncwO@@o3435Hi{gQ(f2lKFlE!v2LDDt+$*jY8*uyMvuMdh~;AFvZz8I$>}cB*72I+ zNWWs*&oeeZrg!HY>fR_-DB(;%+av1jr;93i(Y7c7^WGan7cJZwjlym6eH>9}F#!M| zNc`{UfeHw2Y7nd#@GZF25BPWA3v!534hE}Dp+~sb$vdvo!>t`4oJ!$oJNfg z1hKkVkLK4O2a$>=SxyV>?vMLq?NIIqp6Sbpkw>NrOTg@3Fi9WA6_i2A?|Xf+7;KPn z&0nNmuB+MJwz62FGYP=qgK`JaTCU>k8zzL%c>1ZWlCjtd_P$FNfd?r??Yv)PT1;eA zT9F0@F4bchhvpC0vi3&us)U!91n_G&vRY+rDA!_+zDZYf^m3c42iZAOSBvAHNUK}iIZkx=QY=0OEO<$_THsU zD+~0jjECPcY@*)pVxJ(;LU|Svul8m1V!FF`M2j5LR`|8&cgSd?rhME&hS1cWgqX-H zj_D{d2YB;j9*I|UCmTl8-Spn=;Bl|xtzW&wN(}WPgb_P2acMU%`(h=pfe1cXAz(Vf zSXPb&BvD3FP5u}>NL{$|gg`{M>IYH3_RDBLT(Rs0DcLLMsbKqC0Kj|12NhwMZNe4? zXJYVF1E5`Hlp+c6o)84xN^FY_jhpLWty@Qi+LB!^8tq1MEM@x7gv8tLOvIsqrl#i1)ap7q%wYrPe zYAuTUFm4|$AM=<^zvX%2aiKPZ|1KepwPunddz<&>qn%z>bB>LycG5JDAjz0m1rne( zeRDtAE1ndW)t@<$4bzOf&-n!maSxY$7B`hj)Xtp@AAL&W#s7Vc?#hvHwZjGf>vUds z?C9XeiL9dtRHXmFQVzzn)dc-Lf<&X`q(*;yYkHwp#wU3pGwZ89mL7Kb zAjecBbeAY#+T_TgXh6`GKE1*_*E1&p%2@0=*P>gT)60g|hM6tVWfbxTqU^i8wTCi~ ziiOTlDtWcAkd#&vY)vz~NizOqcXi>g9vo7MTUo4Q@1pjjQn^EOYEy!%{n?XDE~GLV(%%y^~RTb&O47h1~2SF_FEuPX&n8 z(V|DS8mrChta=nQUci`zrcGe;8jF5;{2EvLOw@JlQ^@@(VJt<&>;uoUY&p&RrBq8? zGye5{@5I|{4`u=T91q7ErS-4U*TjV#Gk%vL*c<;^*wDjbmk=g??-iJr8)H zC%@!JT2G;s7C!E8tq%$%;|&Gq%>`>UFie>G*qH+0O+PHec{N^0&|b_v27e1iMFY1U zr6_Fmk5ipw>TAyMSoI&DN<2eK_Q!STPOJKAkVH%9@R6tq&UxM`QGo|!S` zY+$tzx8oFQht&;Zea+NbS-&Lha<0sJnWlS8zwXmVg+&N*ARNpH(bi{KGp+Catmnz# z8jECOCMur+sabv(Uk0S4KBYOPk_<49WQRBnHbsh>yID$BRAx1DSu-Bjiv z{c%=VHpy6o)+i-?zvNFqD>uAfZh`#~8FNpR$R$3ZPjq2=BF6RIWkd`%W?_gC2G3yN z)9BXqbxyGBZ`Z-b`UUTPpIi1#UMCta8KA-zFtB`4l#IbKk~bT5iz5%_MTeQ~T)nXT zckHRC3Kxc@{JL9JbnTNLnfPx|42+ey=9JMjQ4ki*5Eec8EtmLRal(lmb;*3nN&T~7 z!<^ppR-81utMf7?P(mx6Mhp`VYjaBol$4^Q_<$2!rc8=Ij;+#U%v$AI;IInFT0HO# zE=!U12?@K?d94>=Vg8S7NP9zh(El5$vX=qs9N~&hBt!n*^Po5$2O^5IVuZ{vUxEcfDZ7gkdPfaBW+%B!w z(3`AXJ-3Fum2V7vTr~_!D5PgJdI{W=i@z`2czg*-dx-IR3gAMLchD)ppNQXv$`i(_ zx6q7PV0WpGxVR@eNIcOl$Lp;BTSObms zK%JY-hx}aCjpC6<@nb~30=~4beujr^qr*VjZcU<01D%{A>afgpU!%er!6M;GAIYV6 zoWFJ74EL%#NMn+@yuY&U<|Oc4B2%;MSpqoSdAW+)*s{Mqp3ebA=yv~;R0s|$8rooY zooSCHkyHk4)eXel_?z*)T3kxVy(vtlR*LnE0+~LSJ-RC%I{wjaA}c__dg*ri4H>sl z5%c=tVBU4Mjf}M=dDxxeVN#O0;|3^y2(tx}a^H?Nqz?os&xcE;uG5(mu4HpT^t+4K zo}8nq9rBjfY~5clr!HuLvE`m)!3O;AH2G+bWMo_Xk*QHS^G~yvVYXs72z4e#oV-qe zA2E0cP2q*ZRto@OPLIAwg1*g@UQ+Xz&S)WPH`C2TXTH8(baw9QoYM>(t6HToKwa!) zTJNO8H5}8P?C#};8r+@gVS5=7lws|L>Lk<6uV>1zgC9Ine51>v_#@r9##*v7)Ia3j z1E-Z)vvTpK`@U@#OCgYB zt*H1!jvbrrcKE~P{5$#Aj+T(f75a=v;>MCi$k6ZdyLSXz;RW`}vjzOOKug0N{(>vm zQw4F)`tCHbH)-bS9v;%~qkucfci(X^9~)nFM5&aV=S?OL^P!|UhpSCPn`M^B%&I>_ zT8$2<{xx?vy*ee%|N7NQ7?tJtkKY3TSOEXMR;Uo%V~mKsQ3w!)0FUVqK$-pup<@t& zWzN6YJ_Z5mAP)ZIB1QfRl_JCl#%WrF>o^;Mxx`-yCP9qI8mHy>kGuH)h4`iaZk!s2 z5CG&5+;WTv@B}UU|2{@}007W`_XU6>pc5KEHbmlt5GKv9JLj4DtX5j&#+e1Yhm z(I60PLzuUL5a3x6U>gEDs{!mrB+hCOTy-LT%vum!btCxj>IBH|eZ)HgwHXO6pZ{^@_zs;{d&0o diff --git a/data/metadata.rda b/data/metadata.rda index d81059f3ea1ecaac1b12321387ce811e6a97cd0d..a41a511259d1b058897e8f90b4651d1162b91959 100644 GIT binary patch literal 3484 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 From c9755b7d2c47ac616becdf3502f582dc26ed2273 Mon Sep 17 00:00:00 2001 From: Jeff Thompson <160783290+jthompson-arcus@users.noreply.github.com> Date: Fri, 11 Oct 2024 09:36:22 -0400 Subject: [PATCH 13/24] Update version and NEWS --- DESCRIPTION | 2 +- NEWS.md | 2 ++ inst/golem-config.yml | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 4eccaca8..979e2598 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: clinsight Title: ClinSight -Version: 0.1.0.9000 +Version: 0.1.0.9001 Authors@R: c( person("Leonard DaniĆ«l", "Samson", , "lsamson@gcp-service.com", role = c("cre", "aut"), comment = c(ORCID = "0000-0002-6252-7639")), diff --git a/NEWS.md b/NEWS.md index a2c68eb2..930d9445 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,7 @@ # clinsight (development version) +- Generalized `merge_meta_with_data()` to allow user-defined processing functions. + # clinsight 0.1.0 ## Changed diff --git a/inst/golem-config.yml b/inst/golem-config.yml index d489d7c7..c4db010d 100644 --- a/inst/golem-config.yml +++ b/inst/golem-config.yml @@ -1,6 +1,6 @@ default: golem_name: clinsight - golem_version: 0.1.0 + golem_version: 0.1.0.9001 app_prod: no user_identification: test_user study_data: !expr clinsight::clinsightful_data From f48ebac7bd44a45eff2b549657156add31cbabc1 Mon Sep 17 00:00:00 2001 From: Jeff Thompson <160783290+jthompson-arcus@users.noreply.github.com> Date: Mon, 14 Oct 2024 10:13:31 -0400 Subject: [PATCH 14/24] Remove duplicate type conversion --- R/fct_appdata.R | 1 - 1 file changed, 1 deletion(-) diff --git a/R/fct_appdata.R b/R/fct_appdata.R index 55efdda0..a7bad4ad 100644 --- a/R/fct_appdata.R +++ b/R/fct_appdata.R @@ -84,7 +84,6 @@ merge_meta_with_data <- function( fix_multiple_choice_vars(expected_vars = meta$items_expanded$var) |> dplyr::right_join(meta$items_expanded, by = "var") |> dplyr::filter(!is.na(item_value)) |> - readr::type_convert(clinsight_col_specs) |> Reduce(\(x1, x2) do.call(x2, list(x1)), # Apply next function to output of previous meta$settings$mid_merge_fns %||% "identity", # Return renamed data if no additional functions init = _) |> # Initiate with the renamed data From 6087b0e41502e954aa0635ee9cfa13106055ec12 Mon Sep 17 00:00:00 2001 From: Jeff Thompson <160783290+jthompson-arcus@users.noreply.github.com> Date: Mon, 14 Oct 2024 10:34:09 -0400 Subject: [PATCH 15/24] Create `apply_custom_functions()` to handle --- R/fct_appdata.R | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/R/fct_appdata.R b/R/fct_appdata.R index a7bad4ad..25b66173 100644 --- a/R/fct_appdata.R +++ b/R/fct_appdata.R @@ -76,17 +76,13 @@ merge_meta_with_data <- function( merged_data <- data |> rename_raw_data(column_names = meta$column_names) |> readr::type_convert(clinsight_col_specs) |> - Reduce(\(x1, x2) do.call(x2, list(x1)), # Apply next function to output of previous - meta$settings$pre_merge_fns %||% "identity", # Return renamed data if no additional functions - init = _) |> # Initiate with the renamed data + apply_custom_functions(meta$settings$pre_merge_fns) |> add_timevars_to_data() |> # fix MC values before merging: fix_multiple_choice_vars(expected_vars = meta$items_expanded$var) |> dplyr::right_join(meta$items_expanded, by = "var") |> dplyr::filter(!is.na(item_value)) |> - Reduce(\(x1, x2) do.call(x2, list(x1)), # Apply next function to output of previous - meta$settings$mid_merge_fns %||% "identity", # Return renamed data if no additional functions - init = _) |> # Initiate with the renamed data + apply_custom_functions(meta$settings$mid_merge_fns) |> dplyr::mutate( suffix_names = suffix_names %|_|% ifelse(is.na(suffix) | grepl("ORRES$", suffix) | item_group == "General", "VAL", suffix) ) |> @@ -114,9 +110,7 @@ merge_meta_with_data <- function( "reason_notdone" = LBREASND ) |> dplyr::mutate(region = region %|_|% "Missing") |> - Reduce(\(x1, x2) do.call(x2, list(x1)), # Apply next function to output of previous - meta$settings$post_merge_fns %||% "identity", # Return merged data if no additional functions - init = _) # Initiate with the merged data + apply_custom_functions(meta$settings$post_merge_fns) |> attr(merged_data, "synch_time") <- synch_time merged_data } @@ -209,6 +203,19 @@ apply_study_specific_fixes <- function( ) } +#' Apply custom modification functions +#' +#' @param data A data frame (for example, raw data merged). +#' @param functions A character vector containing the names of the functions to +#' apply to the data. Default is NULL. +#' @param .default A character vector containing the names of the functions to +#' apply if none are provided. Default is "identity". +apply_custom_functions <- function(data, functions = NULL, .default = "identity") { + Reduce(\(x1, x2) do.call(x2, list(x1)), # Apply next function to output of previous + functions %||% .default, # Apply default functions if no additional functions provided + init = data) # Initialize with the data object +} + #' Get appdata #' #' Converts data to a list of data frames in the expected format to be used by the From a98092059e5ca05171fc99bb8eed5937d557faee Mon Sep 17 00:00:00 2001 From: Jeff Thompson <160783290+jthompson-arcus@users.noreply.github.com> Date: Mon, 14 Oct 2024 11:07:41 -0400 Subject: [PATCH 16/24] Clean up metadata settings element generation --- R/fct_data_helpers.R | 9 ++++----- data/metadata.rda | Bin 3484 -> 3473 bytes 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/R/fct_data_helpers.R b/R/fct_data_helpers.R index d14bc984..835aadc3 100644 --- a/R/fct_data_helpers.R +++ b/R/fct_data_helpers.R @@ -29,11 +29,10 @@ get_metadata <- function( meta <- lapply(sheets, function(x){ readxl::read_excel(filepath, sheet = x, col_types = "text") }) - if ("settings" %in% names(meta)) - meta$settings <- - meta$settings |> - as.list() |> - lapply(\(x) as.character(na.omit(x))) + + meta$settings <- meta$settings |> + lapply(\(x) as.character(na.omit(x))) |> + Filter(f = length) if(length(expand_tab_items[nchar(expand_tab_items) > 0 ] ) == 0) return(meta) if("items_expanded" %in% names(meta)) warning({ diff --git a/data/metadata.rda b/data/metadata.rda index a41a511259d1b058897e8f90b4651d1162b91959..4ebf6b99ea0e293c4f4a097307bc5d63a00ec8ca 100644 GIT binary patch literal 3473 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 literal 3484 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 Date: Mon, 14 Oct 2024 11:32:30 -0400 Subject: [PATCH 17/24] Remove extraneous pipe --- R/fct_appdata.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/fct_appdata.R b/R/fct_appdata.R index 25b66173..bd7a6938 100644 --- a/R/fct_appdata.R +++ b/R/fct_appdata.R @@ -110,7 +110,7 @@ merge_meta_with_data <- function( "reason_notdone" = LBREASND ) |> dplyr::mutate(region = region %|_|% "Missing") |> - apply_custom_functions(meta$settings$post_merge_fns) |> + apply_custom_functions(meta$settings$post_merge_fns) attr(merged_data, "synch_time") <- synch_time merged_data } From 4d7fd4524cd3ae3388fec1dd161d5a1265b630c4 Mon Sep 17 00:00:00 2001 From: Jeff Thompson <160783290+jthompson-arcus@users.noreply.github.com> Date: Mon, 14 Oct 2024 11:45:17 -0400 Subject: [PATCH 18/24] Reset `%||%` to standard evaluation --- R/golem_utils_server.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/golem_utils_server.R b/R/golem_utils_server.R index 6502381d..6016c7c6 100644 --- a/R/golem_utils_server.R +++ b/R/golem_utils_server.R @@ -21,7 +21,7 @@ drop_nulls <- function(x) { x[!sapply(x, is.null)] } -#' If x is empty (`NULL` or 0 length), return y, otherwise return x +#' If x is `NULL`, return y, otherwise return x #' #' @param x,y Two elements to test, one potentially `NULL` #' @@ -30,7 +30,7 @@ drop_nulls <- function(x) { #' @examples #' NULL %||% 1 "%||%" <- function(x, y) { - if (length(x) == 0) { + if (is.null(x)) { y } else { x From 6adeceabf46f549fc1b6cabb7ab3cb4b0f2e2e69 Mon Sep 17 00:00:00 2001 From: Jeff Thompson <160783290+jthompson-arcus@users.noreply.github.com> Date: Mon, 14 Oct 2024 13:03:37 -0400 Subject: [PATCH 19/24] Display message if using user supplied data. --- R/golem_utils_server.R | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/R/golem_utils_server.R b/R/golem_utils_server.R index 6016c7c6..e9051da5 100644 --- a/R/golem_utils_server.R +++ b/R/golem_utils_server.R @@ -55,14 +55,16 @@ drop_nulls <- function(x) { #' If x does not exist, return y, otherwise return x #' -#' @param x,y Two elements to test, one potentially not existent +#' @param x,y two elements to test, one potentially not existent +#' @param verbose logical, indicating whether warning message should be displayed. #' #' @noRd #' #' @examples #' mtcars2 %|_|% mtcars -"%|_|%" <- function(x, y) { - if (exists(deparse(substitute(x)))) { +"%|_|%" <- function(x, y, verbose = TRUE) { + if (exists(deparse1(substitute(x)))) { + if (verbose) warning(paste("Using user supplied", deparse(deparse1(substitute(x))), "instead of deriving."), call. = FALSE) x } else { y From b001c9b6560558423e8f8ffab694fe0e889c8fb6 Mon Sep 17 00:00:00 2001 From: Jeff Thompson <160783290+jthompson-arcus@users.noreply.github.com> Date: Mon, 14 Oct 2024 13:11:50 -0400 Subject: [PATCH 20/24] Remove `event_name` from required columns --- R/fct_data_helpers.R | 2 +- R/sysdata.rda | Bin 788 -> 783 bytes data-raw/internal_data.R | 1 - data-raw/metadata.xlsx | Bin 56987 -> 56926 bytes data/metadata.rda | Bin 3473 -> 3456 bytes 5 files changed, 1 insertion(+), 2 deletions(-) diff --git a/R/fct_data_helpers.R b/R/fct_data_helpers.R index 835aadc3..e8d9df29 100644 --- a/R/fct_data_helpers.R +++ b/R/fct_data_helpers.R @@ -160,7 +160,7 @@ add_timevars_to_data <- function( toupper(event_id) == "EOT" ~ "EoT", toupper(event_id) == "EXIT" ~ "Exit", grepl("^AE|^CM|^CP|^MH|^PR|^ST", form_id) ~ "Any visit", - .default = paste0("Other (", event, ")") + .default = paste0("Other (", event_id, ")") ), event_label = event_label %|_|% dplyr::case_when( !is.na(vis_num) ~ paste0("V", vis_num), diff --git a/R/sysdata.rda b/R/sysdata.rda index 1c5599e04272b6071c08721c6c458328d8251a72..aaebb8b1fde1745701cbb2bcab33aed33e711170 100644 GIT binary patch literal 783 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 O5VS&x delta 6545 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 From 568a05f7f86511b827e38a28ab74b162a482fed7 Mon Sep 17 00:00:00 2001 From: Jeff Thompson <160783290+jthompson-arcus@users.noreply.github.com> Date: Mon, 14 Oct 2024 13:31:01 -0400 Subject: [PATCH 21/24] Resolve test errors --- tests/testthat/_snaps/fct_appdata.md | 64 +++++++++++++-------------- tests/testthat/test-rename_raw_data.R | 4 +- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/tests/testthat/_snaps/fct_appdata.md b/tests/testthat/_snaps/fct_appdata.md index f07a5a64..6b4ec7b9 100644 --- a/tests/testthat/_snaps/fct_appdata.md +++ b/tests/testthat/_snaps/fct_appdata.md @@ -30,45 +30,45 @@ Code df[c(1, 1000, 2000, 3000, 4000, 5000), ] Output - # A tibble: 6 x 24 - site_code subject_id event_id event_date event event_repeat form_id - - 1 9600 9600-001 SCR 2022-11-09 Screening 1 DM - 2 NA NA - 3 NA NA - 4 NA NA - 5 NA NA - 6 NA NA - # i 17 more variables: form_repeat , edit_date_time , day , - # vis_day , vis_num , event_name , event_label , - # item_name , item_type , item_group , item_value , - # item_unit , lower_lim , upper_lim , significance , - # reason_notdone , region + # A tibble: 6 x 23 + site_code subject_id event_id event_date event_repeat form_id form_repeat + + 1 9600 9600-001 SCR 2022-11-09 1 DM 1 + 2 NA NA NA + 3 NA NA NA + 4 NA NA NA + 5 NA NA NA + 6 NA NA NA + # i 16 more variables: edit_date_time , day , vis_day , + # vis_num , event_name , event_label , item_name , + # item_type , item_group , item_value , item_unit , + # lower_lim , upper_lim , significance , reason_notdone , + # region --- Code df Output - # A tibble: 543 x 24 - site_code subject_id event_id event_date event event_repeat form_id - - 1 9600 9600-001 SCR 2022-11-09 Screening 1 DM - 2 9600 9600-001 SCR 2022-11-09 Screening 1 DM - 3 9600 9600-002 SCR 2022-01-01 Screening 1 DM - 4 9600 9600-002 SCR 2022-01-01 Screening 1 DM - 5 9600 9600-002 SCR 2022-01-01 Screening 1 DM - 6 9600 9600-002 SCR 2022-01-01 Screening 1 STE - 7 9600 9600-002 SCR 2022-01-01 Screening 1 STE - 8 9600 9600-002 SCR 2022-01-01 Screening 1 VS - 9 9600 9600-002 SCR 2022-01-01 Screening 1 VS - 10 9600 9600-002 SCR 2022-01-01 Screening 1 VS + # A tibble: 543 x 23 + site_code subject_id event_id event_date event_repeat form_id form_repeat + + 1 9600 9600-001 SCR 2022-11-09 1 DM 1 + 2 9600 9600-001 SCR 2022-11-09 1 DM 1 + 3 9600 9600-002 SCR 2022-01-01 1 DM 1 + 4 9600 9600-002 SCR 2022-01-01 1 DM 1 + 5 9600 9600-002 SCR 2022-01-01 1 DM 1 + 6 9600 9600-002 SCR 2022-01-01 1 STE 1 + 7 9600 9600-002 SCR 2022-01-01 1 STE 1 + 8 9600 9600-002 SCR 2022-01-01 1 VS 1 + 9 9600 9600-002 SCR 2022-01-01 1 VS 1 + 10 9600 9600-002 SCR 2022-01-01 1 VS 1 # i 533 more rows - # i 17 more variables: form_repeat , edit_date_time , day , - # vis_day , vis_num , event_name , event_label , - # item_name , item_type , item_group , item_value , - # item_unit , lower_lim , upper_lim , significance , - # reason_notdone , region + # i 16 more variables: edit_date_time , day , vis_day , + # vis_num , event_name , event_label , item_name , + # item_type , item_group , item_value , item_unit , + # lower_lim , upper_lim , significance , reason_notdone , + # region # get_appdata works: produces the expected output diff --git a/tests/testthat/test-rename_raw_data.R b/tests/testthat/test-rename_raw_data.R index 94e0b232..fd7db26e 100644 --- a/tests/testthat/test-rename_raw_data.R +++ b/tests/testthat/test-rename_raw_data.R @@ -1,7 +1,7 @@ describe("rename_raw_data() renames raw study data and throws informative errors if needed.", { it("renames a data frame as expected", { - col_names <- metadata$column_names + col_names <- rbind(metadata$column_names, list("Placeholder", "pl")) testdata <- lapply(mtcars, as.character) |> as.data.frame() col_names$name_raw <- names(testdata) @@ -11,7 +11,7 @@ describe("rename_raw_data() renames raw study data and throws informative errors }) it("errors with incorrect input", { - col_names <- metadata$column_names + col_names <- rbind(metadata$column_names, list("Placeholder", "pl")) col_names$name_raw <- names(mtcars) expect_error( rename_raw_data(mtcars, column_names = "incorrect input"), From 12b28f180a6e01221e1198f6d80a744658673bd5 Mon Sep 17 00:00:00 2001 From: Jeff Thompson <160783290+jthompson-arcus@users.noreply.github.com> Date: Tue, 15 Oct 2024 08:37:02 -0400 Subject: [PATCH 22/24] Specify the `parent.frame()` as the environment to check existence within --- R/golem_utils_server.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/golem_utils_server.R b/R/golem_utils_server.R index e9051da5..33492d03 100644 --- a/R/golem_utils_server.R +++ b/R/golem_utils_server.R @@ -63,7 +63,7 @@ drop_nulls <- function(x) { #' @examples #' mtcars2 %|_|% mtcars "%|_|%" <- function(x, y, verbose = TRUE) { - if (exists(deparse1(substitute(x)))) { + if (exists(deparse1(substitute(x)), envir = parent.frame())) { if (verbose) warning(paste("Using user supplied", deparse(deparse1(substitute(x))), "instead of deriving."), call. = FALSE) x } else { From ea4714ab12883b93b60d3529647b08cec3c3c8d7 Mon Sep 17 00:00:00 2001 From: Jeff Thompson <160783290+jthompson-arcus@users.noreply.github.com> Date: Tue, 15 Oct 2024 08:58:48 -0400 Subject: [PATCH 23/24] Add tests for `%|_|%` --- tests/testthat/test-golem_utils_server.R | 27 ++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/testthat/test-golem_utils_server.R b/tests/testthat/test-golem_utils_server.R index 08376179..b1bbe06e 100644 --- a/tests/testthat/test-golem_utils_server.R +++ b/tests/testthat/test-golem_utils_server.R @@ -44,3 +44,30 @@ test_that("%|NA|% works", { ) }) +test_that("%|_|% works", { + expect_equal( + mtcarrs %|_|% iris, + iris + ) + expect_warning( + test_wrn <- mtcars %|_|% iris, + 'Using user supplied "mtcars" instead of deriving.' + ) + expect_equal( + test_wrn, + mtcars + ) + expect_warning( + test_wrn <- dplyr::mutate(mtcars, test = mpg %|_|% "RHS"), + 'Using user supplied "mpg" instead of deriving.' + ) + expect_equal( + test_wrn, + cbind(mtcars, list(test = mtcars$mpg)) + ) + expect_equal( + dplyr::mutate(mtcars, test = mpg2 %|_|% "RHS"), + cbind(mtcars, list(test = "RHS")) + ) +}) + From 3e9dc7b21e04efa3ce988b9785cff238bde3f3b6 Mon Sep 17 00:00:00 2001 From: Jeff Thompson <160783290+jthompson-arcus@users.noreply.github.com> Date: Tue, 15 Oct 2024 11:03:13 -0400 Subject: [PATCH 24/24] Change `warning()` to `cat()` --- R/golem_utils_server.R | 2 +- tests/testthat/test-golem_utils_server.R | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/R/golem_utils_server.R b/R/golem_utils_server.R index 33492d03..907d64cd 100644 --- a/R/golem_utils_server.R +++ b/R/golem_utils_server.R @@ -64,7 +64,7 @@ drop_nulls <- function(x) { #' mtcars2 %|_|% mtcars "%|_|%" <- function(x, y, verbose = TRUE) { if (exists(deparse1(substitute(x)), envir = parent.frame())) { - if (verbose) warning(paste("Using user supplied", deparse(deparse1(substitute(x))), "instead of deriving."), call. = FALSE) + if (verbose) cat("Using user supplied", deparse(deparse1(substitute(x))), "instead of deriving.\n") x } else { y diff --git a/tests/testthat/test-golem_utils_server.R b/tests/testthat/test-golem_utils_server.R index b1bbe06e..929991bd 100644 --- a/tests/testthat/test-golem_utils_server.R +++ b/tests/testthat/test-golem_utils_server.R @@ -49,20 +49,26 @@ test_that("%|_|% works", { mtcarrs %|_|% iris, iris ) - expect_warning( - test_wrn <- mtcars %|_|% iris, - 'Using user supplied "mtcars" instead of deriving.' + test_wrn <- capture_output_lines( + test_out <- mtcars %|_|% iris ) expect_equal( test_wrn, + 'Using user supplied "mtcars" instead of deriving.' + ) + expect_equal( + test_out, mtcars ) - expect_warning( - test_wrn <- dplyr::mutate(mtcars, test = mpg %|_|% "RHS"), - 'Using user supplied "mpg" instead of deriving.' + test_wrn <- capture_output_lines( + test_out <- dplyr::mutate(mtcars, test = mpg %|_|% "RHS") ) expect_equal( test_wrn, + 'Using user supplied "mpg" instead of deriving.' + ) + expect_equal( + test_out, cbind(mtcars, list(test = mtcars$mpg)) ) expect_equal(