我正在考虑这个,我认为这是可能的,但我想到的实现是特定于平台的。在这种情况下,我将假设 ubuntu 14.04。
假设您有一些计算密集型任务:
ui.R:
library(shiny)
fluidPage(
numericInput('number','Number',10000000),
textOutput('CalcOutput')
)
服务器.R
library(shiny)
function(input,output,session) {
output$CalcOutput <- renderText({
sort(runif(input$number))
})
}
将操作迁移到子文件中相关变量的函数中:
新文件.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]
})
}
这仍然有点错误,但它是概念证明,您可以将密集操作移至子流程,并让反应式侦听器检测这些计算何时完成。
编辑:Shiny 还需要写入相关位置的权限。