R Shiny: асинхронный скачать Хендлер - PullRequest
0 голосов
/ 26 ноября 2018

У меня блестящее приложение, которое занимает много времени при загрузке zip-файлов.Я пытаюсь использовать пакеты futures и promises для управления загрузками, чтобы другие пользователи могли получить доступ к приложению во время загрузки.

Приложение выглядит следующим образом:

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)

Я пытался обернуть write.csv внутри функции future и установить `, и хотя это не приводит к ошибке, приложение недоступно для других пользователей во время загрузки.

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(write.csv(mtcars, "mtcars.csv"))
        future(write.csv(iris, "iris.csv"))



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

shinyApp(ui, server)

Я также пытался обернуть всю функцию downloadHandler внутри функции future, но получаю ошибку:

Ошибка в .subset2 (x, "impl") $ defineOutput (name, значение, метка):
Неожиданный вывод MulticoreFuture для DownloadUnexpected Выход MultiprocessFuture для DownloadUnexpected Future output для DownloadUnexpected выход среды для Download

Как я могу обрабатывать все downloadHandler асинхронно?Я использую версию блестящего сервера с открытым исходным кодом.

1 Ответ

0 голосов
/ 17 мая 2019

Не знаю, нужен ли вам ответ на этот вопрос, но я думаю, что вы были очень близки.В будущем я обернул как 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...