执行大型计算时闪亮的应用程序停滞不前

Shiny app is stalled when executing a big calculation

我是 shiny 的新手,到处都找不到我的答案。 我在 R 中有大量代码聚合表。我想将它移动到 Web 应用程序,我选择了 Shiny,因为我的原始代码是用 R 编写的,所以我认为它节省了我很多时间。

当我运行代码按

ObserveEvent(actionbutton$do,{mybigcalculation(input_tables)})

我的代码是 运行ning 但是在执行我的代码时,不可能做其他事情,比如在另一个 tabs.The 渲染部分中探索表格,但他的网络应用程序功能是在进程 运行ning.

时完全冻结

非常感谢任何帮助?如果这不起作用,我必须通过在单独的服务器中拥有后端(例如管道工)和前端(例如 React)来转向典型的 Web 应用程序开发。

谢谢

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

我在一个名为 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

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