R Shiny - 连续背景任务

alo*_*p85 7 multithreading r shiny

我想知道在运行Shiny应用程序时是否可以保持连续的后台任务.这意味着,例如,一个" 线程 "可以在shinyApp运行时将数据从网页下载到数据库.

甚至更多,是否可以与外部背景" 线程 "中的数据进行交互?(例如,在下载时,制作情节或其他内容).

在视频教程中,据说:"服务器功能之外的代码将在每个R会话(工作者)运行一次".所以,我认为我需要的代码应该放在服务器函数之外.

是否有可能实现我描述的场景?或者我需要另一个外部R实例(在shinyApp脚本之外)?

提前致谢.

Sha*_*ape 2

我正在考虑这个,我认为这是可能的,但我想到的实现是特定于平台的。在本例中,我将假设使用 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 还需要写入相关位置的权限。