簡體   English   中英

R/Shiny:從服務器上的文件夾下載多個文件 (zip)

[英]R/Shiny: Download multiple files (zip) from a folder on the server

我想創建一個 zip 存檔(包含多個 xlsx 文件)並將其保存在本地。 這些文件存儲在服務器端的文件夾中。 用戶使用 checkboxInput 選擇要壓縮的文件。

這里是復選框的代碼:

  get.files <- reactive({
    list.files("output_file/")
  })  

obsList <- list()

output$links_list <- renderUI({    
    lapply(as.list(1:length(get.files())), function(i)
    {
      btName <- get.files()[i]
      # creates an observer only if it doesn't already exists
      if (is.null(obsList[[btName]])) {
         obsList[[btName]] <<- btName 
      }
      fluidRow(checkboxInput(btName, get.files()[i])  )
    })
})

復選框是動態創建的,讀取文件夾中的內容(“output_file/”)。 每個復選框附近都有文件的名稱。

下載的功能是:

output$downloadzip<-downloadHandler(
    filename = function(){
      paste0("Extract.zip")
    },
    content = function(file){
      files <- NULL;
      for (i in 1:length(obsList)){
        if(input[[obsList[[i]]]])
          files <- c(paste("output_file/",obsList[[i]],sep=""),files)
      }
      #create the zip file
      zip(file,files)
    },
    contentType = "application/zip"
  )

該函數僅使用已檢查的文件名創建文件名(文件)數組。

我還創建了一個函數,允許我檢查是否只選擇了正確的文件:

tempText <- eventReactive({input$TempTest},{ 
    l<-c()
    for (i in 1:length(obsList)){

      if(input[[obsList[[i]]]])
        l<-c(l,paste("output_file/",obsList[[i]],sep=""))
    }

    return(paste(l) )
  },
  ignoreInit = TRUE)

  output$Temp <-  renderPrint({ tempText()}) 

此函數正確呈現帶有文件名的字符串。

我嘗試下載 zip 文件時遇到的錯誤是:

sh:: 找不到命令

有人可以幫我解決這個問題嗎?

我已經解決了這個問題。 問題在於 zip 功能由於某些原因在我的服務器上無法正常工作。 解決方法是直接使用system2函數(即zip內部調用)。

代替

zip(file,files) 

我必須使用:

system2("zip", args=(paste(file,files,sep=" ")))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM