据我了解,eventReactive
(或任何反应函数)不应重新计算其相关输入未更改的内容,但这就是我的情况。我很确定自己做错了什么,但我只是不知道该怎么办。本质上,我有两个eventReactive
函数,一个涉及非常耗时的计算,另一个主要只是作图(应该很快)。但是,即使我更改了一些用于绘图的输入,第一个eventReactive
函数也会执行(即使不需要)。
这是我的代码的简化版:
server <- function(input, output) {
res_tabl <-
eventReactive(c(input$recalc, input$recalc2), # this is a time-consuming calculation
ignoreNULL = FALSE, {
prep_sim(
gg_start = input$gg_start,
gg_end = input$gg_end
)
})
threeplots <-
eventReactive(c(input$recalc, input$recalc2), # this is for plotting
ignoreNULL = FALSE, {
prep_plot(
results_to_plot = res_tabl(),
yval_opt = input$yval_opt
)
})
output$esdc_plot_comb <- renderPlot({
threeplots()[[1]]
})
output$esdc_plot_tot <- renderPlotly({
threeplots()[[2]]
})
output$esdc_plot_comb2 <- renderPlot({
threeplots()[[1]]
})
output$esdc_plot_tot2 <- renderPlotly({
threeplots()[[2]]
})
output$esdc_table <- renderDataTable({
res_tabl()
})
}
我应该怎么做,当我按下操作按钮并且仅更改input$yval_opt
时,仅第二个eventReactive
内容会运行?
重要的是-减少-也许这应该是一个单独的问题-如您所见,我两次绘制了两个返回的图。也许有更有效的方法可以做到这一点?
(完整的代码可用here。]
我认为第二反应式应该是这样的,因此对res_tabl()
或input$yval_opt
的变化有依赖性
threeplots <- eventReactive(c(res_tabl(),input$yval_opt),{
prep_plot(
results_to_plot = res_tabl(),
yval_opt = input$yval_opt
)
},ignoreNULL = FALSE)