R 如何呈现来自同一分析的多个输出,而无需多次执行?(闪亮的)

R 如何呈现来自同一分析的多个输出,而无需多次执行?(闪亮的),r,shiny,R,Shiny,我正在编写一个闪亮的应用程序,其中包含一个随机函数,生成四个对象——一个绘图和三个表格。但是,我希望在不同的选项卡中呈现每个对象,而不必执行函数四次,因为此随机函数将生成四个不同的版本。我在网上进行了研究,发现很多人推荐“reactive()”,但我仍然不太明白如何将其应用于我的问题。如何在只执行一次函数的情况下在渲染时使用这四个对象 我的“server.R”结构基本上如下所示: shinyServer(function(input, output) { stochastic_fun

我正在编写一个闪亮的应用程序,其中包含一个随机函数,生成四个对象——一个绘图和三个表格。但是,我希望在不同的选项卡中呈现每个对象,而不必执行函数四次,因为此随机函数将生成四个不同的版本。我在网上进行了研究,发现很多人推荐“reactive()”,但我仍然不太明白如何将其应用于我的问题。如何在只执行一次函数的情况下在渲染时使用这四个对象

我的“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({

})

...
shinyServer(功能(输入、输出){
随机函数(){
...
plot1如果您的
model()
是一个列表,并且包含所有表格和一个绘图的数据,那么它应该像我的示例中那样工作

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

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

然而,有一件奇怪的事情…绘图并不总是呈现。有时你必须点击按钮几次才能得到绘图。表格总是工作的


库(闪亮)

ui-Hey@warmoverflow:)我还没有尝试过任何东西,但我正在考虑使用“model@warmoverflow我已经测试过了,并收到了错误消息。我用结果更新了帖子。如果你有什么想法,请告诉我。谢谢!:)在
reactiveEvent
中,你不再需要
reactive
模型
应该返回一个你可以使用
model()访问的值
。您忘记在
呈现*
函数中添加括号。(应该是
model()$table
)@UnnamedUser是正确的,您需要使用
model()
,但这也不会得到您想要的,因为我认为每次调用
model())
它再次运行代码。@warmoverflow我明白了。我遵循了“@UnnamedUser”提供的解决方案。虽然该函数已成功启动并完成,但在UI上没有任何绘图或表格。(不,这只是一个小的输入错误。@P谢谢!哦,顺便提一下,一个简短的问题,以防您知道答案-在运行模型()时)函数,它通过在控制台中使用“print(“xxx”)”打印大量日志信息。是否有办法将这些“print()”日志信息呈现到UI?是的,这可能是一种方式,但我希望在模型()运行时向用户显示日志文本。由于它是一个优化搜索函数,我希望用户在模型()运行时看到发生了什么正在运行。是否可能?不可能(或我不知道)有任何方法可以在反应进程运行时将消息输出到UI(输出将在反应进程结束后显示)。根本原因是Shining和R都是单线程的,不能同时完成两个任务。@UnnamedUser感谢您的分享!这非常有用!为什么有时候在我按下“Go!”按钮后,它开始运行一段时间后什么都没有发生?@warmoverflow Gotcha-有道理。感谢您的澄清!:)
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
                          ) 
                )
})
 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")))

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