R Shiny - 持续后台任务

时间:2015-07-21 21:57:12

标签: r multithreading shiny

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

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

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

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

提前致谢。

2 个答案:

答案 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