在 r shiny 中读取 csv 文件(超过 1 个)并为文件名创建新列
Read csv files (more than 1) in r shiny and create new column for Filename
我想上传多个 *.csv 文件,对它们进行绑定并使用原始 csv 文件名创建名为 Filename 的新列。
使用 basename() 函数我只适用于获取临时文件名而不是原始文件名。
input$datafile$name 获取原始文件名,但我不确定如何从该名称改变新列。
下面是我的代码供参考。
library(shiny)
library(data.table)
library(dplyr)
options(shiny.maxRequestSize = 10000*1024^2)
ui <- shinyUI(
fluidPage(
titlePanel("Example Read and Merge with new Column for Filename"),
sidebarLayout(
sidebarPanel( fileInput("datafile", h5("Choose CSV file:"),
accept = ".csv",multiple = TRUE)),
mainPanel(DT::dataTableOutput("Raw_data_show"),
verbatimTextOutput("results"),textOutput("filechosen"))
)))
server <- function(session,input, output) {
path <- reactiveValues(pth=NULL)
observeEvent(input$filechoose,{
path$pth <- file.choose()
})
output$filechosen <- renderText({
if(is.null(path$pth)){
return()
}else{
dirname(path$pth)
}
})
rawData <- reactiveValues(site = NULL)
observeEvent(input$datafile, {
req(input$datafile)
rawData$site <- input$datafile$datapath%>%
purrr::map_df(~fread(.x)%>%mutate(FileName_2D = basename(.x)))
})
output$results = renderPrint({
input$datafile$name
print(paste("First File (input$datafile$name)[[1]])",(input$datafile$name)[[1]]))
print(paste("2nd File (input$datafile$name)[[2]])",(input$datafile$name)[[2]]))
})
output$Raw_data_show <- DT::renderDataTable({
rawData$site
})
}
shinyApp(ui, server)
以下是目前应用程序的图像。
感谢一些意见。
您可以使用 input$datafile$datapath
读取文件并使用 input$datafile$name
添加带有文件名的新列。使用 map2_df
将两个值一起传递并组合成一个数据集。
library(shiny)
library(tidyverse)
library(data.table)
ui <- shinyUI(
fluidPage(
titlePanel("Example Read and Merge with new Column for Filename"),
sidebarLayout(
sidebarPanel( fileInput("datafile", h5("Choose CSV file:"),
accept = ".csv",multiple = TRUE)),
mainPanel(DT::dataTableOutput("Raw_data_show"),
verbatimTextOutput("results"),textOutput("filechosen"))
)))
server <- function(session,input, output) {
path <- reactiveValues(pth=NULL)
observeEvent(input$filechoose,{
path$pth <- file.choose()
})
output$filechosen <- renderText({
if(is.null(path$pth)){
return()
}else{
dirname(path$pth)
}
})
rawData <- reactiveValues(site = NULL)
observeEvent(input$datafile, {
req(input$datafile)
rawData$site <- map2_df(input$datafile$name, input$datafile$datapath,
~fread(.y)%>% mutate(FileName_2D = .x))
})
output$Raw_data_show <- DT::renderDataTable({
rawData$site
})
}
shinyApp(ui, server)
我想上传多个 *.csv 文件,对它们进行绑定并使用原始 csv 文件名创建名为 Filename 的新列。
使用 basename() 函数我只适用于获取临时文件名而不是原始文件名。
input$datafile$name 获取原始文件名,但我不确定如何从该名称改变新列。
下面是我的代码供参考。
library(shiny)
library(data.table)
library(dplyr)
options(shiny.maxRequestSize = 10000*1024^2)
ui <- shinyUI(
fluidPage(
titlePanel("Example Read and Merge with new Column for Filename"),
sidebarLayout(
sidebarPanel( fileInput("datafile", h5("Choose CSV file:"),
accept = ".csv",multiple = TRUE)),
mainPanel(DT::dataTableOutput("Raw_data_show"),
verbatimTextOutput("results"),textOutput("filechosen"))
)))
server <- function(session,input, output) {
path <- reactiveValues(pth=NULL)
observeEvent(input$filechoose,{
path$pth <- file.choose()
})
output$filechosen <- renderText({
if(is.null(path$pth)){
return()
}else{
dirname(path$pth)
}
})
rawData <- reactiveValues(site = NULL)
observeEvent(input$datafile, {
req(input$datafile)
rawData$site <- input$datafile$datapath%>%
purrr::map_df(~fread(.x)%>%mutate(FileName_2D = basename(.x)))
})
output$results = renderPrint({
input$datafile$name
print(paste("First File (input$datafile$name)[[1]])",(input$datafile$name)[[1]]))
print(paste("2nd File (input$datafile$name)[[2]])",(input$datafile$name)[[2]]))
})
output$Raw_data_show <- DT::renderDataTable({
rawData$site
})
}
shinyApp(ui, server)
以下是目前应用程序的图像。
感谢一些意见。
您可以使用 input$datafile$datapath
读取文件并使用 input$datafile$name
添加带有文件名的新列。使用 map2_df
将两个值一起传递并组合成一个数据集。
library(shiny)
library(tidyverse)
library(data.table)
ui <- shinyUI(
fluidPage(
titlePanel("Example Read and Merge with new Column for Filename"),
sidebarLayout(
sidebarPanel( fileInput("datafile", h5("Choose CSV file:"),
accept = ".csv",multiple = TRUE)),
mainPanel(DT::dataTableOutput("Raw_data_show"),
verbatimTextOutput("results"),textOutput("filechosen"))
)))
server <- function(session,input, output) {
path <- reactiveValues(pth=NULL)
observeEvent(input$filechoose,{
path$pth <- file.choose()
})
output$filechosen <- renderText({
if(is.null(path$pth)){
return()
}else{
dirname(path$pth)
}
})
rawData <- reactiveValues(site = NULL)
observeEvent(input$datafile, {
req(input$datafile)
rawData$site <- map2_df(input$datafile$name, input$datafile$datapath,
~fread(.y)%>% mutate(FileName_2D = .x))
})
output$Raw_data_show <- DT::renderDataTable({
rawData$site
})
}
shinyApp(ui, server)