【问题标题】:Read csv files (more than 1) in r shiny and create new column for Filename在 r shiny 中读取 csv 文件(超过 1 个)并为 Filename 创建新列
【发布时间】:2021-05-08 12:28:09
【问题描述】:

我想上传多个 *.csv 文件,对它们进行 rbind 并使用原始 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)

下面是应用程序到目前为止的图像。

欣赏一些意见。

【问题讨论】:

    标签: r dataframe csv shiny upload


    【解决方案1】:

    您可以使用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      • 2018-02-01
      • 2021-03-11
      • 2020-05-17
      • 1970-01-01
      • 2021-12-14
      相关资源
      最近更新 更多