【问题标题】:R: Shiny - observeEvent invalidates too oftenR: Shiny - observeEvent 经常失效
【发布时间】:2018-12-05 13:22:34
【问题描述】:

我正在构建一个闪亮的网络应用程序,但在使用 observeEvent 函数时遇到了问题。我用它来观察一些 UI 元素的变化,然后将其用作使用 renderPlot 的函数的参数。

问题是,当其中一个 UI 元素发生变化时,它会调用该函数两次。一次使用更改前的原始值,然后再次使用新值。这导致了我不会详细描述的问题,但我想修改任何必要的内容,以便它只使用新值调用该函数一次。有谁知道为什么observeEvent 会这样或者我该如何解决?谢谢

编辑:这是可疑代码

来自服务器:

    observeEvent(c(input$single_expNum, input$trait_exp, 
       input$plotExp_by, input$single_expDayRange), {
          output$single_expGraph <- plotExperiment(dataset, 
            input$single_expNum, input$trait_exp, 
            input$plotExp_by, input$single_expDayRange)
       }
    )

【问题讨论】:

  • observeEventhandlerExpr 中的所有内容都视为包装在isolate 函数中,因此仅当input 中的inputreactiveValue 时才应触发eventExpr无效(更改)。如果不查看您的代码,就很难确定出了什么问题。你能发一个minimal reproducible example你的问题吗?
  • 我已更新帖子以包含一段代码
  • 如果您传递多个要观察的输入,则应该使用大括号。 observeEvent({input$single_expNum, input$trait_exp..},{...} )
  • 你为什么在这里使用observeEvent?由于handlerExpr 中的每个反应元素也在eventExpr 中,这与使用reactive 完全相同。
  • 只有当我将它作为一个集合保存在推荐的大括号内时,它才会在语法上起作用,即使那样它对问题没有任何影响......

标签: r shiny reactive


【解决方案1】:

我很难准确地说出为什么会发生这种情况,但是当您的表情过于复杂或设计方式与 Shiny 的设计者不同时,shiny 经常会做一些奇怪的事情。这就是我将重写您的代码示例以使其更符合闪亮原则的方式。如果这能解决您的问题,我不会感到惊讶:

output$single_expGraph <- renderPlot({
    # I assume here that plotExperiment() is a function that returns a plot
    plotExperiment(dataset,
                   input$single_expNum, input$trait_exp,
                   input$plotExp_by, input$single_expDayRange)
})

【讨论】:

    【解决方案2】:

    总的来说,我同意@divibisan 的观点,即直接使用renderPlot 应该可以很好地工作。另外,我认为可以肯定地说renderPlot 是Shiny 推荐的模式。如果您的反应式表达(无论您最终选择哪种)因为频繁更新而给您带来麻烦,您可以使用debounce or throttle 减慢它的速度。

    去抖动意味着失效被推迟millis 毫秒。反应式表达式只会在该时间窗口过去后才被验证,而随后的失效可能会产生如下效果:ooo-oo-oo---- => -----------o-

    另一方面,限制不会在每次失效时重置时间窗口。受限制的反应“将以等于或低于时间窗口的速率定期失效”(来自手册):ooo-oo-oo---- => o--o--o--o-- -

    【讨论】:

      猜你喜欢
      • 2017-11-06
      • 2022-01-19
      • 2018-12-14
      • 2019-08-01
      • 2022-01-04
      • 2021-11-14
      • 2017-02-23
      • 2018-11-18
      • 2021-06-06
      相关资源
      最近更新 更多