【问题标题】:Placing Shiny render outputs inside other functions将闪亮的渲染输出放在其他函数中
【发布时间】:2019-07-12 03:11:32
【问题描述】:

所以我正在制作一个闪亮的应用程序,它接受多个输入并生成这些输入的多个图和表。

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

output$Table1 <- 
      renderTable(data.frame(Shape = c("\u25CF", "\u25B2", "\u25FC", ""),
                             "Genes" = c(input$custom_genes1, "Mean"),
                              Analysed_values = c(t(analysis1()), mean(analysis1()))), 
                              striped = TRUE, bordered = TRUE, hover = TRUE)

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

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

我尝试使用下面的代码创建一个可重复使用的函数:

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)
  }

然后更容易直接调用每个表:

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

这适用于使用初始输入值创建表,但不会使表反应。

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

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    简单地在任何地方添加output$Table1 &lt;- construct_table(input$custom_genes1, analysis1()) 调用将不起作用,因为analysis() 是一个反应变量,取决于用户可以更改的其他输入。因此,analysis() 可以在反应式上下文中使用。 IE。来自内部observe, observeEvent, reactive, eventReactive or inside any renderXXX call ex: renderTable, renderPlot...

    当我们拨打output$Table1 &lt;- 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 调用来添加更多相同的图。

    【讨论】:

    • 谢谢,对于延迟回复感到抱歉,我相信这就是我想要的,虽然我之前没有尝试过 ShinyModules。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 2015-01-11
    • 2016-06-12
    相关资源
    最近更新 更多