【问题标题】:R Shiny - Continuous background taskR Shiny - 连续后台任务
【发布时间】:2015-07-21 21:57:12
【问题描述】:

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

更进一步,是否可以与来自外部背景“thread”的数据进行交互? (例如,在下载时,制作一个情节或其他东西)。

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

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

提前致谢。

【问题讨论】:

    标签: r multithreading shiny


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我使用 future 包找到了解决此问题的方法。 请看我的回答 Calling a shiny JavaScript Callback from within a future

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-18
        • 1970-01-01
        • 2017-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-05
        相关资源
        最近更新 更多