在 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)
如果没有处理此问题的其余代码,很难知道这是否是您需要的,但这也许是一个开始。
我正在开发一个用于处理数据的闪亮应用程序。 我想读取在 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)
如果没有处理此问题的其余代码,很难知道这是否是您需要的,但这也许是一个开始。