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

时间:2019-01-14 14:14:01

标签: r unix shiny zip sh

我想创建一个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::找不到命令

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

1 个答案:

答案 0 :(得分:0)

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

代替

zip(file,files) 

我必须使用:

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