我想知道在运行Shiny应用程序时是否可以保持连续后台任务。这意味着,例如," 线程"可以在shinyApp运行时将数据从网页下载到数据库。
更多的是,是否可以与来自外部背景的数据进行交互" 线程"? (例如,在下载时,制作情节或其他内容)。
在视频教程中,据说:"服务器功能以外的代码将在每个R会话(工作人员)"上运行一次。所以,我认为我需要的代码应该放在服务器函数之外。
是否有可能实现我描述的场景?或者我是否需要另一个外部R实例(在shinyApp脚本之外)?
提前致谢。
答案 0 :(得分:2)
我正在考虑这个,我认为这是可能的,但我想到的实现是特定于平台的。在这种情况下,我将假设ubuntu 14.04。
让我们说你有一些计算密集型任务:
ui.R:
library(shiny)
fluidPage(
numericInput('number','Number',10000000),
textOutput('CalcOutput')
)
server.R
library(shiny)
function(input,output,session) {
output$CalcOutput <- renderText({
sort(runif(input$number))
})
}
将操作迁移到子文件中相关变量的函数:
newfile.R
saveRDS(sort(runif(commandArgs(TRUE)[1])), file = 'LargeComputationOutput')
更改您的服务器.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]
})
}
这仍然是一个小小的错误,但它是概念证明,您可以将密集型操作移动到子rprocesses,并在这些计算完成后让反应式侦听器检测到。
编辑:Shiny还需要具有写入相关位置的权限。
答案 1 :(得分:2)
我使用未来的软件包找到了解决此问题的方法。 请看我的回答 Calling a shiny JavaScript Callback from within a future