Проблема с областью видимости, возникающая при цикле через блок tryCatch в R - PullRequest
1 голос
/ 15 февраля 2020

Я пытаюсь провести l oop через вектор, оценить каждого члена в условном выражении и записать любые ложные оценки на внешний CSV. Тем не менее, аргумент i продолжает вызывать ошибку в коде ниже. В частности, мой вывод «1234567891011», а затем ошибка "Error in cat(i) : object 'i' not found" прерывает выполнение. Я подозреваю, что есть какая-то проблема с областью видимости, но я озадачен тем, что это может быть. Воспроизводимый пример приведен ниже. Любая помощь будет принята с благодарностью.

library('utils')

tryBlock <- function(i){
  cat(i)
  if(i>10)
     stop("condition is false")
}

work <- function(list){
  for(i in list){
    tryCatch(tryBlock(i),
             error= function(err){write.table(as.data.frame(c(i,err)), "falseOutput.csv")})
}}

work(1:20)

1 Ответ

1 голос
/ 15 февраля 2020

Проблема заключается в попытке записи объекта класса

c("simpleError", "error", "condition")

в файл CSV. Или даже в текстовый файл с write.table. Когда я попытался использовать writeLines, я забыл, что аргумента append нет, поэтому будет записана только последняя ошибка с i == 20.

Решение, которое я нашел, заключается в выводе в файл с cat.
Обратите внимание, что err приведен к "character".

work <- function(list){
  for(i in list){
    tryCatch(tryBlock(i),
             error = function(err){
               msg <- paste("iter:", i, "\n")
               msg <- c(msg, paste("error:", as.character(err), "\n"))
               cat(msg, file = "falseOutput.txt", append = TRUE) 
             }
    )
  }
}

work(1:20)
#1234567891011121314151617181920

Первые строки файла являются:

iter: 11
ошибка: ошибка в tryBlock (i): условие ложно

iter: 12
ошибка: ошибка в tryBlock (i): условие ложно

итер: 13
ошибка: ошибка в tryBlock (i): условие ложно

...