R/Shiny:从服务器上的文件夹下载多个文件(zip)

Rob*_*rto 2 unix zip r sh shiny

我想创建一个 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])  )
    })
})
Run Code Online (Sandbox Code Playgroud)

复选框是动态创建的,读取文件夹(“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"
  )
Run Code Online (Sandbox Code Playgroud)

该函数仅使用已检查的文件名创建文件名(文件)数组。

我还创建了一个函数,允许我检查是否只选择了正确的文件:

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()}) 
Run Code Online (Sandbox Code Playgroud)

此函数可以正确呈现带有文件名的字符串。

当我尝试下载 zip 文件时出现的错误是:

sh: : 未找到命令

有人可以帮我解决这个问题吗?

Rob*_*rto 5

我已经解决了这个问题。问题在于 zip 功能由于某些原因无法在我的服务器上正常工作。解决方案是直接使用system2函数(由zip内部调用)。

代替

zip(file,files) 
Run Code Online (Sandbox Code Playgroud)

我必须使用:

system2("zip", args=(paste(file,files,sep=" ")))
Run Code Online (Sandbox Code Playgroud)