【发布时间】:2016-05-06 15:12:22
【问题描述】:
我正在编写一个闪亮的应用程序,其中包含一个随机函数生成四个对象 - 一个绘图和三个表格。但是,我想在不执行该函数四次的情况下在不同的选项卡中呈现每个对象,因为这个随机函数将生成四个不同的版本。我在网上进行了研究,发现很多人推荐“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({
})
...
所以,我尝试了以下随机函数:
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
)
)
})
这个想法是添加一个“GoButton”来启动函数,然后将所有输出保存在一个响应式 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")))
})
但是,我在 UI 输出中只收到“错误:'closure' 类型的对象不是子集”。我错过了哪一部分?
【问题讨论】:
-
嘿@warmoverflow :) 我还没有尝试过任何东西,但我正在考虑使用“model
-
@warmoverflow 我已经对其进行了测试并收到了错误消息。我用结果更新了帖子。如果您有任何想法,请告诉我。谢谢!:)
-
在
reactiveEvent内,您不再需要reactive。model应该返回一个可以使用model()访问的值。您忘记在render*函数中添加括号。 (应该是model()$table) -
@UnnamedUser 是正确的,你需要使用
model(),但这也不会得到你想要的,因为我认为每次你调用model()它都会再次运行代码。跨度> -
@warmoverflow 我明白了。我遵循“@UnnamedUser”提供的解决方案。尽管该功能已成功启动并完成,但我没有在 UI 上看到任何绘图或表格。 ;(