【问题标题】:Shiny: download zip archiveShiny:下载 zip 存档
【发布时间】:2014-11-12 07:21:46
【问题描述】:

我无法让闪亮的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 文件夹中会显示正确的存档。如何正确分享存档?

【问题讨论】:

  • 试试library(Rcompression)函数zip看看能不能帮到stackoverflow.com/questions/4624360/…
  • 请注意,在 Windows 上,您需要安装 Rtools,并且它的 bin 目录需要在您的 PATH 环境中,否则 zip 函数只会默默地什么都不做。

标签: r shiny


【解决方案1】:

您在 downloadHandler 函数中使用&lt;-,应该使用=。另外你可能需要定义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"))
    )
  ))
)

【讨论】:

  • 我注意到,如果我使用 Rstudio 浏览器,zip 下载对我不起作用。因此,您可能想在外部浏览器中尝试以确保。
  • 我认为在任何地方使用setwd,尤其是在一个闪亮的应用程序中是非常危险的。请改用zip(..., flags = "-j"),这样可以摆脱“垃圾路径”并仅存储文件名。
  • 此程序导致我无法下载 我在浏览器底部收到一个下载失败框,其中显示“失败 - 无文件”。知道可能出了什么问题吗?
  • 捎带来自@jakob-r 的评论,zip 下载 kind 在 Rstudio 浏览器中不起作用。它将默认为一个无扩展名的文件,名为“downloadData”,这是下载按钮的名称,忽略您提供的任何名称。如果您添加 zip 扩展名,无论是在保存时,还是通过重命名文件,都可以使用。不过,在其他浏览器中它可以正常工作。
【解决方案2】:

您也可以使用 tar 压缩文件夹:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2020-02-17
    • 2013-08-20
    • 2012-04-04
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    相关资源
    最近更新 更多