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