将Shiny渲染输出放置在其他函数中

时间:2019-02-18 17:15:33

标签: r shiny

因此,我正在制作一个闪亮的应用程序,该应用程序需要多个输入并生成这些输入的多个图形和表格。

制作一个表格的示例RenderTable代码如下:

construct_table <- function(genes_select, dataset){
    renderTable(data.frame(Shape = c("\u25CF", "\u25B2", "\u25FC", ""),
                          "Genes" = genes_select,
                           Analysed_values = c(t(dataset), mean(dataset))), 
                           striped = TRUE, bordered = TRUE, hover = TRUE)
  }

其中Shape是图形上的符号,“ Genes”是使用selectizeInput选择的基因,analysis1()是代码前面定义的反应式计算的结果。

但是我有8-9个表格需要显示,这取决于各种复选框等。我不想制作粘贴代码并替换所有相关值的方法,而是想创建一个可以用来快速显示所有内容的函数表格,如果以后需要更改格式或添加任何内容,我可以编辑函数,而不必单独编辑每个表格。

我尝试使用下面的代码制作可重复使用的功能:

output$Table1 <- construct_table(input$custom_genes1, analysis1())

然后可以更轻松地直接调用每个表:

{{1}}

此方法的工作原理是使用初始输入值创建表,但不会使表具有反应性。

如何在普通函数内调用renderTable反应函数,或者我是否忽略了另一个可以将renderTable函数嵌套在其中的函数,其工作方式与普通函数相同?

1 个答案:

答案 0 :(得分:1)

仅在任意位置添加output$Table1 <- construct_table(input$custom_genes1, analysis1())调用是行不通的,因为analysis()是一个响应变量,取决于用户可以更改的其他输入。因此analysis()可以从反应上下文中使用。即。从observe, observeEvent, reactive, eventReactive or inside any renderXXX call ex: renderTable, renderPlot...

内部

当我们致电output$Table1 <- construct_table(input$custom_genes1, analysis1())时, 我们正在外部中使用analysis1(),这会导致错误。解决方案是Shiny Modules,该模块专门设计用于模块化代码,这似乎是这里的目标。

  

https://shiny.rstudio.com/articles/modules.html

这里是一个例子,

dataset = mtcars

generatePlot = function(input,output,session,data){
  output$plot = renderPlot({
    plot(data()$hp,data()$mpg)
    })
}


generateUI = function(id){
  ns = NS(id)
  plotOutput(ns("plot"))
}

shinyApp(
  ui = {
    fluidPage(
      sliderInput("slider","MPG filter",min(dataset$mpg),max(dataset$mpg),dataset$mpg),
      generateUI("mod1"),
      generateUI("mod2")
    )
  },
  server = function(input,output,session){

    data = eventReactive(input$slider,{
      dataset%>%
        dplyr::filter(between(mpg,input$slider[[1]],input$slider[[2]]))%>%
        return(.)
    })

    callModule(generatePlot,"mod1",data = data)
    callModule(generatePlot,"mod2",data = data)

  }
)

您只需添加一个新的generateUI和一个新的callModule调用即可添加更多相同的图。