eventReactive使用不变的输入重新计算已经计算出的对象

问题描述 投票:0回答:1

据我了解,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。]

r caching shiny lazy-loading shiny-reactivity
1个回答
0
投票

我认为第二反应式应该是这样的,因此对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)
© www.soinside.com 2019 - 2024. All rights reserved.