From eaa49e9c4d401ffdf617925dd061fb1797de55d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Todor=20Kondi=C4=87?= <todor.kondic@uni.lu> Date: Fri, 16 Sep 2022 12:57:04 +0200 Subject: [PATCH] shiny-state,shiny-ui-base: Fixed summ modification. --- R/resources.R | 2 +- R/shiny-state.R | 60 ++++++++++++++++++++++++++++++++------ R/shiny-ui-base.R | 74 ++++++++++++++++++----------------------------- 3 files changed, 80 insertions(+), 56 deletions(-) diff --git a/R/resources.R b/R/resources.R index 07b88c2..b4823f7 100644 --- a/R/resources.R +++ b/R/resources.R @@ -213,7 +213,7 @@ FIG_DEF_CONF <-list(grouping=list(group="adduct", ## Summary table properties. -SUMM_COLS=c("set",BASE_KEY_MS2,"an","mz","ms1_rt", "ms1_int", "ms2_rt", "ms2_int", +SUMM_COLS=c("set",BASE_KEY_MS2,"mz","ms1_rt", "ms1_int", "ms2_rt", "ms2_int", "ms1_mean","ms2_sel",QA_FLAGS,"Name", "SMILES", "Formula", "known","Comments","file") SUMM_KEY <- c("set","ID","adduct","tag","an") diff --git a/R/shiny-state.R b/R/shiny-state.R index 3119295..c262e21 100644 --- a/R/shiny-state.R +++ b/R/shiny-state.R @@ -351,6 +351,9 @@ pre_setup_val_block <- function(gui) { T } +## SHINY HELPERS: COMPOUND INDEX + + ## Creating compound index table ## ## Take `summ', group first by set, adduct and id. Then, pick only the @@ -358,6 +361,7 @@ pre_setup_val_block <- function(gui) { ## this as the group rt. This is, then, a row representing the group ## (of tags, CEs) in the index. gen_cindex <- function(summ,sorder,cols = CINDEX_COLS,by. = CINDEX_BY) { + if (NROW(summ) == 0L) return(NULL) allc <- c(by.,cols) xsumm <- summ[,..allc] setnames(xsumm,old="ms1_rt",new="rt",skip_absent=T) @@ -390,14 +394,53 @@ gen_cindex <- function(summ,sorder,cols = CINDEX_COLS,by. = CINDEX_BY) { } +cindex_from_input <- function(clabs,sort_catg=character(4),summ) { + grp <- if (isTruthy(clabs)) setdiff(CINDEX_BY,clabs) else CINDEX_BY + sorder <- setdiff(sort_catg,clabs) + gen_cindex(summ,sorder=sorder,by=grp) +} + +get_cindex_key <- function(cindex) { + ## Select only valid category names. + x <- which(CINDEX_BY %in% names(cindex)) + CINDEX_BY[x] +} + get_cindex_parents <- function(summ,ckey,kvals,labs) { ## Get kvals part of summ. - tab <- get_data_from_key(summ,kvals)[,unique(.SD),.SDcols=labs,by=key] + tab <- summ[(kvals),on=names(kvals)][,unique(.SD),.SDcols=labs,by=ckey] #get_data_from_key(summ,kvals) tab[,item:=do.call(paste,c(.SD,list(sep=";"))),.SDcol=labs] keys <- names(tab)[names(tab)!="item"] data.table::setkeyv(tab,keys) tab } + +get_cindex_kval <- function(cindex,row,key) { + rowtab <- cindex[(row),..key] + res <- lapply(rowtab,function (x) x[[1]]) + names(res) <- key + res +} + +get_summ_subset <- function(summ,ptab,paritem,kvals) { + select <- ptab[item==(paritem)] + tab <- get_data_from_key(summ,kvals)[select,nomatch=NULL,on=key(ptab)] + if ("an.1" %in% names(tab)) tab[,an.1:=NULL] #TODO: This is + #probably a lousy + #hack. + tab +} + +get_ltab <- function(summ_subs,cols=c("an","ms2_rt")) { + tab <- summ_subs + if (NROW(tab)==1L && is.na(tab$an)) return(data.table::data.table(item=character())) + tab[is.na(ms2_sel),ms2_sel:=F] #TODO FIXME: Check why NAs exist at all? + tab[,passval:=fifelse(qa_pass==T,"OK","BAD")] + tab[ms2_sel==T,passval:="SELECTED"] + res <- tab[,item:=do.call(paste,c(.SD,list(sep=";"))),.SDcols=c(cols,"passval")] + data.table::setkey(res,"ms2_rt") + res +} update_on_commit_chg <- function(summ,input,ptab,ltab) { n_ms1_rt = input$chg_ms1_rt n_ms1_int = input$chg_ms1_int @@ -410,15 +453,12 @@ update_on_commit_chg <- function(summ,input,ptab,ltab) { sel_par <- input$sel_parent_trace sel_spec <- input$sel_spec - - ptab <- req(rf_get_cindex_parents()) - ltab <- req(rf_fill_sel_spec()) pkvals <- ptab[item==(sel_par),.SD,.SDcols=intersect(SUMM_KEY,names(ptab))] lkvals <- ltab[item==(sel_spec),.SD,.SDcols=intersect(SUMM_KEY,names(ltab))] kvals <- c(as.list(pkvals),as.list(lkvals)) kvals <- kvals[unique(names(kvals))] - if ('an' %in% names(kvals)) { + if ('an' %in% names(kvals) && n_ms2_sel) { rkvals <- kvals[!(names(kvals) %in% 'an')] rktab <- tabkey(summ,kvals=rkvals) tabsel <- summ[rktab,.(an,ms2_sel)] @@ -432,12 +472,14 @@ update_on_commit_chg <- function(summ,input,ptab,ltab) { } - ## TODO: CHECK IF THIS WORKS!!!!! ESPECIALLY THE ABOVE AN TREATMENT. + tgts <- c("ms1_rt","ms1_int",names(n_qa),"ms2_sel") srcs <- c(list(n_ms1_rt,n_ms1_int),as.list(n_qa),as.list(n_ms2_sel)) - - summ[tabkey(summ,kvals=kvals),(tgts):=..srcs] + the_row <- tabkey(summ,kvals=kvals) + summ[the_row,(tgts):=..srcs] + summ[,an.1:=NULL] #FIXME: an.1 pops up somewhere. + qflg <- QA_FLAGS[!(QA_FLAGS %in% "qa_pass")] + summ[the_row,qa_pass:=apply(.SD,1,all),.SDcols=qflg] summ - } diff --git a/R/shiny-ui-base.R b/R/shiny-ui-base.R index 54c18cd..aae34a6 100644 --- a/R/shiny-ui-base.R +++ b/R/shiny-ui-base.R @@ -706,37 +706,20 @@ mk_shinyscreen_server <- function(projects,init) { run(m=q,phases=c("setup","comptab")) }) - rf_cindex_key <- reactive({ - if (isTruthy(input$cindex_group)) setdiff(CINDEX_BY,input$cindex_group) else CINDEX_BY - }) + ## REACTIVE FUNCTIONS: COMPOUND INDEX rf_get_cindex <- reactive({ + input$cmt_changes_b rvs$status$is_qa_stat - grp <- rf_cindex_key() s1 <- input$sort1 s2 <- input$sort2 s3 <- input$sort3 s4 <- input$sort4 - sorder <- setdiff(c(s1,s2,s3,s4),input$cindex_group) - summ <- req(rvs$m$out$tab$summ) - isolate({ - if (NROW(summ)>0L) { - gen_cindex(summ, - sorder=sorder, - by.=grp) - } else { - NULL - } - }) - }) + cindex_from_input(clabs=input$cindex_group, + sort_catg=c(s1,s2,s3,s4), + summ=req(rvs$m$out$tab$summ)) - rf_get_keyed_cindex <- reactive({ - cind <- req(rf_get_cindex()) - grp <- req(rf_cindex_key()) - - data.table::setkeyv(cind,grp) - cind }) ## Get current grouping categories (`cindex key'). @@ -745,9 +728,7 @@ mk_shinyscreen_server <- function(projects,init) { cind <- rf_get_cindex() req(NROW(cind)>0L) - ## Select only valid category names. - x <- which(CINDEX_BY %in% names(cind)) - CINDEX_BY[x] + get_cindex_key(cind) }) ## Get currently selected cindex values as a list. @@ -756,10 +737,7 @@ mk_shinyscreen_server <- function(projects,init) { key <- rf_get_cindex_key() req(NROW(cind)>0L) row <- req(input$cindex_row_last_clicked) - rowtab <- cind[row][,..key] - res <- lapply(rowtab,function (x) x[[1]]) - names(res) <- key - res + get_cindex_kval(cind,row,key) }) ## Get the labels which will define plot curves in EIC MS1. @@ -774,12 +752,12 @@ mk_shinyscreen_server <- function(projects,init) { isolate({ ms1 <- rvs$m$extr$ms1 ms2 <- rvs$m$extr$ms2 - summ <- rvs$m$out$tab$summ + summ <- req(rvs$m$out$tab$summ) }) - key <- rf_get_cindex_key() + key <- req(rf_get_cindex_key()) kvals <- req(rf_get_cindex_kval()) - labs <- rf_get_cindex_labs() + labs <- req(rf_get_cindex_labs()) get_cindex_parents(summ,key,kvals,labs) }) @@ -790,21 +768,17 @@ mk_shinyscreen_server <- function(projects,init) { parent <- req(input$sel_parent_trace) kvals <- req(rf_get_cindex_kval()) ptab <- req(rf_get_cindex_parents()) - select <- ptab[item==(parent)] - tab <- get_data_from_key(summ,kvals)[select,nomatch=NULL,on=key(ptab)] - tab + get_summ_subset(summ=summ, + ptab=ptab, + paritem=parent, + kvals=kvals) }) - rf_fill_sel_spec <- reactive({ + rf_get_ltab <- reactive({ + input$cmt_changes_b cols <- c("an","ms2_rt") tab <- req(rf_select_from_summ()) - if (NROW(tab)==1L && is.na(tab$an)) return(data.table::data.table(item=character())) - tab[is.na(ms2_sel),ms2_sel:=F] #TODO FIXME: Check why NAs exist at all? - tab[,passval:=fifelse(qa_pass==T,"OK","BAD")] - tab[ms2_sel==T,passval:="SELECTED"] - res <- tab[,item:=do.call(paste,c(.SD,list(sep=";"))),.SDcols=c(cols,"passval")] - data.table::setkey(res,"ms2_rt") - res + get_ltab(tab) }) @@ -937,7 +911,7 @@ mk_shinyscreen_server <- function(projects,init) { } else { selMS2 <- req(input$sel_spec) - xx <- rf_fill_sel_spec() + xx <- rf_get_ltab() x1 <- list(rt=xx[item==(selMS2),ms1_rt], int=xx[item==(selMS2),ms1_int]) x2 <- xx[item==(selMS2),.SD,.SDcols=patterns("qa_ms[12].*")] @@ -1323,7 +1297,7 @@ mk_shinyscreen_server <- function(projects,init) { }, label = "measure-props-parent") observe({ - ctab <- rf_fill_sel_spec() + ctab <- rf_get_ltab() disp <- if (any(ctab$ms2_sel==T)) ctab[ms2_sel==T,item] else ctab[1L,item] updateSelectInput(session = session, inputId = "sel_spec", @@ -1354,6 +1328,14 @@ mk_shinyscreen_server <- function(projects,init) { }) observeEvent(input$cmt_changes_b,{ + summ <- req(rvs$m$out$tab$summ) + + ptab <- req(rf_get_cindex_parents()) + ltab <- req(rf_get_ltab()) + rvs$m$out$tab$summ <- update_on_commit_chg(summ, + input=input, + ptab=ptab, + ltab=ltab) }) @@ -1586,7 +1568,7 @@ mk_shinyscreen_server <- function(projects,init) { output$print_spec_tab <- renderPrint({ notfound <- "No MS2 spectrum has been found for this entry." - ms2tabsel <- req(rf_fill_sel_spec()) + ms2tabsel <- req(rf_get_ltab()) selMS2 <- req(input$sel_spec) if (NROW(ms2tabsel)!=0L) { lval <- lapply(ms2tabsel[item==(selMS2)],function(x) x) -- GitLab