validate_dataframe <- function(df, validation_rules = c("structure", "peak_headers", "metadata") ) { expected_headers <- c( "Alignment ID", "Average Rt(min)", "Average Mz", "Metabolite name", "Adduct type", "Post curation result", "Fill %", "MS/MS assigned", "Reference RT", "Reference m/z", "Formula", "Ontology", "INCHIKEY", "SMILES", "Annotation tag (VS1.0)", "RT matched", "m/z matched", "MS/MS matched", "Comment", "Manually modified for quantification", "Manually modified for annotation", "Isotope tracking parent ID", "Isotope tracking weight number", "RT similarity", "m/z similarity", "Simple dot product", "Weighted dot product", "Reverse dot product", "Matched peaks count", "Matched peaks percentage", "Total score", "S/N average", "Spectrum reference file name", "MS1 isotopic spectrum", "MS/MS spectrum" ) # Input check if (!is.data.frame(df)) { stop("Input must be a dataframe") } if (!is.character(validation_rules)) { stop("validation_rules must be a character vector") } if (!all(validation_rules %in% c("structure", "peak_headers", "metadata"))) { stop("Invalid validation_rules specified") } validation_results <- list() # Check data structure if ("structure" %in% validation_rules) { if (nrow(df) < 5) { validation_results$insufficient_rows <- "Data has less than 5 rows. At least 5 rows are required." } if (ncol(df) < 34) { validation_results$insufficient_cols <- "Missing 34 columns required for peak information." } } # Check peak information headers (row 5) if ("peak_headers" %in% validation_rules) { if (is.null(expected_headers)) { stop("expected_headers required for peak_headers validation") } if (nrow(df) >= 5) { headers <- df[5, 1:min(34, ncol(df))] missing_headers <- expected_headers[1:length(headers)][headers != expected_headers[1:length(headers)]] if (length(missing_headers) > 0) { validation_results$incorrect_headers <- paste("Headers in row 5 differ from expected headers:", paste(missing_headers, collapse = ", ")) } } } # Check metadata (rows 1-2, columns 35+) if ("metadata" %in% validation_rules && ncol(df) > 34) { # Check for Sample in columns 36+ if (ncol(df) > 35) { file_types <- df[2, 36:ncol(df)] if (!"Sample" %in% file_types) { validation_results$no_sample <- "'Sample' not found in columns 36 onward" } } } return(validation_results) } server <- function(input, output,session) { options(shiny.maxRequestSize=150*1024^100) originaldir <- reactiveValues(datapath = getwd()) # directry of shiny R script global <- reactiveValues(datapath = getwd()) # directory of file path in lipidomics tab col = reactiveValues(col = col) validation_status <- reactiveVal(FALSE) svg_path <- paste(getwd(),"/svg",sep = "") host <- session$request$HTTP_HOST %>% gsub("http:", "https:", .) output$downloadData <- downloadHandler( filename = function() { "Demo_data.zip" # ダウンロード時のファイル名 }, content = function(file) { file.copy("./pathwaymap/demodata.zip", file) }, contentType = "application/zip" ) observeEvent(input$filetype,{ if(input$filetype =="Sample in rows"){ shinyjs::show("ontfile") }else{ shinyjs::hide("ontfile") } if(input$ClassorMol =="TRUE"){ shinyjs::show("X1") shinyjs::show("X2") }else{ shinyjs::hide("X1") shinyjs::hide("X2") } }) observeEvent(input$ClassorMol,{ if(input$ClassorMol =="TRUE"){ shinyjs::show("X1") shinyjs::show("X2") }else{ shinyjs::hide("X1") shinyjs::hide("X2") } }) observeEvent(input$file1, { tryCatch({ originaldata <- read.csv(input$file1$datapath, header = F, check.names = F, fileEncoding = "UTF-8-BOM") }, error = function(e) { showNotification(paste("Failed to load the file", e$message), type = "error") }) if(input$filetype == "Sample in rows"){ }else if(input$filetype == "MS-DIAL export"){ validateresults <- validate_dataframe(originaldata, validation_rules = c("structure", "peak_headers", "metadata")) if (length(validateresults) == 0) { validation_status(TRUE) shinyalert( "Success", "All validation checks passed successfully!", type = "success" ) } else { validation_status(FALSE) error_message <- "
Validation Errors:

" # 各エラーメッセージの処理 for (error_name in names(validateresults)) { error_message <- paste0( error_message, "• ", # 赤色のブレット switch(error_name, "insufficient_cols" = "Column Error: ", "incorrect_headers" = "Header Error: ", "no_sample" = "Sample Error: "), validateresults[[error_name]], "

" ) } error_message <- paste0(error_message, "
") # エラーメッセージの表示 shinyalert( "Validation Failed", html = TRUE, text = error_message, type = "error", size = "l", closeOnEsc = TRUE, closeOnClickOutside = TRUE, showConfirmButton = TRUE, confirmButtonText = "OK", timer = FALSE ) } } observeEvent(input$submit,{ tryCatch({ if(input$filetype == "Sample in rows"){ Lipidomedata <- processSampleInRows(originaldata, session, input)[[1]] lipidont <- read.csv(input$ontfile$datapath, sep = ",", check.names = FALSE) metadata <- processSampleInRows(originaldata, session, input)[[2]] alitable <- read.csv(input$ontfile$datapath, check.names = FALSE, fileEncoding = "UTF-8-BOM") colnames(alitable) <- c("Metabolite name","Ontology") letchoice <- c(colnames(Lipidomedata)[!colnames(Lipidomedata) %in% colnames(metadata)],"Others") moldata <- processSampleInRowstomoldata(originaldata, session, input)[[1]] }else if(input$filetype == "MS-DIAL export"){ Lipidomedata <- processMSDIALExport(originaldata, session, input)[[1]] metadata <- processMSDIALExport(originaldata, session, input)[[2]] alitable <- process_alignment_file(originaldata)[[1]] %>% select(c(1,2)) moldata <- processMSDIALExporttomoldata(originaldata, session, input)[[1]] } if(length(input$transcriptomefile) !=0){ transcriptome <- read.csv(input$transcriptomefile$datapath,check.names = F,fileEncoding ="UTF-8-BOM") %>% t() colnames(transcriptome) <- transcriptome[1,] transcriptome <- transcriptome[-1,] %>% data.frame() transcriptome[,-c(1)] <- apply(transcriptome[,-c(1)],2,as.numeric) %>% data.frame() transcriptome <- rownames_to_column(transcriptome,"name") transcriptome[,2] <- as.character(transcriptome[,2]) } if(length(input$file1) !=0 & length(input$transcriptomefile) != 0){ Ensembl <- gconvert(query = colnames(transcriptome)[-c(1:2)] , organism = "mmusculus",#sapiens target="ENSG", mthreshold = Inf, filter_na = TRUE) %>% select(input,target) transcriptome <- transcriptome %>% select(-2) data <- inner_join(Lipidomedata,transcriptome,by =c("name")) moldata <- inner_join(moldata,transcriptome,by =c("name")) } else{ data <- Lipidomedata } }, error = function(e) { showNotification(paste("Error:Invalid CSV file format. Please ensure your file is a properly formatted CSV.", e$message), type = "error") }) metainfocol <- ncol(metadata) lipidclassproperties <- read_csv("./pathwaymap/lipidclassproperties.csv") processAndUpdateInputs(data, session, metadata, metainfocol) processAndUpdateInputs2(moldata, session, metadata, metainfocol) shinyalert( "Success", "GO to Plot tab", type = "success" ) observeEvent(input$y,{ targetclass <- filter(alitable,Ontology %in% input$y) shiny::updateSelectInput(session, "mol", selected = targetclass$`Metabolite name`[1], choices = targetclass$`Metabolite name`) }) #observeEvent(input$Colorpicker,{ #print("boton") # ShowtestModaldialog4(data,input,col$col) #} #) observeEvent(input$exportgraph,{ ShowtestModaldialog2(data,input,col$col) } ) observeEvent(input$Colorpicker, { ShowtestModaldialog(data,input,col$col) }) observeEvent(input$saveConfirm, { removeModal() showNotification("保存が完了しました", type = "success") }) observeEvent(input$w,{ updateOrderInput(session, "levels", items = c(unique(as.matrix(select(data,input$w)))), item_class = "success") shiny::updateSelectInput(session, "q", selected = c(unique(as.matrix(select(data,input$w))))[1], choices = c(unique(as.matrix(select(data,input$w))))) col$col <<- rainbow_hcl(length(unique(as.matrix(select(data,input$w))))) col$col <<- setNames(col$col,unique(as.matrix(select(data,input$w)))) }) observeEvent(input$levels,{ if (!is.null(input$levels) && any(input$levels != "")) { dataa <<- mutate(data, !!as.symbol(input$w) := !!as.symbol(input$w) %>% factor(levels = input$levels)) moldataa <<- mutate(moldata, !!as.symbol(input$w) := !!as.symbol(input$w) %>% factor(levels = input$levels)) } }) observe({ if (length(grep("selectcolor", names(input), value = TRUE)) != 0) { col$col <<- process_select_color_input(input,data) } }) # 可能な比較の組み合わせを生成 possible_comparisons <- reactive({ groups <- unique(data[[input$w]]) combs <- combn(groups, 2, simplify = FALSE) setNames( lapply(combs, function(x) paste(x, collapse = "vs")), lapply(combs, function(x) paste(x, collapse = " vs ")) ) }) # 比較選択用のUI生成 output$comparison_choices <- renderUI({ checkboxGroupInput("comparisons", "Select comparisons:", choices = possible_comparisons(), selected = possible_comparisons()[1]) }) # Select All ボタンの処理 observeEvent(input$select_all, { updateCheckboxGroupInput(session, "comparisons", selected = possible_comparisons()) }) # Clear All ボタンの処理 observeEvent(input$clear_all, { updateCheckboxGroupInput(session, "comparisons", selected = character(0)) }) # 統計検定の実行 stat_test <- reactive({ req(input$comparisons, input$test_method) # 検定関数の選択 test_func <- get(input$test_method, asNamespace("rstatix")) # 結果を格納するデータフレーム results <- data.frame() for(comp in input$comparisons) { # グループを分割 groups <- strsplit(comp, "vs")[[1]] # データのサブセット作成 subset_data <- data %>% dplyr::filter(!!sym(input$w) %in% groups) # 検定実行 test_result <- test_func(subset_data, as.formula(paste(input$y, "~", input$w))) %>% adjust_pvalue(method = input$p_adjust) %>% add_significance() results <- rbind(results, test_result) } results }) stat_testmol <- reactive({ req(input$comparisons, input$test_method) # 検定関数の選択 test_func <- get(input$test_method, asNamespace("rstatix")) # 結果を格納するデータフレーム results <- data.frame() for(comp in input$comparisons) { # グループを分割 groups <- strsplit(comp, "vs")[[1]] # データのサブセット作成 subset_data <- moldata %>% dplyr::filter(!!sym(input$w) %in% groups) # 検定実行 test_result <- test_func(subset_data, as.formula(paste(paste("`",input$mol,"`",sep =""), "~", input$w))) %>% adjust_pvalue(method = input$p_adjust) %>% add_significance() results <- rbind(results, test_result) } results }) #if(input$pvaluecheck == TRUE){ # サマリー統計の表示 output$stat_results <- renderPrint({ req(stat_test()) results <- stat_test() cat("Results:\n") print(summary(results)) }) #} observeEvent(input$levels,{ observe({ if (!is.null(input$mol) && input$mol != "") { if(!is.null(input$levels) && any(input$levels != "")){ output$plottest <- renderPlot({ if(input$mydrop == "box"){ process_boxplot(input,input$y,dataa,col$col,stat_test()) } else if(input$mydrop == "bar"){ process_barplot(input,input$y,dataa,col$col,stat_test()) } else if(input$mydrop == "violin"){ process_violinplot(input,input$y,dataa,col$col,stat_test()) } else if(input$mydrop == "polar"){ process_polarplot(input,input$y,dataa,col$col,stat_test()) } else if(input$mydrop == "coding"){ process_dotplot(input,input$y,dataa,col$col,stat_test()) } } ) output$mappingraph <- renderPlot({ if(input$mydrop == "box"){ process_boxplot_diagram(input,input$y,dataa,col$col,stat_test()) } else if(input$mydrop == "bar"){ process_barplot_diagram(input,input$y,dataa,col$col,stat_test()) } else if(input$mydrop == "violin"){ process_violinplot_diagram(input,input$y,dataa,col$col,stat_test()) } else if(input$mydrop == "polar"){ process_polar_diagram(input,input$y,dataa,col$col,stat_test()) } else if(input$mydrop == "coding"){ process_dotplot_diagram(input,input$y,dataa,col$col,stat_test()) } } ) observeEvent(input$mol,{ output$plottest2 <- renderPlot({ if(input$mydrop == "box"){ process_boxplot(input, paste("`",input$mol,"`",sep =""),moldataa,col$col,stat_testmol()) } else if(input$mydrop == "bar"){ process_barplot(input, paste("`",input$mol,"`",sep =""),moldataa,col$col,stat_testmol()) } else if(input$mydrop == "violin"){ process_violinplot(input,paste("`",input$mol,"`",sep =""),moldataa,col$col,stat_testmol()) } else if(input$mydrop == "polar"){ process_polarplot(input,paste("`",input$mol,"`",sep =""),moldataa,col$col,stat_testmol()) } else if(input$mydrop == "coding"){ process_dotplot(input,paste("`",input$mol,"`",sep =""),moldataa,col$col,stat_testmol()) } }) }) } } }) }) graph_json <- reactive({ if (input$pathwaytype == "Global pathway") { read_graph_json("./pathwaymap/globalpathway.cyjs") %>% gsub("localhost:9000", paste0(host,"/api"), .) } else if (input$pathwaytype == "Ceramide pathway") { read_graph_json("./pathwaymap/ceramidepathway.cyjs") %>% gsub("localhost:9000", paste0(host,"/api"), .) } else if (input$pathwaytype == "Remodeling pathway") { read_graph_json("./pathwaymap/remodeling.cyjs") %>% gsub("localhost:9000", paste0(host,"/api"), .) } }) style_file_path <- "./pathwaymap/nodestyle1.js" styles_xml_path <- "./pathwaymap/styles.xml" # CYJSファイルのダウンロード output$exportCYJS <- downloadHandler( filename = function() { paste0(input$pathwaytype, "_", format(Sys.Date(), "%Y%m%d"), ".cyjs") }, content = function(file) { writeLines(graph_json, file) }, contentType = "application/json" ) # styles.xmlファイルのダウンロード output$exportStyles <- downloadHandler( filename = function() { "styles.xml" }, content = function(file) { file.copy(styles_xml_path, file) }, contentType = "application/xml" ) #observeEvent(input$sidebarCollapse, { # toggleClass(id = "content", class = "active") #}) observeEvent(input$toggle_sidebar, { shinyjs::runjs("toggleSidebar()") }) observeEvent(input$actionplottest,{ observeEvent(input$pathway, { output$graphContainer <- renderUI({ cyjShinyOutput("cyjShinytest", height = "90%", width = "90%") }) }) output$cyjShinytest <- renderCyjShiny({ #p <- input$pathway #if (p != 0) { if (input$pathwaytype == "Global pathway") { graph_json <<- paste(readLines("./pathwaymap/globalpathway.cyjs"), collapse = "") %>% gsub("localhost:9000", paste0(host,"/api"), .) } else if (input$pathwaytype == "Ceramide pathway") { graph_json <<- paste(readLines("./pathwaymap/ceramidepathway.cyjs"), collapse = "") %>% gsub("localhost:9000", paste0(host,"/api"), .) } else if (input$pathwaytype == "Remodeling pathway") { graph_json <<- paste(readLines("./pathwaymap/remodeling.cyjs"), collapse = "") %>% gsub("localhost:9000", paste0(host,"/api"), .) } test <- fromJSON(graph_json) test <- as.data.frame(test$elements$nodes) if (input$viewacyllevel == TRUE) { cyjShiny(graph_json, layoutName = "preset", styleFile = "./pathwaymap/nodestyle1.js") } else { cyjShiny(graph_json, layoutName = "preset", styleFile = "./pathwaymap/nodestyle2.js") } # } else { #} }) observeEvent(input$getSelectedNodes, ignoreInit=TRUE, { output$selectedNodesDisplay <- renderText({" "}) getSelectedNodes(session) }) output$corselect <- renderPlotly({ if(input$pathwaytype == "Global pathway"){ graph_json <<- paste(readLines("./pathwaymap/globalpathway.cyjs"), collapse="") %>% gsub("localhost:9000", paste0(host,"/api"), .) }else if(input$pathwaytype == "Ceramide pathway"){ graph_json <<- paste(readLines("./pathwaymap/ceramidepathway.cyjs"), collapse="") %>% gsub("localhost:9000", paste0(host,"/api"), .) }else if(input$pathwaytype == "Remodeling pathway"){ graph_json <<- paste(readLines("./pathwaymap/remodeling.cyjs"), collapse="") %>% gsub("localhost:9000", paste0(host,"/api"), .) } test <- fromJSON(graph_json) test <- as.data.frame(test$elements$nodes) test1 <- test[test$data$id %in% unlist(input$selectedNodes),] dataa <- mutate(data, !!as.symbol(input$w) := !!as.symbol(input$w) %>% factor(levels = input$levels)) if(length(test1$data$shared_name) == 2){ moldataa <- mutate(moldata, !!as.symbol(input$w) := !!as.symbol(input$w) %>% factor(levels = input$levels)) targetclass <- filter(alitable,Ontology %in% test1$data$shared_name) if(! test1$data$shared_name[1] %in% colnames(data)) { a <- Ensembl[Ensembl$target %in% test1$data$Ensembl_ID[1],] test1$data$shared_name[1] <- a$input } if(! test1$data$shared_name[2] %in% colnames(data)) { b <- Ensembl[Ensembl$target %in% test1$data$Ensembl_ID[2],] test1$data$shared_name[2] <- b$input } if(input$ClassorMol == FALSE){ cor_value <- cor(dataa[,test1$data$shared_name[1]], dataa[,test1$data$shared_name[2]],method = "spearman") g <- ggplot(dataa,aes_string(test1$data$shared_name[1],test1$data$shared_name[2],fill = input$w,size = input$size))+geom_point(shape =21,color = "black")+ scale_fill_manual(values = unlist(col$col)) + ggtitle(paste("r = ",round(cor_value, 2))) }else{ moldataa <- mutate(moldata, !!as.symbol(input$w) := !!as.symbol(input$w) %>% factor(levels = input$levels)) cor_value <- cor(moldataa[,input$X1], moldataa[,input$X2],method = "spearman") g <- ggplot(moldataa,aes_string(paste("`",input$X1,"`",sep =""),paste("`",input$X2,"`",sep =""),fill = input$w,size = input$size))+geom_point(shape =21,color = "black")+ scale_fill_manual(values = unlist(col$col))+ ggtitle(paste("r = ",round(cor_value, 2))) } plotly::ggplotly(g) } }) output$textOutput <- renderText({ if(input$ClassorMol == FALSE){ "Select two nodes from the network to analyze their correlation."} else{ "Select two features to analyze their correlation." } }) observeEvent(input$selectedNodes, { if(input$pathwaytype == "Global pathway"){ graph_json <<- paste(readLines("./pathwaymap/globalpathway.cyjs"), collapse="") %>% gsub("localhost:9000", paste0(host,"/api"), .) }else if(input$pathwaytype == "Ceramide pathway"){ graph_json <<- paste(readLines("./pathwaymap/ceramidepathway.cyjs"), collapse="") %>% gsub("localhost:9000", paste0(host,"/api"), .) }else if(input$pathwaytype == "Remodeling pathway"){ graph_json <<- paste(readLines("./pathwaymap/remodeling.cyjs"), collapse="") %>% gsub("localhost:9000", paste0(host,"/api"), .) } test <- fromJSON(graph_json) test <- as.data.frame(test$elements$nodes) test1 <- test[test$data$id %in% unlist(input$selectedNodes),] moldataa <- mutate(moldata, !!as.symbol(input$w) := !!as.symbol(input$w) %>% factor(levels = input$levels)) targetclass <- filter(alitable,Ontology %in% test1$data$shared_name) shiny::updateSelectInput(session, "selectmol", selected = targetclass$`Metabolite name`[1], choices = targetclass$`Metabolite name`) },ignoreNULL = TRUE) output$corselect2 <- renderPlot({ if(input$pathwaytype == "Global pathway"){ graph_json <<- paste(readLines("./pathwaymap/globalpathway.cyjs"), collapse="") %>% gsub("localhost:9000", paste0(host,"/api"), .) }else if(input$pathwaytype == "Ceramide pathway"){ graph_json <<- paste(readLines("./pathwaymap/ceramidepathway.cyjs"), collapse="") %>% gsub("localhost:9000", paste0(host,"/api"), .) }else if(input$pathwaytype == "Remodeling pathway"){ graph_json <<- paste(readLines("./pathwaymap/remodeling.cyjs"), collapse="") %>% gsub("localhost:9000", paste0(host,"/api"), .) } test <- fromJSON(graph_json) test <- as.data.frame(test$elements$nodes) test1 <- test[test$data$id %in% unlist(input$selectedNodes),] moldataa <- mutate(moldata, !!as.symbol(input$w) := !!as.symbol(input$w) %>% factor(levels = input$levels)) targetclass <- filter(alitable,Ontology %in% test1$data$shared_name) if(length(test1$data$shared_name) > 0 && input$selectmol != " "){ if(test1$data$shared_name[1] %in% colnames(data)) { if(input$mydrop == "box"){ g <- process_boxplot_diagram(input,paste("`",input$selectmol,"`",sep =""),moldataa,col$col,stat_testmol()) } else if(input$mydrop == "bar"){ g <- process_barplot_diagram(input,paste("`",input$selectmol,"`",sep =""),moldataa,col$col,stat_testmol()) } else if(input$mydrop == "violin"){ g <- process_violinplot_diagram(input,paste("`",input$selectmol,"`",sep =""),moldataa,col$col,stat_testmol()) } else if(input$mydrop == "polar"){ g <- process_polar_diagram(input,paste("`",input$selectmol,"`",sep =""),moldataa,col$col,stat_testmol()) } else if(input$mydrop == "coding"){ g <- process_dotplot_diagram(input,paste("`",input$selectmol,"`",sep =""),moldataa,col$col,stat_testmol()) }} plot(g) } }) }) observeEvent(input$save_pdf,{ shinyscreenshot::screenshot(selector="#cyjShinytest") }) #Creating heatmap observeEvent(input$actionplottest, { waiter::waiter_show( id = NULL, html = tagList(waiter::spin_loader(), "Loading ..."), color = "#333e48", logo = "", image = "" ) file_list <- list.files(svg_path) if (length(unlist(file_list)) > 0) { file.remove(file.path(svg_path, file_list)) } else { } if(is.null(input$transcriptomefile) == FALSE){ Ensembl <- gconvert(query = colnames(transcriptome)[-c(1:2)] , organism = "mmusculus",#sapiens target="ENSG", mthreshold = Inf, filter_na = TRUE) %>% select(input,target) graph_json1 <- paste(readLines("./pathwaymap/ceramidepathway.cyjs"), collapse="") %>% fromJSON() graph_json2 <- paste(readLines("./pathwaymap/remodeling.cyjs"), collapse="") %>% fromJSON() Ensemblinmap <- c(graph_json1$elements$nodes$data$Ensembl_ID,graph_json2$elements$nodes$data$Ensembl_ID) Ensemblinmap <- Ensemblinmap[-which(Ensemblinmap %in% "")] geneinmap <- Ensembl[Ensembl[,2] %in% Ensemblinmap,] transcriptome2 <- colnames(transcriptome)[colnames(transcriptome) %in% geneinmap$input] data <- data[,colnames(data) %in% c(colnames(data)[1:metainfocol],colnames(Lipidomedata),transcriptome2)] dataa <- mutate(data, !!as.symbol(input$w) := !!as.symbol(input$w) %>% factor(levels = input$levels)) names(dataa)[match(geneinmap$input, names(dataa))] <- geneinmap$target } else { dataa <- mutate(data, !!as.symbol(input$w) := !!as.symbol(input$w) %>% factor(levels = input$levels)) } # if (length(grep("selectcolor", names(input), value = TRUE)) != 0) { # col <<- process_select_color_input(input,data) # } if(input$mydrop == "box"){ process_action_boxplot(input,dataa,metainfocol,svg_path,col$col,output,data) } else if(input$mydrop == "bar"){ process_action_barplot(input,dataa,metainfocol,svg_path,col$col,output,data) } else if(input$mydrop == "violin"){ process_action_violinplot(input,dataa,metainfocol,svg_path,col$col,output,data) } else if(input$mydrop == "polar"){ process_action_polarplot(input,dataa,metainfocol,svg_path,col$col,output,data) } else if(input$mydrop == "coding"){ process_action_dotplot(input,dataa,metainfocol,svg_path,col$col,output,data) } # if(input$filetype == "MS-DIAL export"){ # exportgroupnodeheatmap(originaldata,metadata,paste(global$datapath,"",sep =""),input$w,input$levels,originaldir,input)} Sys.sleep(3) waiter::waiter_hide() shinyalert( "Success", "GO to Pathway analysis tab", type = "success" ) } ) observeEvent(input$w,{ output$heatmap <- renderPlot({ if(length(unlist(input$selectedNodes)) > 0 ) { test <- fromJSON(graph_json) test <- as.data.frame(test$elements$nodes) test1 <- test[test$data$id %in% unlist(input$selectedNodes),] groupnodeheatmap(lipidclassproperties,originaldata,metadata,input$w,input$levels,test1$data$shared_name[1],input) } }) }) } )})}