R использует tryCatch внутри цикла for, чтобы добавить строку со значениями ошибок для вывода - PullRequest
3 голосов
/ 13 марта 2019

прости меня, если я упустил правильный способ сделать это здесь, но я не могу добиться прогресса. Ошибка пропуска в цикле for очень помогла, как и некоторые другие ответы, связанные с tryCatch, но я все еще борюсь. Использование tryCatch () в R для присвоения значений ошибок в цикле у меня не сработало, или я что-то упустил.

Я запускаю цикл for с tryCatch, но если я получаю сообщение об ошибке, я хотел бы записать его в виде строки в полученной матрице. Кажется, я не могу вывести функцию ошибки на один уровень выше, чем записываемый цикл. Вот простая версия того, что я пытаюсь:

collectem <- function(eList){ 
  tmpList <- NULL
  for (e in eList){
    tryCatch({
    tmpVar <- c("foo", e)
    if (e==3) stop("BLAH!")
    }, error=function(d){c("No",d) -> tmpVar})
    tmpList <- rbind(tmpList, tmpVar)
  }
  return(tmpList)
}

Звоните:

x <- collectem(1:10)

Что приводит к:

> x
       [,1]  [,2]
tmpVar "foo" "1" 
tmpVar "foo" "2" 
tmpVar "foo" "3" 
tmpVar "foo" "4" 
tmpVar "foo" "5" 
tmpVar "foo" "6" 
tmpVar "foo" "7" 
tmpVar "foo" "8" 
tmpVar "foo" "9" 
tmpVar "foo" "10"

Но я ищу это:

x
       [,1]  [,2]   
tmpVar "foo" "1"    
tmpVar "foo" "2"    
tmpVar "No"  "BLAH!"
tmpVar "foo" "4"    
tmpVar "foo" "5"    
tmpVar "foo" "6"    
tmpVar "foo" "7"    
tmpVar "foo" "8"    
tmpVar "foo" "9"    
tmpVar "foo" "10"   

Спасибо !!

Ответы [ 2 ]

4 голосов
/ 13 марта 2019

Вы можете использовать шаблон возврата любого желаемого кортежа из функций обработчика ошибок и / или предупреждений tryCatch:

collectem <- function(eList) { 
    tmpList <- NULL
    for (e in eList) {
        tmpVar <- tryCatch(
            {
                if (e == 3) stop("**BLAH!**")
                c("foo", e)
            },
            error = function(d) {
                return(c("No", sub(".*\\*\\*(.*?)\\*\\*.*", "\\1", d)))
            }
        )
                print(tmpVar)
        tmpList <- rbind(tmpList, tmpVar)
    }
    return(tmpList)
}

eList <- c(1:10)
collectem(eList)

       [,1]  [,2]   
tmpVar "foo" "1"    
tmpVar "foo" "2"    
tmpVar "No"  "BLAH!"
tmpVar "foo" "4"    
tmpVar "foo" "5"    
tmpVar "foo" "6"    
tmpVar "foo" "7"    
tmpVar "foo" "8"    
tmpVar "foo" "9"    
tmpVar "foo" "10"

Я узнал, что tryCatch действительно возвращает значение при вызове. Однако значение, возвращаемое для блока try, является просто неявным оператором, который выполняется. Вызов return из блока try вызовет возврат всей функции, а это не то, что нам нужно. С другой стороны, мы можем (и, возможно, должны) использовать явные return для блоков error и warning. В этом случае return просто возвращается из вызова к tryCatch, а не из всей включающей функции.

1 голос
/ 13 марта 2019

Здесь шаблон с использованием try

collectem <- function(eList){ 
  #browser()
  tmpList <- NULL
  for (e in eList){
      flag <- try(if (e==3) stop("BLAH!"),silent = TRUE)
      if(!is.null(flag) && class(flag)=="try-error"){
        #tmpVar <- c("No","BLAH!")  
        d <- gsub('.*\\: (.*)\n','\\1',flag)
        tmpVar <- c("No",d)  
      } else {tmpVar <- c("foo", e)}

    tmpList <- rbind(tmpList, tmpVar)
  }
  return(tmpList)
}

Когда мы нажмем е = 3 flag будет

flag
[1] "Error in try(if (e == 3) stop(\"BLAH!\"), silent = TRUE) : BLAH!\n"
attr(,"class")
[1] "try-error"
attr(,"condition")
<simpleError in doTryCatch(return(expr), name, parentenv, handler): BLAH!>

Таким образом, мы можем извлечь что угодно после : и до \n как сообщение об ошибке, используя gsub и группировку. Вот что мы получим

gsub('.*\\: (.*)\n','\\1',flag)
[1] "BLAH!"
attr(,"class")
[1] "try-error"
attr(,"condition")
<simpleError in doTryCatch(return(expr), name, parentenv, handler): BLAH!>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...