执行大型计算时闪亮的应用程序停滞不前
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
我期待任何可以使答案变得更好的想法和建议。
我是 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
我期待任何可以使答案变得更好的想法和建议。