【问题标题】:Uploading multiple files in Shiny, process the files, rbind the results and return a download在 Shiny 中上传多个文件,处理文件,rbind 结果并返回下载
【发布时间】:2018-04-01 05:21:42
【问题描述】:

我需要上传多个 csv 文件 (dummy multiple files) 并对每个文件应用一些操作,然后将生成的数据帧合并为一个数据帧并将输出下载为 csv 文件。我的原始 R 代码有效,但我需要将其置于闪亮状态以自动化该过程,但不知何故,当我上传两个文件时,出现此错误:“下标越界”。帮助将不胜感激。这是我原来的原始 R 代码,有效:

 files = list.files("G:/JSON to CSV/merge")
 numfiles = nrow(inFile)
 kata_csv1 = list()
 for (i in 1:numfiles)
 {
   kata_csv = function(y){
   JSON_csv = read.csv(y, header = TRUE)
   lastrow = nrow(JSON_csv)
   shift = function(x, n){
    c(x[-(seq(n))], rep(NA, n))
    }
  JSON_csv$companyID1 = shift(JSON_csv$companyID1, 1)
  JSON_csv = JSON_csv[-lastrow, ]
  JSON_csv 
  }
 kata_csv1[[i]] = kata_csv(files[i])
 }

 myMergedData = do.call(rbind, kata_csv1)
 write.csv(myMergedData, "myMergedData.csv", row.names=FALSE)

这是我的无效代码:

UI.R:

  ui <- fluidPage(
   fluidPage(
     titlePanel("MY CSV FILES MERGER"),
     sidebarLayout(
       sidebarPanel(
         fileInput("file1",
              "Choose CSV files from directory",
              multiple = TRUE,
              accept=c('text/csv', 
                       'text/comma-separated-values,text/plain', 
                       '.csv')),
         downloadButton('downloadData', 'Download')
       ),
       mainPanel(
         tableOutput('contents')
       )
     )
   )
 )

服务器.R:

 library(shiny)
 library(dplyr)
 function(input, output) {
   getData <- reactive({
     inFile <- input$file1
     if (is.null(inFile)){
     return(NULL)
     } else {
  numfiles = length(inFile) 
  kata_csv1 = list()
  for (i in 1:numfiles)
  {

      JSON_csv = read.csv(input$file1[[i, 'datapath']], header = TRUE)
      lastrow = nrow(JSON_csv)
      shift = function(x, n){
        c(x[-(seq(n))], rep(NA, n))
      }
      JSON_csv$companyID1 = shift(JSON_csv$companyID1, 1)
      kata_csv1[[i]] = JSON_csv[-lastrow, ]

    }
    do.call(rbind, kata_csv1)
   }
   })
   output$contents <- renderTable( 
   getData() 
   )
   output$downloadData <- downloadHandler(
    filename = function() { 
    paste("data-", Sys.Date(), ".csv", sep="")
   },
   content = function(file) { 
   write.csv(getData(), file, row.names=FALSE)   
  })
  }

【问题讨论】:

    标签: r csv shiny


    【解决方案1】:

    错误是因为您计算为numfiles = length(inFile) 的numfiles 为您提供了inFile 数据框中的列数。您将不得不使用numfiles = nrow(inFile),因为数据框中的行数为您提供了已上传的文件数。

    [编辑]: 对我有用的代码是:

     library(shiny)
      library(dplyr)
     server <-  function(input, output) {
        getData <- reactive({
          inFile <- input$file1
          if (is.null(inFile)){
            return(NULL)
          }else {
            # browser()
            numfiles = nrow(inFile) 
            kata_csv1 = list()
    
    
            for (i in 1:numfiles)
            {
    
              JSON_csv = read.csv(input$file1[[i, 'datapath']], header = TRUE)
              lastrow = nrow(JSON_csv)
              shift = function(x, n){
                c(x[-(seq(n))], rep(NA, n))
              }
              JSON_csv$companyID1 = shift(JSON_csv$companyID1, 1)
              kata_csv1[[i]] = JSON_csv[-lastrow, ]
    
            }
            # browser()
            do.call(rbind, kata_csv1)
          }
        })
        output$contents <- renderTable( 
          getData() 
        )
        output$downloadData <- downloadHandler(
          filename = function() { 
            paste("data-", Sys.Date(), ".csv", sep="")
          },
          content = function(file) { 
            write.csv(getData(), file, row.names=FALSE)   
          })
      }
    
     shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 您好,感谢您的贡献。我已将numfiles = length(inFile) 更改为numfiles = nrow(inFile),并且出现错误,但是下载的应该是数据框的输出文件只显示引号“”。有什么线索吗?谢谢。
    • 能否附上样本数据文件?如果没有数据文件,很难猜测可能是什么问题。
    • 您好。谢谢。我上传了两个虚拟的多个文件。要做的是上传这两个文件,使用for循环中的shift()更正两个文件中的异常,rbind这两个文件并输出为csv文件。实际上,要纠正的两个文件中的异常是(1)需要删除第一列中的第一个值,并且第一列中的单元格向上移动一步,(2)此后数据帧的最后一行将是已删除。 shift() 正在处理这个问题。因为我要处理很多文件,所以我希望闪亮来自动化这个过程。谢谢。
    • 嗨@William,使用您提供的示例数据,我将下载输出文件。
    • 嗨@SBista,你的意思是你可以使用我提供的样本数据下载输出的csv文件吗?
    猜你喜欢
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 2015-07-02
    • 2014-02-13
    相关资源
    最近更新 更多