如何绕过R Shiny中反应式表达式的延迟加载?

时间:2016-02-11 22:05:43

标签: r shiny lazy-evaluation

在一个闪亮的应用程序中,假设我的数据非常大,以至于我只想执行一次操作。

server.R脚本可能如下所示:

shinyServer(function(input, output, session) {
  data <- matrix(some_x, nrow=1000, ncol=5000)

  calculation <- observe({
    data <<- some_transformation(data, input$coefficient)
  })

  output$plot1 <- renderPlot({
    plot(some_other_transformation(data))
  })

  output$plot2 <- renderPlot({
    plot(some_other_transformation(data))
  })

  output$plot3 <- renderPlot({
    invisible(input$coefficient)
    plot(some_other_transformation(data))
  })
})

为什么plot3的反应式表达式是唯一评估的表达式? input变量的存在是否“诱导”对此表达式的评估?

我的主要问题是:如何在不提及input变量的情况下“诱导”表达情节1和2?

1 个答案:

答案 0 :(得分:0)

如果您正在执行计算,那么观察者就是错误的工作工具,请参阅here。如果您只想执行一次计算,那么您应该有一个操作按钮。如果您希望每次更改输入时都执行操作,那么您应该使用被动:

shinyServer(function(input, output, session) {
  data <- matrix(some_x, nrow=1000, ncol=5000)

  trans_data <- reactive({
    some_transformation(data, input$coefficient)
  })

  output$plot1 <- renderPlot({
    plot(some_other_transformation(trans_data()))
  })

  output$plot2 <- renderPlot({
    plot(some_other_transformation(trans_data()))
  })

  output$plot3 <- renderPlot({
    invisible(input$coefficient)
    plot(some_other_transformation(trans_data()))
  })
})

被动反应只运行一次,见this

  

反应式表达式比常规R函数更聪明一些。他们缓存他们的价值观并知道他们的价值何时变得过时。这是什么意思?第一次运行反应式表达式时,表达式会将其结果保存在计算机的内存中。下次调用反应式表达式时,它可以返回此保存的结果而不进行任何计算(这将使您的应用程序更快)。