Блестящий: скачать zip-архив

Я не могу сделать блестящий downloadHandler для вывода zip файла:

# server.R
library(shiny)

shinyServer(function(input, output) {  
  output$downloadData <- downloadHandler(
    filename <- function() {
      paste("output", "zip", sep=".")
    },

    content <- function(fname) {
      fs <- c()
      tmpdir <- tempdir()
      setwd(tempdir())
      for (i in c(1,2,3,4,5)) {
        path <- paste0("sample_", i, ".csv")
        fs <- c(fs, path)
        write(i*2, path)
      }
      zip(zipfile=fname, files=fs)
    }
  )
})

И простой ui.R:

shinyUI(fluidPage(
  titlePanel(""),
  sidebarLayout(
    sidebarPanel(
      downloadButton("downloadData", label = "Download")
    ),
    mainPanel(h6("Sample download", align = "center"))
  )
))

У меня хороший результат, кроме ошибки:

> shiny::runApp('C:/Users/user/AppData/Local/Temp/test')

Listening on http://127.0.0.1:7280
  adding: sample_1.csv (stored 0%)
  adding: sample_2.csv (stored 0%)
  adding: sample_3.csv (stored 0%)
  adding: sample_4.csv (stored 0%)
  adding: sample_5.csv (stored 0%)
Error opening file: 2
Error reading: 6

И не сохранять диалог сохранения архива. Но в папке temp представлен правильный архив. Как правильно делиться архивом?

Ответ 1

Вы используете <- внутри функции downloadHandler и должны использовать =. Также вам может понадобиться определить contentType:

library(shiny)

runApp(
  list(server = function(input, output) {  
    output$downloadData <- downloadHandler(
      filename = function() {
        paste("output", "zip", sep=".")
      },
      content = function(fname) {
        fs <- c()
        tmpdir <- tempdir()
        setwd(tempdir())
        for (i in c(1,2,3,4,5)) {
          path <- paste0("sample_", i, ".csv")
          fs <- c(fs, path)
          write(i*2, path)
        }
        zip(zipfile=fname, files=fs)
      },
      contentType = "application/zip"
    )
  }
  , ui = fluidPage(
    titlePanel(""),
    sidebarLayout(
      sidebarPanel(
        downloadButton("downloadData", label = "Download")
      ),
      mainPanel(h6("Sample download", align = "center"))
    )
  ))
)

Ответ 2

Вы также можете сжать вашу папку, используя tar:

output$files_tar_button <- downloadHandler(
    filename <- function() {
      paste("output", "tar", sep=".")
    },

    content <- function(file) {
      tar(file, "file/path/")
    }
  )