Я пытаюсь адаптировать один из примеров приложения Rshiny для своего собственного использования (с разделением деревьев), но я изо всех сил пытаюсь включить свои собственные данные в функции. Я считаю, что я успешно включил свои собственные данные, но сам график не отображается. Веб-страница обновляется новым пространством для графика, но на самом деле его не отображается.
Функциональность следующая: выбор «Да» проведет вас по конвейеру исходного приложения. Выбор Нет проведет вас через мою ветку.
Выберите «Нет», затем выберите «Один», щелкните любую строку в наборе данных и нажмите «Отправить». На стороне сервера есть жестко заданный набор тестовых данных, который будет использоваться для функции построения графика.
Я надеюсь, что кто-нибудь увидит любую очевидную вещь, которую я пропустил. (Прошу прощения за все библиотеки, они не нужны в приведенном мной примере)
GLOBAL
if (!"treeio" %in% installed.packages()) {
if (!"devtools" %in% installed.packages()) install.packages("devtools")
devtools::install_github("GuangchuangYu/treeio")
} else if (packageVersion("treeio") < "1.5.1.2") {
if (!"devtools" %in% installed.packages()) install.packages("devtools")
devtools::install_github("GuangchuangYu/treeio")
}
if (!"purrr" %in% installed.packages()) install.packages("purrr")
purrr::walk(c("shiny", "shinyjs", "tidyverse",
"ggtree", "tidytree", "shinyalert"), ~{
if (!.x %in% installed.packages()) install.packages(.x)
})
suppressWarnings({
suppressPackageStartupMessages({
library(shiny)
library(shinyjs)
library(tidyverse)
library(ggtree)
library(tidytree)
library(treeio)
library(shinyalert)
library(DBI)
library(DT)
library(shinycustomloader)
library(taxize)
library(dplyr)
library(tidyr)
library(data.table)
library(RMySQL)
library(phyloseq)
library(ggplot2)
library(ape)
library(plyr)
library(vegan)
library(scales)
library(grid)
library(reshape2)
library(promises)
library(future)
plan(multisession)
})
})
UI
shinyUI(tagList(
useShinyalert(),
useShinyjs(),
navbarPage(
title = "Microbial Community Tree Visualizer",
tabsetPanel(
id = "mainTabset",
tabPanel(
title = "Explore Tree",
class = "inputs",
column(
12,
selectInput(
inputId = "own_file",
label = "Do you already have a tree file to upload?",
choices = c(Choose = '',
No = 'no',
Yes = 'yes'),
selectize = FALSE
),
conditionalPanel(
condition = "input.own_file == 'yes'",
selectInput(
inputId = "file_type",
label = "Select Tree File Type:",
choices = c(
"Tree" = "tree",
"Beast" = "beast",
"CodeML mlc" = "mlc",
"jplace" = "jplace",
"MrBayes" = "mrbayes",
"NHX" = "nhx",
"rst (CODEML/BASEML)" = "rst",
"phylip" = "phylip",
"RAxML" = "raxml"
),
selected = "tree"
),
fileInput(inputId = "upload_tree",
label = "Select Tree File:")
),
conditionalPanel(
condition = "input.own_file == 'no'",
selectInput(
inputId = "tree_type",
label = "Would you like to view a single sample, or cluster multiple samples?",
choices = c(
Choose = '',
Single = 'single',
Multiple = 'multiple'
),
selectize = FALSE
),
conditionalPanel(
condition = "input.tree_type == 'single'",
DT::dataTableOutput("tbl1"),
actionButton(
"button1",
"SUBMIT",
style = "background-color:#221B70;
color:#E0EB15;
border-color:#E61029;
border-style:double;
border-width:4px;
border-radius:50%;
font-size:19px;"
)
)
)
),
uiOutput("select_node_render"),
fluidRow(uiOutput("subtree_render")),
fluidRow(uiOutput("subtree_render2"))
)
)
)
))
SERVER
shinyServer(
function(input, output, session) {
session$onSessionEnded(stopApp)
output$tbl1 <- DT::renderDataTable({mtcars})
output$tbl2 <- DT::renderDataTable({mtcars})
#button1
observeEvent(input$button1, {
test_phylo1 <- read.tree(text = "(uncultured_prokaryote:50,(Trachelomonas_bernardinensis:44,(uncultured_Hydrogenothermus_sp.:40,uncultured_Verrucomicrobia_bacterium:40,(uncultured_Fibrobacter_sp.:31,((uncultured_Flexibacter_sp.:14,uncultured_Flexibacteraceae_bacterium:14,Rudanella_lutea:14)Cytophagaceae:12,uncultured_Bacteroidetes_bacterium:26,(uncultured_Flavobacteriia_bacterium:22,(uncultured_Fluviicola_sp.:17,(Saonia_flava:14,(Flavobacterium_columnare:8.1,uncultured_Flavobacterium_sp.:8.1)Flavobacterium:6.1)Flavobacteriaceae:3.2)Flavobacteriales:4.7)Flavobacteriia:3.8)Bacteroidetes:5.2)FCB_group:8.4,(Deinococcus_piscis:29,(uncultured_actinobacterium:22,(Streptomyces_polyantibioticus_SPR:8.1,Streptomyces_roseoverticillatus:8.1)Streptomyces:14,(Arthrobacter_sp._cryopeg_2:17,Cryobacterium_sp._PIC-C9:17)Micrococcales:4.7)Actinobacteria:6.6,(Enterococcus_faecalis:22,(Staphylococcus_saprophyticus:17,Bacillus_sp._VA2:17)Bacillales:4.7)Bacilli:6.6)Terrabacteria_group:11,(Antarctic_bacterium_CA1:30,(uncultured_candidate_division_GN04_bacterium:27,uncultured_Candidatus_Saccharibacteria_bacterium:27)Bacteria_candidate_phyla:3.1)unclassified_Bacteria:9.6,((uncultured_rumen_bacterium:1.8,uncultured_deep-sea_bacterium:1.8,uncultured_soil_bacterium:1.8,uncultured_marine_bacterium:1.8,uncultured_bacterium:1.8,uncultured_sulfur-oxidizing_symbiont_bacterium:1.8)environmental_samples:19,(uncultured_beta_proteobacterium:3.6,uncultured_synthetic_wastewater_bacterium_tmbr15-22:3.6)environmental_samples:17)environmental_samples:19,(uncultured_Desulfomonile_sp.:26,(Candidatus_Tremblaya_princeps:22,((uncultured_Alcaligenaceae_bacterium:14,Bordetella_sp._M1-6:14,(Alcaligenes_sp._ACS1:3.3,Alcaligenes_sp._R-3:3.3,Alcaligenes_sp._RCT1:3.3)unclassified_Alcaligenes:11)Alcaligenaceae:3.2,(Oxalobacter_formigenes:14,(Herbaspirillum_sp._P-64:8.1,Herbaspirillum_huttiense:8.1,Herbaspirillum_rubrisubalbicans:8.1,Herbaspirillum_seropedicae:8.1,Herbaspirillum_frisingense:8.1)Herbaspirillum:6.1)Oxalobacteraceae:3.2,(uncultured_Burkholderiaceae_bacterium:14,(Cupriavidus_metallidurans:0.68,Cupriavidus_metallidurans_CH34:0.68)Cupriavidus_metallidurans:14,(Caballeronia_sordidicola:8.1,Caballeronia_glathei:8.1,Caballeronia_udeis:8.1)Caballeronia:6.1,(Pandoraea_sputorum:8.1,Pandoraea_thiooxydans:8.1)Pandoraea:6.1,(Paraburkholderia_tropica:8.1,Paraburkholderia_heleia:8.1,Paraburkholderia_hospita:8.1,Paraburkholderia_fungorum:8.1,Paraburkholderia_phytofirmans:8.1,Paraburkholderia_unamae:8.1,Paraburkholderia_kururiensis:8.1,Candidatus_Paraburkholderia_kirkii:8.1,Paraburkholderia_phenazinium:8.1)Paraburkholderia:6.1,((Burkholderia_pyrrocinia:1.4,Burkholderia_multivorans:1.4,(Burkholderia_ambifaria_MC40-6:0.68,Burkholderia_ambifaria:0.68)Burkholderia_ambifaria:0.72,Burkholderia_cenocepacia:1.4,(Burkholderia_cepacia:0.68,Burkholderia_cepacia_ATCC_25416:0.68)Burkholderia_cepacia:0.72)Burkholderia_cepacia_complex:6.7,(Burkholderia_sp.:2.9,Burkholderia_sp._CAF324:2.9,Burkholderia_sp._IMER-A1-16:2.9,Burkholderia_sp._KTC-1:2.9,Burkholderia_sp._IMER-A1-18:2.9,Burkholderia_sp._IMER-A1-15:2.9,Burkholderia_sp._m35b:2.9,Burkholderia_sp._70-VN5-1W:2.9,Burkholderia_sp._TNe-862:2.9,Burkholderia_sp._Br3464:2.9,Burkholderia_sp._N1MM10:2.9,Burkholderia_sp._NF100:2.9)unclassified_Burkholderia:5.3,(uncultured_Burkholderia_sp.:3.4,Burkholderia_sp._enrichment_culture_clone_F20_07a_B:3.4)environmental_samples:4.7,Burkholderia_plantarii:8.1,Burkholderia_gladioli:8.1,((Burkholderia_oklahomensis_EO147:0.68,Burkholderia_oklahomensis_C6786:0.68)Burkholderia_oklahomensis:0.72,(Burkholderia_mallei:0.68,Burkholderia_mallei_ATCC_23344:0.68)Burkholderia_mallei:0.72,(Burkholderia_thailandensis:0.68,Burkholderia_thailandensis_E264:0.68)Burkholderia_thailandensis:0.72,(Burkholderia_pseudomallei_305:0.68,Burkholderia_pseudomallei:0.68)Burkholderia_pseudomallei:0.72)pseudomallei_group:6.7)Burkholderia:6.1,(Ralstonia_solanacearum:8.1,uncultured_Ralstonia_sp.:8.1,(Ralstonia_sp._EF38:3.1,Ralstonia_sp._IFA3:3.1,Ralstonia_sp._DUT_AHX:3.1)unclassified_Ralstonia:5.1)Ralstonia:6.1)Burkholderiaceae:3.2,uncultured_Burkholderiales_bacterium:17,(Rivibacter_subsaxonicus:8.8,(Aquabacterium_sp._P-130:8.1,uncultured_Aquabacterium_sp.:8.1)Aquabacterium:0.63,Methylibium_sp._BAC115:8.8,Xylophilus_ampelinus:8.8,(uncultured_Leptothrix_sp.:8.1,Leptothrix_discophora:8.1)Leptothrix:0.63)Burkholderiales_Genera_incertae_sedis:8.7,((Comamonas_kerstersii:8.1,Comamonas_sp._46:8.1,Comamonas_aquatica:8.1)Comamonas:6.1,Brachymonas_denitrificans:14,Pelomonas_saccharophila:14,Hylemonella_sp._WQH1:14,Pseudomonas_sp._P51:14,(Verminephrobacter_eiseniae:0.68,Verminephrobacter_eiseniae_EF01-2:0.68)Verminephrobacter_eiseniae:14,Diaphorobacter_nitroreducens:14,(Polaromonas_sp._tsz24:1.9,Polaromonas_sp._01WB02.3-26:1.9)unclassified_Polaromonas:12,uncultured_Comamonadaceae_bacterium:14,(Acidovorax_valerianellae:8.1,uncultured_Acidovorax_sp.:8.1,Acidovorax_defluvii:8.1)Acidovorax:6.1,Delftia_acidovorans:14,Rhodoferax_antarcticus_ANT.BR:14,(Variovorax_paradoxus:8.1,Variovorax_soli_NBRC_106424:8.1)Variovorax:6.1)Comamonadaceae:3.2)Burkholderiales:4.7)Betaproteobacteria:3.8,Acidithiobacillus_ferrooxidans:26,(Halomonas_shengliensis:22,(Pararheinheimera_chironomi:8.1,Pararheinheimera_texasensis:8.1)Pararheinheimera:14,(Azotobacter_vinelandii:14,(Pseudomonas_savastanoi_pv._nerii:8.1,Pseudomonas_sp._6C_10:8.1,Pseudomonas_frederiksbergensis:8.1,Pseudomonas_putida:8.1,(Pseudomonas_fluorescens:1.4,Pseudomonas_mandelii:1.4,Pseudomonas_migulae:1.4)Pseudomonas_fluorescens_group:6.7)Pseudomonas:6.1)Pseudomonadaceae:7.9,(Klebsiella_aerogenes:17,Serratia_marcescens:17)Enterobacterales:4.7)Gammaproteobacteria:3.8,((Paracoccus_sp._T231:14,Phaeobacter_sp._M3-1.1:14,Roseovarius_sp._S6V:14,Rhodobacter_gluconicum:14)Rhodobacteraceae:7.9,(uncultured_Sphingomonas_sp.:8.1,(Sphingomonas_sp._N2:3.7,Sphingomonas_sp._Ant20:3.7)unclassified_Sphingomonas:4.4)Sphingomonas:14,(Rhodocista_sp._GP-7:14,Azospirillum_sp._DA2-3-1:14)Rhodospirillaceae:7.9,uncultured_Alphaproteobacteria_bacterium:22,((Afipia_broomeae:14,uncultured_Bradyrhizobium_sp.:14,Rhodopseudomonas_palustris:14)Bradyrhizobiaceae:3.2,(Candidatus_Liberibacter_africanus:14,(Rhizobium_multihospitium:8.1,Rhizobium_sp._SPC_RN2:8.1,Rhizobium_etli:8.1)Rhizobium:6.1)Rhizobiaceae:3.2,((Methylorubrum_thiocyanatum:8.1,(Methylorubrum_populi_BJ001:0.68,Methylorubrum_populi:0.68)Methylorubrum_populi:7.5)Methylorubrum:6.1,(Methylobacterium_oryzae:8.1,Methylobacterium_gregans:8.1,uncultured_Methylobacterium_sp.:8.1,Methylobacterium_fujisawaense:8.1,Methylobacterium_sp._ST4.9:8.1)Methylobacterium:6.1)Methylobacteriaceae:3.2)Rhizobiales:4.7)Alphaproteobacteria:3.8)Proteobacteria:14)Bacteria:4.2)cellular_organisms:6.3)NA;")
str(test_phylo1)
tree_df <- reactive({
output <- test_phylo1 %>%
as_data_frame()
})
output$select_node_render <- renderUI({
output <- tagList(
fluidRow(
column(
12,
selectizeInput(
inputId = "select_node",
label = "Select Node:",
choices = tree_df() %>%
select(label) %>%
arrange(label) %>%
pull(label),
width = "100%"
)
)
),
fluidRow(
column(
3,
numericInput(
inputId = "subtree_levels_back",
label = "Select Number of Ancestral Levels:",
min = 1,
value = 10
)
),
column(
3,
numericInput(
inputId = "subtree_text_size",
label = "Select label text size:",
min = 2,
value = 3
)
),
column(
3,
numericInput(
inputId = "subtree_plot_height",
label = "Select plot height",
value = 1200
)
),
column(
3,
numericInput(
inputId = "subtree_width_multiply",
label = "Select plot width multiplier:",
value = 1.4,
min = 1,
step = 0.1
)
)
)
)
return(output)
})
# creating the subtree
output$subtree <- renderPlot({
req(input$select_node, tree(),
input$subtree_width_multiply,
input$subtree_text_size,
input$subtree_plot_height)
# getting the subtree phylo or treedata object
sub_tree <- tree_subset(test_phylo1, node = input$select_node,
levels_back = input$subtree_levels_back)
# extracting the tip labels from the sub tree
if (isS4(sub_tree)) {
labels <- sub_tree@phylo$tip.label
} else {
labels <- sub_tree$tip.label
}
# doing some basic manipulation on labels
# this will only really work for labels of the format
# ;k__;p__;c__;o__;f__;g__;s__
labels_df <- tibble(
label = labels,
genus = str_extract(label, "[^;]+;[^;]+$") %>% str_replace(";[^;]+$", ""),
species = str_extract(label, "[^;]+$")
) %>%
mutate(
species = if_else(is.na(genus), "", str_replace(species, "s__", "")),
genus = if_else(is.na(genus), label, str_replace(genus, "g__", ""))
)
# creating the plot
p <- sub_tree %>%
ggtree(aes(color = group)) %<+% labels_df +
geom_tiplab(aes(label = paste(genus, species)),
size = input$subtree_text_size) +
theme_tree2() +
scale_color_manual(values = c(`1` = "red", `0` = "black"))
p + lims(x = c(0, max(p$data$x) * input$subtree_width_multiply))
})
# creating the ui element for the subtree
output$subtree_render2 <- renderUI({
req(input$subtree_plot_height)
plotOutput("subtree", height = input$subtree_plot_height)
})
})
#button2
observeEvent(input$button2, {
output$x5 = renderPrint({
validate(need(
length(input$tbl2_rows_selected) > 1,
"Please choose two or more samples."
))
cat('\n\nSelected rows:\n\n')
cat(input$tbl2_rows_selected, sep = ', ')
})
})
# reactive values are used to reset the file input when the
# file type is changed. This is done to prevent errors from
# popping up before a new file can be uploaded.
rv <- reactiveValues(
data = NULL,
clear = FALSE
)
observeEvent(input$upload_tree, {
rv$clear <- FALSE
}, priority = 1000)
observeEvent(input$file_type, {
rv$data <- NULL
rv$clear <- TRUE
reset('upload_tree')
}, priority = 1000)
# This reactive value reads in the tree object using one of the
# treeio import functions. If the function called, based on input$file_type
# fails, NULL is returned
tree <- reactive({
req(input$upload_tree, input$file_type,
input$upload_tree, !rv$clear)
file <- input$upload_tree$datapath
output <- switch(
input$file_type,
tree = possibly(read.tree, otherwise = NULL)(file),
beast = possibly(read.beast, otherwise = NULL)(file),
# codeml = possibly(read.beast, otherwise = NULL)(file),
mlc = possibly(read.codeml_mlc, otherwise = NULL)(file),
# hyphy = possibly(read.hyphy, otherwise = NULL)(file),
jplace = possibly(read.jplace, otherwise = NULL)(file),
mrbayes = possibly(read.mrbayes, otherwise = NULL)(file),
nhx = possibly(read.nhx, otherwise = NULL)(file),
rst = possibly(read.paml_rst, otherwise = NULL)(file),
phylip = possibly(read.phylip, otherwise = NULL)(file),
r8s = possibly(read.r8s, otherwise = NULL)(file),
raxml = possibly(read.raxml, otherwise = NULL)(file)
)
# read.tree(input$upload_tree$datapath)
return(output)
})
# This tree_df function
tree_df <- reactive({
req(tree())
output <- tree() %>%
as_data_frame()
})
observe({
req(input$upload_tree)
if (is.null(tree())) {
shinyalert("Tree import error", paste("There was an error when trying to read your tree!",
"Did you select the correct file format?"),
type = "error")
}
})
# Rendering the ui elements to select the node to subset,
# how far back to subset, and tree options (text size, height, width)
output$select_node_render <- renderUI({
req(input$upload_tree, tree())
output <- tagList(
fluidRow(
column(
12,
selectizeInput(
inputId = "select_node",
label = "Select Node:",
choices = tree_df() %>%
select(label) %>%
arrange(label) %>%
pull(label),
width = "100%"
)
)
),
fluidRow(
column(
3,
numericInput(
inputId = "subtree_levels_back",
label = "Select Number of Ancestral Levels:",
min = 1,
value = 10
)
),
column(
3,
numericInput(
inputId = "subtree_text_size",
label = "Select label text size:",
min = 2,
value = 3
)
),
column(
3,
numericInput(
inputId = "subtree_plot_height",
label = "Select plot height",
value = 1200
)
),
column(
3,
numericInput(
inputId = "subtree_width_multiply",
label = "Select plot width multiplier:",
value = 1.4,
min = 1,
step = 0.1
)
)
)
)
return(output)
})
# creating the subtree
output$subtree <- renderPlot({
req(input$select_node, tree(),
input$subtree_width_multiply,
input$subtree_text_size,
input$subtree_plot_height)
# getting the subtree phylo or treedata object
sub_tree <- tree_subset(tree(), node = input$select_node,
levels_back = input$subtree_levels_back)
# extracting the tip labels from the sub tree
if (isS4(sub_tree)) {
labels <- sub_tree@phylo$tip.label
} else {
labels <- sub_tree$tip.label
}
# doing some basic manipulation on labels
# this will only really work for labels of the format
# ;k__;p__;c__;o__;f__;g__;s__
labels_df <- tibble(
label = labels,
genus = str_extract(label, "[^;]+;[^;]+$") %>% str_replace(";[^;]+$", ""),
species = str_extract(label, "[^;]+$")
) %>%
mutate(
species = if_else(is.na(genus), "", str_replace(species, "s__", "")),
genus = if_else(is.na(genus), label, str_replace(genus, "g__", ""))
)
# creating the plot
p <- sub_tree %>%
ggtree(aes(color = group)) %<+% labels_df +
geom_tiplab(aes(label = paste(genus, species)),
size = input$subtree_text_size) +
theme_tree2() +
scale_color_manual(values = c(`1` = "red", `0` = "black"))
p + lims(x = c(0, max(p$data$x) * input$subtree_width_multiply))
})
# creating the ui element for the subtree
output$subtree_render <- renderUI({
req(input$subtree_plot_height,tree())
plotOutput("subtree", height = input$subtree_plot_height)
})
}
)