alo*_*p85 7 multithreading r shiny
我想知道在运行Shiny应用程序时是否可以保持连续的后台任务.这意味着,例如,一个" 线程 "可以在shinyApp运行时将数据从网页下载到数据库.
甚至更多,是否可以与外部背景" 线程 "中的数据进行交互?(例如,在下载时,制作情节或其他内容).
在视频教程中,据说:"服务器功能之外的代码将在每个R会话(工作者)运行一次".所以,我认为我需要的代码应该放在服务器函数之外.
是否有可能实现我描述的场景?或者我需要另一个外部R实例(在shinyApp脚本之外)?
提前致谢.
我正在考虑这个,我认为这是可能的,但我想到的实现是特定于平台的。在本例中,我将假设使用 ubuntu 14.04。
假设您有一些计算密集型任务:
ui.R:
library(shiny)
fluidPage(
numericInput('number','Number',10000000),
textOutput('CalcOutput')
)
Run Code Online (Sandbox Code Playgroud)
服务器R
library(shiny)
function(input,output,session) {
output$CalcOutput <- renderText({
sort(runif(input$number))
})
}
Run Code Online (Sandbox Code Playgroud)
将操作迁移到子文件中相关变量的函数:
新文件.R
saveRDS(sort(runif(commandArgs(TRUE)[1])), file = 'LargeComputationOutput')
Run Code Online (Sandbox Code Playgroud)
改变你的服务器。R
function(input, output) {
observe({
# Starts script as a background process, but completes instantaneously
system(paste('Rscript newfile.R',input$number,'&'))
})
CalculationOutput <- reactive({
invalidateLater(5000)
validate(
need(file.exists('LargeComputationOutput'),'Calculation In Progress'),
need(file.info('LargeComputationOutput')$mtime > Sys.time()-5,'Calculation In Progress')
)
x <- readRDS('LargeComputationOutput')
})
output$CalcOutput <- renderText({
CalculationOutput()[300]
})
}
Run Code Online (Sandbox Code Playgroud)
这仍然有点问题,但它是概念证明,您可以将密集型操作移至子进程,并让反应式侦听器检测这些计算何时完成。
编辑:Shiny 还需要写入相关位置的权限。