From 2c1d9cffad8a7a140f03a99c56bfdd28749cefcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Todor=20Kondi=C4=87?= <kontrapunkt@uclmail.net> Date: Tue, 28 Feb 2023 00:29:38 +0100 Subject: [PATCH] Use datatab_update_tags and datatab_add_files to define datatab creation. --- R/shiny-state.R | 54 +++++++++--------------- R/shiny-ui-base.R | 61 ++++++++++++++++------------ inst/rmd/app_project.Rmd | 25 +++++------- tests/testthat/_snaps/shiny-state.md | 36 ++++++++++++++++ tests/testthat/test-shiny-state.R | 23 +++++++++++ 5 files changed, 122 insertions(+), 77 deletions(-) diff --git a/R/shiny-state.R b/R/shiny-state.R index 902665f..6759ecd 100644 --- a/R/shiny-state.R +++ b/R/shiny-state.R @@ -91,7 +91,7 @@ datatab_update_tags <- function(tab,tags,files) { ## Adapt existing tags. - res = merge(nft,oldt,by=c("file","tag"),all.x=T) + res = merge(nft,oldt,by=c("file","tag"),all.y=T) tab$tag = res$tag tab$file= res$file tab$set = res$set @@ -100,46 +100,30 @@ datatab_update_tags <- function(tab,tags,files) { } datatab_add_files <- function(tab,sets,adducts,tags,files) { + check_len_zero(sets,"sets") + check_len_zero(adducts,"adducts") + check_len_zero(files,"files") + check_same_len(files,"files",tags,"tags") - check_same_len(files,tags) - - nft = data.table(tag=tags, - file=files,key="file") + nrows = prod(length(sets),length(adducts),length(tags)) + + nft = as.data.table(expand.grid(tag=tags, + set=sets, + adduct=adducts),key="tag") + ftt=data.table(tag=tags,file=files,key="tag") + nft[ftt,file:=i.file] oldt = data.table(tag=tab$tag, adduct=tab$adduct, set=tab$set, - file=tab$file,key=c("file")) - + file=tab$file,key=c("tag","file")) - ## Adapt existing tags. - oldt[nft,tag:=i.tag] + res = merge(nft,oldt,by=c("tag","adduct","set","file"),all=T) - - if (length(files)>0 ||(length(sets)>0L || length(adducts)>0L)) { - ## We are adding new set/adduct entries. - check_len_zero(sets,"sets") - check_len_zero(adducts,"adducts") - check_len_zero(files,"files") - rows = prod(length(files),length(sets),length(adducts)) - newt = data.table(tag=rep(tags,rows/length(tags)), - adduct=rep(adducts,rows/length(adducts)), - set=rep(sets,rows/length(sets)), - file=rep(files,rows/length(files))) - - if (length(files)>0L) { - ## Modifying files. - - ## Add new set and adduct entries to the old table. - fullt = newt[oldt,on=c("set","adduct")] - - ## Now, add/remove files as needed. - ## nft2 = newt[,..nft,by=c - ## res = fullt[nft,on=c("tag","adduct","set","file")] - - - } - - } + tab$tag=res$tag + tab$adduct=res$adduct + tab$set=res$set + tab$file=res$file + tab } #' @export diff --git a/R/shiny-ui-base.R b/R/shiny-ui-base.R index 932d2a9..fb719c6 100644 --- a/R/shiny-ui-base.R +++ b/R/shiny-ui-base.R @@ -1102,12 +1102,22 @@ mk_shinyscreen_server <- function(projects,init) { rmv = input$datafiles_rows_selected rvs$gui$filetag$file = rvs$gui$filetag$file[-rmv] rvs$gui$filetag$tag = rvs$gui$filetag$tag[-rmv] - ## rvs$gui$datatab$file = rvs$gui$datatab$file[-rmv] - ## rvs$gui$datatab$set = rvs$gui$datatab$set[-rmv] - ## rvs$gui$datatab$adduct = rvs$gui$datatab$adduct[-rmv] - ## rvs$gui$datatab$tag = rvs$gui$datatab$tag[-rmv] + + keep = rvs$gui$datatab$tag %in% rvs$gui$filetag$tag + rvs$gui$datatab$file = rvs$gui$datatab$file[keep] + rvs$gui$datatab$tag = rvs$gui$datatab$tag[keep] + rvs$gui$datatab$set = rvs$gui$datatab$set[keep] + rvs$gui$datatab$adduct = rvs$gui$datatab$adduct[keep] + } }) + + observeEvent(input$rem_dtab_b,{ + rvs$gui$datatab$file=character(0) + rvs$gui$datatab$tag=character(0) + rvs$gui$datatab$adduct=character(0) + rvs$gui$datatab$set=character(0) + }) observeEvent(input$datafiles_cell_edit,{ df = gen_dfiles_tab(rvs$gui) @@ -1126,29 +1136,26 @@ mk_shinyscreen_server <- function(projects,init) { files=files) }, label = "datafiles-update-tags") - observe({ - ## selected_adducts = input$tag_adducts_list - ## ## selected_adducts[selected_adducts == "NA"] = NA_character_ - ## selected_sets = input$tag_sets_list - ## ## selected_sets[selected_sets == "NA"] = NA_character_ - ## selected_rows = input$datafiles_rows_selected - ## if (isTruthy(selected_rows)) { - ## selected_tags = rvs$gui$datafiles$tag[selected_rows] - ## dt_rows = which(rvs$gui$datatab$tag %in% selected_tags) - ## if (isTruthy(selected_sets)) { - ## rvs$gui$datatab$set[dt_rows] = selected_sets - ## updateSelectInput(session=session, - ## inputId="tag_adducts_list", - ## selected=NULL) - ## } - - ## if (isTruthy(selected_adducts)) { - ## rvs$gui$datatab$adduct[dt_rows] = selected_adducts - ## updateSelectInput(session=session, - ## inputId="tag_sets_list", - ## selected=NULL) - ## } - ## } + observeEvent(input$fill_datatab_b,{ + selected_adducts = input$tag_adducts_list + selected_sets = input$tag_sets_list + selected_rows = input$datafiles_rows_selected + if (isTruthy(selected_rows)) { + selected_files = rvs$gui$filetag$file[selected_rows] + selected_tags = rvs$gui$filetag$tag[selected_rows] + if (!isTruthy(selected_sets)) selected_sets = rf_get_sets() + if (isTruthy(selected_adducts)) { + rvs$gui$datatab = datatab_add_files(rvs$gui$datatab, + sets = selected_sets, + tags = selected_tags, + adducts = selected_adducts, + files = selected_files) + } else { + shinymsg("You need to select some adducts.",type="warning") + } + } else { + shinymsg("You need to select some files.",type="warning") + } }, label = "datatab-construct") diff --git a/inst/rmd/app_project.Rmd b/inst/rmd/app_project.Rmd index 241bf44..0cdbe75 100644 --- a/inst/rmd/app_project.Rmd +++ b/inst/rmd/app_project.Rmd @@ -214,16 +214,10 @@ htmlOutput('sets_report') ### Data files <details><summary>Load data files</summary> -Shinyscreen currently supports only the **mzML** file format. After -loading the files, set file tags in the file table (column -**tag**). Additionally, specify a set of compounds that is supposed -to be extracted from the file using the **set** column. Finally, -specify the **adduct** in the adduct column. In case of compounds -with unknown structure and formula, the adduct is ignored for obvious -reasons. -Select datafiles of interest from the list and confirm the selection -by clicking `Select`. +Shinyscreen currently supports only the **mzML** file format. After +loading the files, select the files, then associate them with +appropriate sets and adducts . </details> ```{r, echo=FALSE} @@ -269,28 +263,29 @@ selectInput(inputId="tag_sets_list", ## multiple=T, #TODO choices=NULL, selected=NULL) -``` -```{r, echo=F} selectInput(inputId="tag_adducts_list", label="Select adducts", choices=shinyscreen:::DISP_ADDUCTS, multiple=T, selected=NULL) +actionButton(inputId="fill_datatab_b", + label="Fill table") ``` + <!-- tag/adduct/set associations --> </div> <div> <!-- datafiles/adducts/tags --> <details> -<summary>Assign sets to tags.</summary> +<summary>This is the data files table.</summary> -For each tag, assign a set and an adduct (if the structure information -exists, otherwise _adduct_ column is ignored). +Establishes relationships between tags, sets and adducts. </details> ```{r, echo=F} -DT::DTOutput("datatab") ## DT::DTOutput("datatab",width="25%") +DT::DTOutput("datatab") +actionButton("rem_dtab_b",label="Reset table") ``` </div><!-- datafiles/adducts/tags --> diff --git a/tests/testthat/_snaps/shiny-state.md b/tests/testthat/_snaps/shiny-state.md index 1587227..a6818cd 100644 --- a/tests/testthat/_snaps/shiny-state.md +++ b/tests/testthat/_snaps/shiny-state.md @@ -106,3 +106,39 @@ [1] "fx.f" "fy.f" +# datatab_add_files does what's intended + + Code + out1 + Output + $tag + [1] "t1" "t1" "t1" "t2" "t2" "t2" + + $adduct + [1] "a1" "a2" "a3" "a1" "a2" "a3" + + $set + [1] "set" "set" "set" "set" "set" "set" + + $file + [1] "t1.x" "t1.x" "t1.x" "t2.x" "t2.x" "t2.x" + + +--- + + Code + out2 + Output + $tag + [1] "t1" "t1" "t1" "t2" "t2" "t2" "t3" "t3" "t3" "t3" + + $adduct + [1] "a1" "a2" "a3" "a1" "a2" "a3" "a1" "a1" "a5" "a5" + + $set + [1] "set" "set" "set" "set" "set" "set" "set2" "set3" "set2" "set3" + + $file + [1] "t1.x" "t1.x" "t1.x" "t2.x" "t2.x" "t2.x" "t3.x" "t3.x" "t3.x" "t3.x" + + diff --git a/tests/testthat/test-shiny-state.R b/tests/testthat/test-shiny-state.R index a626254..32abccf 100644 --- a/tests/testthat/test-shiny-state.R +++ b/tests/testthat/test-shiny-state.R @@ -50,3 +50,26 @@ test_that("datatab_update_tags works properly",{ }) + + +test_that("datatab_add_files does what's intended",{ + tab1=list(tag=character(0), + adduct=character(0), + set=character(0), + file=character(0)) + out1 = datatab_add_files(tab=tab1, + sets="set", + tags=c("t1","t2"), + adducts=c("a1","a2","a3"), + files=c("t1.x","t2.x")) + expect_snapshot(out1) + + tab2=out1 + out2 = datatab_add_files(tab=tab2, + sets=c('set2','set3'), + tags=c('t3'), + adducts=c('a1','a5'), + files=c('t3.x')) + expect_snapshot(out2) + +}) -- GitLab