Rshiny приложение не отображает сюжет, просто пустой заполнитель - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь адаптировать один из примеров приложения 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)
    })


  }
)

1 Ответ

0 голосов
/ 01 апреля 2020

Нашли это! Я пропустил одну зависимость в этом блоке кода сервера:

# creating the subtree
      output$subtree <- renderPlot({
        req(input$select_node, **tree()**, 
            input$subtree_width_multiply, 
            input$subtree_text_size,
            input$subtree_plot_height)

Удаление "tree ()" исправило это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...