используя реактивные значения в r блестящих модулей - PullRequest
1 голос
/ 31 января 2020

Привет, сообщество RShiny -

Мне все еще тяжело, когда я думаю о том, как передавать реактивные значения между модулями. Ниже у меня есть три модуля вместе с сервером верхнего уровня и функциями пользовательского интерфейса. Три модуля будут делать это (теоретически) 1) модуль uploadTree позволит пользователю вводить и читать файл дерева phylogeneti c; 2) модуль paramsTree будет представлять собой несколько входов визуализации дерева, которые пользователь может выбрать, и он будет изменен в импортированном дереве из модуля uploadTree; 3) модуль displayTree будет модулем, который отображает дерево и регулирует визуализацию на основе пользовательского ввода (т. Е. Align = T или F).

Однако мне все еще трудно заставить это работать - в конечном счете, вероятно, потому, что мне все еще неясно, как заставить модули общаться друг с другом. В нынешнем виде этот код не позволяет отображать дерево и выдает ошибку «не удалось найти функцию« выравнивание »*

Предложения ...

Ниже приведен пример жестких кодов в совмещении = T:

library(shiny)
library(ggtree)

#top-level ui
ui <- 
    fluidPage(
      h1("phylogeny"),
      sidebarPanel(
        mod_uploadTree_ui("uploadTree_ui_1")),
        #mod_paramsTree_ui("paramsTree_ui_1")), #commented out as this is not working 
      mainPanel(mod_displayTree_ui("displayTree_ui_1"))
    )

#top-level server
server <- function(input, output,session) {

  treeDisplay <- callModule(mod_uploadTree_server, "uploadTree_ui_1")
  #params <- callModule(mod_paramsTree_server, "paramsTree_ui_1") #commented out as this is not working. 
  callModule(mod_displayTree_server, "displayTree_ui_1", treeDisplay)
}

#uploadTree module - This module will use the read.newick function to read in a phylogenetic tree
mod_uploadTree_ui <- function(id){
  ns <- NS(id)
  tagList(
    fileInput(ns("treefile"), label="Upload a newick file, please"))
}


mod_uploadTree_server <- function(input, output, session){
  ns <- session$ns

  treeFile <- reactive({
    req(input$treefile)
    treeio::read.newick(input$treefile$datapath)
  })
}

  #paramsTree module - This module *should* include multiple tree display parameters that can be selected by the user. Here, only one parameter is included for a smaller example. But I am unable to add this without an error occurring. 
  mod_paramsTree_ui <- function(id){
    ns <- NS(id)
    tagList(
      checkboxInput(ns("alignTips"), "Align tip labels", TRUE)
    )
  }

  mod_paramsTree_server <- function(input, output, session){
    ns <- session$ns

    observe({
      align = reactive(input$alignTips)
    })
  }

  #displayTree module - This module will plot the tree and will change the tree viz based on user inputs from param module 
  mod_displayTree_ui <- function(id, label = "Display Tree"){
    ns <- NS(id)
    tagList(
      label,
      plotOutput(ns("treeDisplay"))
    )
  }

  mod_displayTree_server <- function(input, output, session, treeFile, align){
    ns <- session$ns

    make_tree <- reactive({
      ggplot2::ggplot(treeFile()) + ggtree::geom_tree() + ggtree::geom_tiplab(align = T) #hardcoded align = T instead of based on user input
    })

    output$treeDisplay <- renderPlot({
      make_tree()
    })
  }

shinyApp(ui, server)

в соответствии с предложением bretauv, вот код для чтения филогении и построения филогении с выровненными кончиками.

library(ggplot2)
library(treeio)
library(ggtree)

tree <- treeio::read.newick("1509MLJF6-1.dnd")
make_tree <- ggplot2::ggplot(tree) + ggtree::geom_tree() + ggtree::geom_tiplab(align = T)
make_tree

Screenshot of aligned  tips

При необходимости дерево филогенет c располагается здесь

1 Ответ

0 голосов
/ 02 февраля 2020

Каждая из функций вашего сервера должна возвращать reactive (или reactiveValues или reactiveVal), например:

mod_uploadTree_server <- function(input, output, session){
  ns <- session$ns

  treeFile <- reactive({
    req(input$treefile)
    treeio::read.newick(input$treefile$datapath)
  })

return(treeFile)
}
...