在Shiny上传多个文件,处理文件,rbind结果并返回下载

时间:2017-10-20 04:16:54

标签: r csv shiny

我需要上传多个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')
       )
     )
   )
 )

Server.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)   
  })
  }

1 个答案:

答案 0 :(得分:1)

错误是因为您计算为numfiles的{​​{1}}为您提供了numfiles = length(inFile)数据框中的列数。您必须使用inFile,因为数据框中的行数会为您提供已上传的文件数。

[编辑]: 适合我的代码是:

numfiles = nrow(inFile)