繁体   English   中英

读取 zip 文件,其中包含 R Z531704A02607A1646EFCF4C1FAE1EEC6 中的多个.csv 表

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

我正在开发一个 shiny 应用程序来操作数据。 我想阅读在 fileInput 中选择的 zip 文件。 这个 zip 由多个 csv 文件组成,我想保存为反应值 all.csv 数据帧。 For example, if test.zip contains file ONE.csv, TWO.csv, THREE.csv, i'd like to obtain 3 reactives values (as dataframes) called 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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM