Ошибка в функции: строки должны содержать допустимый индексный вектор. Логические индексы должны соответствовать размеру индексированного ввода - PullRequest
0 голосов
/ 05 августа 2020

Ниже я запускаю эту функцию, чтобы объединить тонны файлов в один большой файл, все время создавая отчет об успешных запусках. Вот функция (обратите внимание, что различные ошибки присваивания определены выше):

mergeFiles <- function(pathRoot, pathToSaveMergedFile, finalFileName){
    folders <- list.dirs(path=pathRoot, recursive=F)
    mergedFiles <- data.frame()
    initialMsg()
    report <- data.frame()
    for (folder in folders){
        ## folder=folders[1]
        files <- list.files(path=folder, pattern='xls.$')
        for (file in files){
            msgFileBeingMerged(file.path(folder,file))
            tmp <- tryCatch(read_excel(path=file.path(folder,file)),
                            error=function(e) {msgError(file.path(folder,file));stop()}, 
                            warning=function(w) msgWarning(file.path(folder,file)) )
            ## tmp <- tryCatch(read.xlsx(file=file.path(folder,file), sheetIndex=1),
            ##                 error=function(e) {msgError(file.path(folder,file));stop()},
            ##                 warning=function(w) msgWarning(file.path(folder,file)) )
            
            ## controling for variable type
            idx=!is.na(tmp$rg)
            tmp=tmp[idx,]
            tmp<-formatVarTypes(tmp) 
           
            tmp.report <- data.frame(file=file.path(folder,file), Rows=nrow(tmp))
            report <- rbind(report, tmp.report)
            
            mergedFiles <- tryCatch(rbind(mergedFiles, tmp),
                                    error=function(e) {msgErrorMergingData(file.path(folder,file));stop()},
                                    warning=function(w) msgWarning(file.path(folder,file)) )                                
            msgFileMerged(file.path(folder,file))
        }
    }

    ## tryCatch(WriteXLS(mergedFiles, ExcelFileName=file.path(path.expand(pathToSaveMergedFile),finalFileName), row.names=F),
    ##          error=function(e) {msgErrorWhenSaving();stop()},
    ##          warning=function(w) "Warning" )
    finalFileName <- file.path(path.expand(pathToSaveMergedFile),finalFileName)

    #finalFileNameCSV = gsub(x=finalFileName, pattern='.xlsx$', replacement='.csv')
    #write.csv(mergedFiles, file=finalFileNameCSV, row.names=F)
    #print(dim(mergedFiles))
    write.xlsx(mergedFiles, file=finalFileName)
    #tryCatch(write.xlsx(mergedFiles, file=finalFileName),
    #         error=function(e) {msgErrorWhenSaving();stop()},
    #         warning=function(w) "Warning" )
    reportFileName <- 'report.xlsx'
    write.xlsx(x=report, file=file.path(path.expand(pathToSaveMergedFile), reportFileName))
    ## WriteXLS(x=report, ExcelFileName=file.path(path.expand(pathToSaveMergedFile), reportFileName))
    reportMsg(mergedFiles, report, pathToSaveMergedFile, reportFileName)
    finalMsg()
}

Я продолжаю получать следующую ошибку / трассировку:

Error: Must subset rows with a valid subscript vector.
i Logical subscripts must match the size of the indexed input.
x Input has size 42 but subscript `c(idx)` has size 0.
 Error: Must subset rows with a valid subscript vector.
i Logical subscripts must match the size of the indexed input.
x Input has size 42 but subscript `c(idx)` has size 0.
Run `rlang::last_error()` to see where the error occurred. 
17.
stop(fallback) 
16.
rlang:::signal_abort(x) 
15.
cnd_signal(cnd) 
14.
(function (cnd) 
{
    cnd$subscript_arg <- i_arg
    cnd$subscript_elt <- "row" ... 
13.
signalCondition(cnd) 
12.
signal_abort(cnd) 
11.
cnd_signal(new_error_subscript_size(i, n = n, ..., body = cnd_body_vctrs_error_indicator_size)) 
10.
stop_indicator_size(i = i, n = n, subscript_action = subscript_action, 
    subscript_arg = subscript_arg) 
9.
vec_as_location(i, n) 
8.
withCallingHandlers(expr, vctrs_error_subscript = function(cnd) {
    cnd$subscript_arg <- i_arg
    cnd$subscript_elt <- "row"
    if (isTRUE(assign) && !isTRUE(cnd$subscript_action %in% c("negate"))) { ... 
7.
subclass_row_index_errors(vec_as_location(i, n), i_arg = i_arg, 
    assign = assign) 
6.
vectbl_as_row_location(i, nr, i_arg, assign) 
5.
vectbl_as_row_index(i, x, i_arg) 
4.
tbl_subset_row(xo, i = i, i_arg) 
3.
`[.tbl_df`(tmp, c(idx), ) at CLEA-merging-source.R#84
2.
tmp[c(idx), ] at CLEA-merging-source.R#84
1.
mergeFiles(pathRoot, pathToSaveMergedFile, finalFileName) 

Я пытался изменить мой tmp[c(idx), ] на tmp[idx, ] и (безуспешно) попытался изменить его на data.frame в случае, если это проблема tbl (согласно аналогичным сообщениям Stack Overflow. Любое понимание того, почему я вижу эту ошибку? Или для ответа на вопрос требуется дополнительная информация? Цените любую информацию.

Изменить: контекст трассировки, если полезно

  1. +-global::mergeFiles(pathRoot, pathToSaveMergedFile, finalFileName)
  2. | +-tmp[idx, ] clea/ReleaseScript/CLEA-merging//CLEA-merging-source.R:85:12
  3. | \-tibble:::`[.tbl_df`(tmp, idx, ) clea/ReleaseScript/CLEA-merging//CLEA-merging-source.R:85:12
  4. |   \-tibble:::tbl_subset_row(xo, i = i, i_arg)
  5. |     \-tibble:::vectbl_as_row_index(i, x, i_arg)
  6. |       \-tibble:::vectbl_as_row_location(i, nr, i_arg, assign)
  7. |         +-tibble:::subclass_row_index_errors(...)
  8. |         | \-base::withCallingHandlers(...)
  9. |         \-vctrs::vec_as_location(i, n)
 10. \-vctrs:::stop_indicator_size(...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...