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 大数据, 统计分组查询,数据量比较大计算十分钟内每秒钟执行次数