【发布时间】:2020-01-10 15:49:54
【问题描述】:
我有一个 R Shiny 仪表板,其中有 2 个观察者设置为在特定时间刷新,一个观察者每 6 小时刷新一次,另一个每 2 分钟刷新一次。两个观察者都运行一个返回反应值的函数。这工作正常,但是每 6 小时触发第一个观察者时,它会锁定仪表板并阻止其他观察者运行。经过一番阅读,我知道我需要使用期货和承诺,但无法实现任何按预期工作的东西。如何将每个观察者中的函数包装到各自的期货中以防止阻塞?
values <- reactiveValues()
observe({
# Re-execute this reactive expression every 2 mins
invalidateLater(120000, session)
values$twominresult <- twoMinFunction()
})
observe({
# Re-execute this reactive expression every 6 hours
invalidateLater(21600000, session)
values$sixhourresult <- sixhourfunction()
})
【问题讨论】:
-
请发布一个包含完整 ui.R 和 server.R 的可重现示例,以便我们可以运行该应用程序。
-
使用future和promise并不能解决问题,因为shiny中固有的刷新周期。所以如果
sixhourfunction()是一个长时间运行的函数。即使您使用期货,它也会阻止此特定会话中的所有其他观察者。唯一有用的是并行运行的多个会话。 rstudio.github.io/promises/articles/shiny.html -
@Sada93 有一种方法可以创建会话内非阻塞期货。请参阅this。但是,它必须持保留态度:如果不小心使用这种方法,可能会导致竞态条件。