我需要上传多个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)
})
}
答案 0 :(得分:1)
错误是因为您计算为numfiles
的{{1}}为您提供了numfiles = length(inFile)
数据框中的列数。您必须使用inFile
,因为数据框中的行数会为您提供已上传的文件数。
[编辑]: 适合我的代码是:
numfiles = nrow(inFile)