Shiny 应用程序在执行大计算时停止

Posted

技术标签:

【中文标题】Shiny 应用程序在执行大计算时停止【英文标题】:Shiny app is stalled when executing a big calculation 【发布时间】:2021-11-15 22:22:09 【问题描述】:

我是新来的 shiny ,在任何地方都找不到我的答案。 我在 R 中有一个繁重的代码聚合表。我想将它移到 Web 应用程序中,我选择了 Shiny,因为我的原始代码是用 R 编写的,所以我认为它可以节省我很多时间。

当我运行代码时

ObserveEvent(actionbutton$do,mybigcalculation(input_tables))

我的代码正在运行,但在执行我的代码时,无法执行其他操作,例如探索其他选项卡中的表格。渲染部分有效,但 Web 应用程序功能在进程运行时完全冻结.

任何帮助将不胜感激?如果这不起作用,我必须通过将后端(例如水管工)和前端(例如 React)放在不同的服务器中来转移到典型的 Web 应用程序开发。

谢谢

【问题讨论】:

如果你想要异步应用,那么看看这篇文章blog.rstudio.com/2018/06/26/shiny-1-1-0 谢谢@PorkChop。它只是将进程带到后台(所以我在控制台中看不到它),但网络应用程序仍然停滞不前。我这次就是这样用的。 输出 【参考方案1】:

经过长时间的调查,我想我找到了答案。我把它写在这里是因为你可能会经常遇到这个问题,通过 Shiny 开发你的网络应用程序。总是有一些你想做的大过程,并想确保你的异步工作得很好。 Cheng 解释了一些库(future & promises 包)here。它说,他们可以在后台进行计算,并让他们在闪亮的应用程序正常工作时返回结果。它对我不起作用,我的网络应用程序仍然停滞不前。但我所看到的,它们确实大大提高了 mybigcalculation 的速度。它还把它带到后台使它在控制台中不可见。

感谢一家名为appsilon 的公司发布了Shiny.worker library,我找到了答案。 现在我的应用程序运行良好,而我昂贵的代码在后台运行。我通过将 future 包包装在 shiny worker 库中来实现理想的执行(快速和异步)。 所以它看起来像这样:

load.lib <- c("promises","future","shiny.worker")

install.lib <- load.lib[!load.lib %in% installed.packages()]
for(lib in install.lib) install.packages(lib,dependencies=TRUE)
sapply(load.lib,library,character=TRUE)

plan(multisession)

通过以下方式启动工作器:

worker <- shiny.worker::initialize_worker()

然后:

wrapper <- function(args) 
  future::future(my_heavy_calculations(args$r))



reactive_arguments <- reactive( 
  input$start
  list(r = rnorm(1))
)


resultPromise <- worker$run_job("job1", wrapper, args_reactive = reactive_arguments)

resultPromise()$result # contains the result of the calculations

resultPromise()$resolved # contains flag that informs whether the job has finished or not

我期待任何可以使答案更好的想法和建议。

【讨论】:

以上是关于Shiny 应用程序在执行大计算时停止的主要内容,如果未能解决你的问题,请参考以下文章

在 Shiny 中,等待用户停止使用 rhandsontable 填充表格

sql server 大数据, 统计分组查询,数据量比较大计算十分钟内每秒钟执行次数

在 Shiny 上设置“重置值”按钮

R Shiny REST API 通信

使用reactiveValues()在Shiny中绘制动态C5.0决策树

让 Shiny 更新 ui 并在之后运行长时间计算