使用shinyFiles:一个闪亮的应用程序,用户选择要下载的文件,然后选择要复制的位置

时间:2017-07-16 22:27:34

标签: r shiny

以下代码成功地允许用户浏览和选择文件。但是我无法编写下载此文件的语法。

library(shiny)
library(shinyFiles)


ui <- fluidPage( 

  shinyFilesButton('files', label='File select', title='Please select a file', multiple=T) ,

  verbatimTextOutput('rawInputValue'),

  verbatimTextOutput('filepaths') ,

  downloadButton("downloadFiles", "Download Files")

)

server <- function(input, output) {

  roots =  c(wd = 'H:/')

  shinyFileChoose(input, 'files', 
                  roots =  roots, 
                  filetypes=c('', 'txt' , 'gz' , 'md5' , 'pdf' , 'fasta' , 'fastq' , 'aln'))

  output$rawInputValue <- renderPrint({str(input$files)})

  filepathsObject <- renderPrint({parseFilePaths(roots, input$files)})

  output$filepaths <- filepathsObject

  output$downloadFiles <- downloadHandler(

    filename = 'filepathsObject' ,

    content = function(file) {
      file.copy(filepathsObject, file)
    }
  )

}

shinyApp(ui = ui , server = server)

1 个答案:

答案 0 :(得分:0)

要使用downloadHandler下载文件,您需要提供包含路径字符串的全名,但您的变量filepathsObject是类"shiny.render.function的对象。

parseFilePaths函数将返回包含所需信息的列表,但您需要将其转换为字符。下面是您修改的代码,用于下载以前上传的文件。

请注意,下载按钮在RStudio查看器上效果不佳,因此如果您希望将原始文件名设置为默认值,请在浏览器中启动该应用程序。

library(shiny)
library(shinyFiles)


ui <- fluidPage( 
  shinyFilesButton('files', label='File select', title='Please select a file', multiple=T) ,
  verbatimTextOutput('rawInputValue'),
  verbatimTextOutput('filepaths') ,
  downloadButton("downloadFiles", "Download Files")
)

server <- function(input, output) {

  roots =  c(wd = 'H:/')

  shinyFileChoose(input, 'files', 
                  roots =  roots, 
                  filetypes=c('', 'txt' , 'gz' , 'md5' , 'pdf' , 'fasta' , 'fastq' , 'aln'))

  output$rawInputValue <- renderPrint({str(input$files)})

  output$filepaths <- renderPrint({parseFilePaths(roots, input$files)})

  output$downloadFiles <- downloadHandler(
    filename = function() {
      as.character(parseFilePaths(roots, input$files)$name)
    },
    content = function(file) {
      fullName <- as.character(parseFilePaths(roots, input$files)$datapath)
      file.copy(fullName, file)
    }
  )
}

shinyApp(ui = ui , server = server)