我正在构建一个闪亮的Web应用程序,并且在使用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)
}
)
答案 0 :(得分:0)
我很难确切地说出发生这种情况的原因,但是当您的表情过于复杂或设计方式与闪亮设计师的设计方式不同时,闪亮通常会做一些奇怪的事情。这就是我将重写您的代码示例以使其更符合闪亮准则的方式。如果能解决您的问题,我不会感到惊讶:
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)
})
答案 1 :(得分:0)
总的来说,我同意@divibisan 的观点,即直接使用 renderPlot
应该可以很好地工作。另外,我认为可以肯定地说 renderPlot
是 Shiny 推荐的模式。如果您的反应式表达式(无论您最终选择哪种)由于频繁更新而给您带来麻烦,您可以使用 debounce
or throttle
减慢速度。
去抖动意味着失效被推迟 millis
毫秒。反应式表达式只会在该时间窗口过去之前被验证,而不会出现随后的失效,这可能会产生如下效果:ooo-oo-oo---- => -----------o-< /p>
另一方面,节流不会在每次失效时重置时间窗口。节流反应“将定期失效,速率等于或慢于时间窗口”(来自手册):ooo-oo-oo---- => o--o--o--o-- -