R:async downloadHandler

R:async downloadHandler,r,asynchronous,shiny,R,Asynchronous,Shiny,我有一个闪亮的应用程序,需要大量时间下载zip文件。我正在尝试使用futures和Promissions软件包来管理下载,以便其他用户可以在下载过程中访问应用程序 该应用程序如下所示: library(shiny) ui <- fluidPage( downloadButton("Download", "Download") ) server <- function(input, output){ output$Download <- downloadHandle

我有一个闪亮的应用程序,需要大量时间下载zip文件。我正在尝试使用
futures
Promissions
软件包来管理下载,以便其他用户可以在下载过程中访问应用程序

该应用程序如下所示:

library(shiny)

ui <- fluidPage(
  downloadButton("Download", "Download")
)


server <- function(input, output){
  output$Download <- downloadHandler(
    filename = "Downloads.zip",
    content = function(file){
      withProgress(message = "Writing Files to Disk. Please wait...", {
        temp <- setwd(tempdir())
        on.exit(setwd(temp))
        files <- c("mtcars.csv", "iris.csv")

        write.csv(mtcars, "mtcars.csv")
        write.csv(iris, "iris.csv")



        zip(zipfile = file, files = files)
      })
    }
  )
}

shinyApp(ui, server)
我还尝试将整个
downloadHandler
函数包装到
future
函数中,但我得到了错误:

.subset2(x,“impl”)$defineOutput(名称、值、标签)中出错:
下载的意外多重反驳输出意外 用于下载的多处理器未来输出用于的意外未来输出 下载用于下载的意外环境输出


如何异步处理整个
downloadHandler
?我使用的是开源版本的闪亮服务器。

不知道您是否还需要答案,但我认为您非常接近。我将write.csv和zip打包如下,在我的测试中,它适用于多个用户

library(shiny)
library(promises)
library(future)
plan(multiprocess)

ui <- fluidPage(
  downloadButton("Download", "Download")
)


server <- function(input, output){
  output$Download <- downloadHandler(
    filename = "Downloads.zip",
    content = function(file){
      withProgress(message = "Writing Files to Disk. Please wait...", {
        temp <- setwd(tempdir())
        on.exit(setwd(temp))
        files <- c("mtcars.csv", "iris.csv")

        future({

        Sys.sleep(15)  
        write.csv(mtcars, "mtcars.csv")
        write.csv(iris, "iris.csv")



        zip(zipfile = file, files = files)})
      })
    }
  )
}

shinyApp(ui, server)
库(闪亮)
图书馆(承诺)
图书馆(未来)
计划(多进程)

ui感谢@tigerloveslobsters。只是另外一条评论,对于被动值/表达式,必须在将来启动之前阅读它们。
library(shiny)
library(promises)
library(future)
plan(multiprocess)

ui <- fluidPage(
  downloadButton("Download", "Download")
)


server <- function(input, output){
  output$Download <- downloadHandler(
    filename = "Downloads.zip",
    content = function(file){
      withProgress(message = "Writing Files to Disk. Please wait...", {
        temp <- setwd(tempdir())
        on.exit(setwd(temp))
        files <- c("mtcars.csv", "iris.csv")

        future({

        Sys.sleep(15)  
        write.csv(mtcars, "mtcars.csv")
        write.csv(iris, "iris.csv")



        zip(zipfile = file, files = files)})
      })
    }
  )
}

shinyApp(ui, server)