【问题标题】:Download multiple csv files with one button (downloadhandler) with R Shiny使用 R Shiny 一键下载多个 csv 文件(下载处理程序)
【发布时间】:2017-10-10 12:32:16
【问题描述】:

*您好,我正在尝试从一个唯一的 excel 文件中下载多个 csv 文件。我想从 excel 文件中下载(仅使用一个下载按钮)不同的表格。 我不明白为什么 for() 循环不起作用,我不知道该怎么办? 如果有人知道..

重点是下载不同的csv文件,它们在“wb”列表中(wb[1],wb[2]...) 谢谢。 例如,这是我与第三张表一起使用的代码(抱歉我的英语不好): 界面:

library(readxl)
library(shiny)
library(XLConnect)
fluidPage(
titlePanel("Export onglets en CSV"),
  sidebarLayout(
    sidebarPanel(
      fileInput('fichier1','Choisissez votre fichier excel :',
                accept = ".xlsx"),
      fluidPage(
    fluidRow(
      column(width = 12,
             numericInput("sheet","Indiquez l'onglet à afficher :",min = 1, value = 1),
             tags$hr(),
             textInput('text',"Indiquez le nom des fichiers :"),
             tags$hr(),
             h4("Pour télécharger les fichiers .csv :"),
             downloadButton("download","Télécharger")
             )

    )
  )),
mainPanel(
  tabsetPanel(
    tabPanel('Importation',
             h4("Fichier de base:"),
             dataTableOutput("contents"))
      )
    )
  )
)

服务器:

function(input,output){

  #Création data :
  data <- reactive({
    inFile<- input$fichier1
    if (is.null(inFile)){
      return(NULL)
    }else{
      file.rename(inFile$datapath,
              paste(inFile$datapath,".xlsx", sep =""))
      wb = loadWorkbook(paste(inFile$datapath,".xlsx",sep=""))
      lst = readWorksheet(wb,sheet = getSheets(wb))
      list(wb = wb, lst = lst)
    }
  })



  #Sortie de la table :
  output$contents <- renderDataTable({
    data()$wb[input$sheet]
  },options = list(pageLength = 10))


  #Téléchargement :
  output$download <- downloadHandler(

    #for (i in 1:input$sheet){

    filename = function(){
      paste(input$text,"_0",3,".csv",sep = "")
    },
    content = function(file){
      write.table(data()$wb[3],file,
                  sep = ';', row.names = F, col.names = T)
    }
#}
  )
}

【问题讨论】:

  • 我不认为 for 循环可以工作。我认为要走的路是压缩它,..
  • 是的,for 循环不起作用,这就是为什么我在前面加上 # 的原因。从今天早上开始,我一直在为这种情况寻找 zip() 的代码或示例,但我没有找到任何东西..和/或我不明白如何将不同的文件放入 zip 并下载它。您有任何想法/代码/示例或网站来解释 zip 功能吗?

标签: r csv shiny


【解决方案1】:

正如@BigDataScientist 指出的那样,您可以压缩所有 csv 文件并下载压缩文件。您的 downloadHandler 可能如下所示:

output$download <- downloadHandler(
    filename = function(){
      paste0(input$text,".zip")

    },
    content = function(file){
      #go to a temp dir to avoid permission issues
      owd <- setwd(tempdir())
      on.exit(setwd(owd))
      files <- NULL;

      #loop through the sheets
      for (i in 1:input$sheet){
        #write each sheet to a csv file, save the name
        fileName <- paste(input$text,"_0",i,".csv",sep = "")
        write.table(data()$wb[i],fileName,sep = ';', row.names = F, col.names = T)
        files <- c(fileName,files)
      }
      #create the zip file
      zip(file,files)
    }
  )

这不会从 excel 文件中下载所有工作表,而是从 1 到用户在input$sheet 中输入的任何工作表。

如果用户没有添加 excel 文件/名称,您也可以禁用下载按钮。

【讨论】:

  • 是的,我已经尝试过这段代码,但我有这个错误信息:警告:运行命令 '"zip" -r9X ... 状态为 127 我不知道如何处理有了这个。非常感谢你的帮助顺便说一句
  • 请注意zip 的问题,您使用的是 Windows 吗?如果是,您是否安装了 RTools?
  • 请注意,它可能无法在闪亮预览中使用。尝试像runApp(shinyApp(ui, server), launch.browser = TRUE)一样启动它
  • 是的,我在 Windows 上,我正在尝试安装 RTools 包,但即使使用最后一次更新,我也无法安装它..
  • 我不能说它的准确性,但this answer 提供了另一种解决方法,用于以闪亮的方式压缩文件
【解决方案2】:

希望您已经解决了这个 MBnn,但如果其他人遇到类似问题,这种情况归结为 RTools 没有在 Windows 上正确安装。

目前您在运行安装过程时需要密切注意,并确保点击复选框以编辑系统路径。

根据您的代码,这很可能与阻止您保存 XLSX 工作簿的问题相同。

【讨论】:

    猜你喜欢
    • 2018-01-14
    • 2019-04-27
    • 2022-01-19
    • 2015-02-06
    • 2021-11-20
    • 2017-07-26
    • 2021-09-25
    • 1970-01-01
    • 2016-01-29
    相关资源
    最近更新 更多