在 R shiny 应用程序中读取包含多个 .csv 表的 zip 文件

Read zip file containing multiple .csv tables in R shiny app

我正在开发一个用于处理数据的闪亮应用程序。 我想读取在 fileInput 中选择的 zip 文件。这个 zip 由多个 csv 文件组成,我想将所有 .csv 数据帧保存为反应值。 例如,如果 test.zip 包含文件 ONE.csv、TWO.csv、THREE.csv,我想获得 3 个反应值(作为数据帧),称为 ONE、TWO、THREE。

如果我知道 csv 文件的名称和数量,我就可以做到。

但是如果我不知道.csv数据帧的数量和名称,我该如何实现呢?

 ## Only run examples in interactive R sessions
    if (interactive()) {
    
    ui <- fluidPage(
      sidebarLayout(
        sidebarPanel(
          fileInput("ZIP", "Choose ZIP File",
            accept = ".zip"
            )
        ),
        mainPanel(
          DT::dataTableOutput("ONEtab")
        )
      )
    )
    
    server <- function(input, output) {
     ONE <- reactive({
      
      inFile <-req(input$ZIP)
      read_csv(unzip(inFile$datapath,"ONE.CSV"))
      })

      TWO <- reactive({
      
      inFile <-req(input$ZIP)
      read_csv(unzip(inFile$datapath,"TWO.CSV"))
      })

      THREE <- reactive({
      
      inFile <-req(input$ZIP)
      read_csv(unzip(inFile$datapath,"THREE.CSV"))
      })

output$ONEtab <- DT::renderDataTable({ DT::datatable(ONE(), option=list(scrollX=T),filter = 'top')})
    }
    
    shinyApp(ui, server)
    }

感谢您的帮助!

一种选择是将所有数据帧读入单个变量,然后使用一个数字 select 感兴趣的那个。这是执行此操作的一些代码。它使用 lapply 读取 zip 文件的内容以创建一个名为 all 的反应变量。要引用不同的数据帧,所需的代码是 all()[[index]],我添加了一些内容来说明这一点。

library(DT)
library(readr)
ui <- fluidPage(sidebarLayout(sidebarPanel(
    fileInput("ZIP", "Choose ZIP File", accept = ".zip"),
    selectInput("choice", 'Choose', choices = c(1,2,3), selected = 1)
),
mainPanel(DT::dataTableOutput("selectone"))))

server <- function(input, output) {
    all <- reactive({
        inFile <- req(input$ZIP)
        filelist <- unzip(inFile$datapath, list = T)
        lapply(filelist$Name, read_csv)
    })
    
    output$selectone <-
        DT::renderDataTable({
            choice = as.integer(input$choice)
            DT::datatable(all()[[choice]], option = list(scrollX = T), filter = 'top')
        })
}

shinyApp(ui, server)

如果没有处理此问题的其余代码,很难知道这是否是您需要的,但这也许是一个开始。