重置 Shiny 后如何存储和检索使用 fileInput 上传的文件

How can I store and retrieve files uploaded with fileInput after resetting it Shiny

我想创建一个存储空间来存储和检索上传的文件,即使在 fileInput 被重置后也是如此。

基本上每次用户使用 fileInput 上传文件时,以后他都被迫单击 doneUpload 按钮,这会重置 fileInput 文本区域并将他的文件放入存储中(请别无选择)。 此时,用户可以返回并上传另一个文件,该文件也将放入存储中。

从我的角度来看,我已经上传了所有可以轻松检索和操作的文件。 换句话说,我的问题可以翻译成: 如何在不重置上传文件的情况下重置 fileInput 文本区域?

我已经尝试创建一个反应值来存储上传的文件,但是它没有像我预期的那样工作。

这里我给你举个例子来简化我的情况。

library(shiny)

ui<-fluidPage(
  uiOutput("uploadFile"),
  actionButton("doneUpload","Done"),
  tableOutput("exampleTest"))


server<-function(input, output){

  output$uploadFile<-renderUI({
    fileInput("uploadFile", "Upload your file", accept = c(".csv"),placeholder="No files selected")
  })

observeEvent(input$doneUpload,{
    output$uploadFile<-renderUI({
      fileInput("uploadFile", "Upload your file", accept = c(".csv"),placeholder="No files selected")
    })
  })

  reactiveFileUploaded<-reactiveValues(fileUploaded=NULL)

  observe({
    req(input$uploadFile)
    reactiveFileUploaded$fileUploaded<-c(reactiveFileUploaded$fileUploaded,input$uploadFile$datapath)
  })

#Test to verify if the storage has been created. 
#Supposing two files have been uploaded, I retrieve the first one.
output$exampleTest<-renderTable({
    read.csv2(reactiveFileUploaded$fileUploaded[1])
  })

}


shinyApp(ui=ui,server=server)

很简单,在用户确认输入后,在清除输入之前读取文件。

当前,当用户选择文件时,您正在阅读(并保存)该文件,无论他是否要上传。此外,您似乎在选择文件后不断将文件添加到反应值后以某种方式触发了循环。

此外,对于数据路径,您只保存文件路径而不是文件内容,并且文件路径还指向临时文件夹,因此我建议也更改该例程。

但是对于您描述的最基本的功能,以下代码应该可以完成工作。 (我还在 filesUploaded 变量中添加了一个简单的内容检查,这样错误消息就不会出现在启动时)

图书馆(闪亮)

ui<-fluidPage(
  uiOutput("uploadFile"),
  actionButton("doneUpload","Done"),
  tableOutput("exampleTest"))


server<-function(input, output){

  output$uploadFile<-renderUI({
    fileInput("uploadFile", "Upload your file", accept = c(".csv"),placeholder="No files selected")
  })

  reactiveFileUploaded<-reactiveValues(fileUploaded=c())


  observeEvent(input$doneUpload,{
    req(input$uploadFile)
    reactiveFileUploaded$fileUploaded<-c(reactiveFileUploaded$fileUploaded ,input$uploadFile$datapath)


    output$uploadFile<-renderUI({
      fileInput("uploadFile", "Upload your file", accept = c(".csv"),placeholder="No files selected")
    })
  })



  #Test to verify if the storage has been created. 
  #Supposing two files have been uploaded, I retrieve the first one.
  output$exampleTest<-renderTable({
    if(length(reactiveFileUploaded$fileUploaded)>1)
    read.csv2(reactiveFileUploaded$fileUploaded[1])
  })

}



shinyApp(ui=ui,server=server)

这里有一个更简单的方法来满足您的需要 - 只需在 fileInput() 中设置 multiple = TRUE 以便它可以同时接受多个文件。使用 lapply.

可以一次性读取和存储它们
library(shiny)

ui <- fluidPage(
  fileInput("files", "Upload", multiple = TRUE),
  actionButton("done", "Done Upload"),
  verbatimTextOutput("test")
)

server <- function(input, output) {

  all_data <- eventReactive(input$done, { # stores data in all files as a list of dataframes
    req(input$files)
    setNames(lapply(input$files$datapath, read.csv), sapply(input$files$name, basename))
  })

  output$test <- renderPrint({
    # all_data()[[1]] # access first file; others can be accessed the same way
    lapply(all_data(), head) # shows first 6 rows of all files with their names
  })
}

shinyApp(ui, server)