如何在不执行多次的情况下从同一分析中呈现多个输出? (光泽)

时间:2016-05-06 15:12:22

标签: r shiny

我正在写一个闪亮的应用程序,其中包含一个随机函数生成四个对象 - 一个绘图和三个表。但是,我想在不执行该函数的情况下将每个对象渲染到不同的选项卡中四次,因为这个随机函数将生成四个不同的版本。我在网上进行了研究,发现很多人推荐"被动()"但我还是不太明白如何将它应用到我的问题中。如何在渲染上使用这四个对象,只需执行一次该函数?

我的" server.R"结构基本上如下所示:

shinyServer(function(input, output) {

     stochastic_function() {
          ...
       plot1 <- ...
       table1 <- ...
       table2 <- ...
       table3 <- ...
       result <- list(plot, table1, table2, table3)
     return(result)
     }

 output$plot <- renderPlot({

})

 output$table1 <- renderTable({

})

 output$table2 <- renderTable({

})

 output$table3 <- renderTable({

})

...

所以,我已尝试过以下类似的随机函数:

model <- eventReactive(input$goButton, {
        reactive(WG_Model(cdata = cdata(), # load data from outside env
                          sdata = sdata(), # load data from outside env
                          N = input$n, 
                          end_date = input$end_date,
                          cpx_goal = input$cpx,
                          N_new = input$n2, 
                          end_date_new = input$end_date2,
                          spend_range = input$s_range,
                          spend_incr = input$s_incr
                          ) 
                )
})

这个想法是添加一个&#34; GoButton&#34;启动该功能,然后将所有输出保存在反应式fun()中。所以我可以用:

渲染每个输出
 output$plot <- renderPlot({
   model$gplot
})

 output$table <- renderTable({
   model$table
})

# Render UI section 
 output$tb <- renderUI({
  tabsetPanel(tabPanel("About Model", plotOutput("plot")), 
              tabPanel("About Model", tableOutput("table")))

  })

然而,我只得到了#34;错误:类型&#39;关闭的对象&#39;不是子集表格&#34;在UI输出中。我错过了哪一部分?

1 个答案:

答案 0 :(得分:3)

如果您的model()是一个列表而包含所有表格和情节的数据,那么它应该像我的示例一样工作。

在此应用程序中,按下按钮后,会生成表格和绘图的随机数和数据。然后将数字,表格数据和绘图作为列表返回,并使用适当的render*函数进行渲染。

此应用程序说明model函数在其他反应函数中使用model()访问后将不会重新运行。

然而,有一件奇怪的事情......情节并不总是呈现。您有时需要点击按钮几次才能获得情节。该表始终有效。

library(shiny)

ui <- shinyUI(fluidPage(
   br(),
   actionButton("numb", "generate a random numbers"),
   br(),
   br(),
   verbatimTextOutput("text"),
   plotOutput("plot"),
   tableOutput("table")
))

server <- shinyServer(function(input, output) {

  model <- eventReactive(input$numb, {
    # draw a random number and print it
    random <- sample(1:100, 1)
    print(paste0("The number is: ", random))

    # generate data for a table and plot
    data <- rnorm(10, mean = 100)
    table <- matrix(data, ncol = 2)

    # create a plot 
    Plot <- plot(1:length(data), data, pch = 16, xlab ="", ylab = "")

    # return all object as a list
    list(random = random, Plot = Plot, table = table)
  })

   output$text <- renderText({
     # print the random number after accessing "model" with brackets.
     # It doesn't re-run the function.
     youget <- paste0("After using model()$random you get: ", model()$random,
                      ". Compare it with a value in the console")
     print(youget)
     youget
   })

   output$plot <- renderPlot({
     # render saved plot
     model()$Plot
   })

   output$table <- renderTable({

     model()$table
   })
})


shinyApp(ui = ui, server = server)