2017-10-20 20 views
1

我需要上傳多個CSV文件(dummy multiple files)並應用一些操作,以每個文件,然後將所得dataframes合併成一個數據幀和將輸出下載爲csv文件。我的原始R代碼工作,但我需要把它放在閃亮的自動化過程,但不知何故,當我上傳兩個文件,我得到這個錯誤:「下標越界」。幫助將不勝感激。這是我的工作原生R代碼裏面:上傳多個文件中有光澤,工藝文件,rbind結果,並返回一個下載

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

這個錯誤是因爲你正在計算作爲numfiles = length(inFile)numfiles給你colu數量在您的​​數據框中。您將不得不使用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) 
+0

您好,感謝您的貢獻。我已經改變'numfiles =長度(infile中)''到numfiles = nrow(infile中)',且有誤差,但隨後,這應該是一個數據幀所下載的輸出文件僅顯示引號「」。任何線索?謝謝。 – William

+0

你可以附加一個示例數據文件嗎?沒有數據文件,有點難以猜測可能是什麼問題。 – SBista

+0

你好。謝謝。我上傳了兩個虛擬多個文件。要做的是上傳這兩個文件,使用for循環中的shift()更正這兩個文件中的異常,將這兩個文件作爲csv文件並將其輸出。實際上,在這兩個文件的異常將被校正爲(1)在第一列第一值需要被刪除,並在第一列中單元格移動一步時,(2)therefater數據幀的最後一行是要刪除。 shift()正在處理這個問題。因爲我正在處理很多文件,所以我希望能夠讓這個過程自動化。謝謝。 – William

相關問題