【问题标题】:Clarification on using observeEvent and eventReactive together关于一起使用 observeEvent 和 eventReactive 的说明
【发布时间】:2017-05-27 03:59:54
【问题描述】:

我对反应性感到困惑,希望你们中的某个人能提供帮助。

当我在代码中使用eventReactive 时,我包含了一个涉及变量rpcMatrix 的计算,该变量不会返回。 (相反,另一个变量 DF_new 被返回。)我承认这是一种草率的做事方式,但我认为它没有理由不工作。

现在,变量RPCobserveEvent 函数中定义。尽管RPC 不是响应式的,但我相信它的值在observeEvent 函数中确实会发生变化,因为wb 会根据states() 响应式变量发生变化。当RPC 发生变化时,我希望eventReactive 函数会导致rpcMatrixfor 循环中发生变化。

如果两个变量都在 eventReactive 中,rpcMatrix 会根据 RPC 的变化而变化吗?

我避免使用reactive 关键字的原因是因为它给我使用loadWorkbook 命令分配wb 带来了麻烦。 非常感谢你们的帮助。我希望我把我的问题说清楚了。

observeEvent(input$submit,{
   #NEXT 2 LINE ARE PERTINENT TO QUESTION: 

   wb <<- loadWorkbook(file =file.path(src,"www","State_Vectors",states()))
...
  RPC<<-read.xlsx(wb,sheet=1,startRow=1,cols=11)
})

data = eventReactive(input$submit,{
       ...
          DF_new<<- hot_to_r(input$tbl)

          *NEXT 2 LINES ARE PERTINENT TO QUESTION:
       rpcMatrix<<-as.data.frame(matrix(0, nrow= dim(as.matrix(category))[1], ncol =dim(as.matrix(category))[1]))
      for(i in 1:dim(category)[1]) #NTP
      {
        for(j in 1:dim(category)[1])
        {
          rpcMatrix[i,j]<<-as.matrix(RPC[i,1])
      }
      }
          DF_new<<-DF_new[,-c(1,2,6)] 
        }
       return(DF_new) 
        })

【问题讨论】:

  • 使用 reactive 或 eventReactive 你真的不需要&lt;&lt;-

标签: r shiny


【解决方案1】:

这个不能期望能可靠地工作。这是有问题的,因为它需要在同一个input$submit 上触发的两个反应语句的特定执行顺序。虽然您可以设置一些优先级值,从而使其更频繁地工作,但优先级功能不可靠,强烈建议不要使用它。

但这个“执行顺序”问题正是响应式旨在解决的问题。我建议您考虑使用reactiveValues

它们有两个主要特点:

  • 反应式调用的寿命 您现在可能已经知道,反应式函数有自己的环境/范围,并且您在其中创建的变量不会保留。一种解决方法是使用&lt;&lt;- 语句,但这是一种“全局变量”的方法,在 R 的函数世界中应该避免使用。它有很多问题。另一方面,reactiveValues 在您随后在 Shiny 程序中创建的所有反应范围中都可用。它们正是您需要避免使用 &lt;&lt;- 语句来在调用您的响应式代码时保留状态的必要条件。

  • 反应性效应作为一个额外的好处,它们会产生与input$.. 变量相同的反应性效应。这是一个非常强大的功能,意味着您可以创建整个反应式计算网络 - 您可以在这里使用它。

所以我可能会推荐这样的方法:

rv <- reactiveValues(wb=NULL,RPC=NULL)

observeEvent(input$submit,{

   rv$wb <- loadWorkbook(file =file.path(src,"www","State_Vectors",states()))
   ...
   rv$RPC<-read.xlsx(rv$wb,sheet=1,startRow=1,cols=11)
})

data <- reactive({
      ...
      DF_new<- isolate(hot_to_r(input$tbl))

      rpcMatrix<-as.data.frame(matrix(0, nrow= dim(as.matrix(category))[1], 
                                         ncol =dim(as.matrix(category))[1]))
      for(i in 1:dim(category)[1]) #NTP
      {
        for(j in 1:dim(category)[1])
        {
          rpcMatrix[i,j]<-as.matrix(rv$RPC[i,1])
      }
    }
    DF_new<-DF_new[,-c(1,2,6)] 
  }
  return(DF_new) 
})

它是这样工作的:

  1. 我们设置了一个名为rvreactiveValues 列表来保存RPC
  2. 现在当input$submit 被触发时,工作簿将被加载,rv$RPC 将发生变化。
  3. 然后当rv$RPC 改变时,响应式data 将被触发(如果用作data())。

执行顺序是有保证的,这就是我认为你想要的。

其他说明:

  • 我假设您不希望它在input$tbl 更改时触发,所以我将它放在isolate 中。 eventReactive 就是这样对待它的。
  • 在我看来,您正在从头开始计算 DF_newrpcMatrix,因此您不需要为它们使用 &lt;&lt;- 运算符(正如 HubertL 在评论中提到的那样)。
  • 如果您想在其他地方使用 DF_newrpcMatrix 则例外,例如显示它们以进行调试或其他用途。然后您也可以将 then 放入 rv,然后在您的 reactiveStatements 中将地址设置为 rv$DF_newrv$rpcMatrix

  • 我不确定wb 是否需要在该reactiveValues 列表中,可能您只需要在该observeEvent 本地。

一般还有reactiveValues

  • 在反应范围之外,reactiveValues 中的元素可以通过isolate(rv$NPC) 访问
  • 是反应性元素(如上面的rv$NPC),而不是根(即上面的rv 不是反应性的)
  • 实际上不需要用NULL初始化reactiveValues语句中的变量,你可以给他们其他的初始值,或者甚至离开他们,让他们在赋值时使用。不过,我发现当我看到他们列出的程序时,这有助于我理解我的程序。

【讨论】:

    猜你喜欢
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 2019-05-14
    • 2021-12-05
    • 2012-03-24
    • 2017-06-18
    • 2011-07-25
    相关资源
    最近更新 更多