R在for循环内使用tryCatch将具有错误值的行添加到输出

时间:2019-03-13 05:39:08

标签: r

如果我错过了正确的方法,请原谅我,但我似乎无法取得进展。 Skipping error in for-loop和其他与tryCatch有关的答案一样,对我们有很大帮助,但我仍在努力。 using tryCatch() in R to assign error values in loop对我不起作用,或者我丢失了一些东西。

我正在使用tryCatch运行一个for循环,但是如果遇到错误,我希望将其记录为结果矩阵中的一行。我似乎无法使错误函数的输出上升到要记录的循环的一级。这是我正在尝试的简单版本:

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"   

谢谢!

1 个答案:

答案 0 :(得分:4)

您可以使用从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将导致整个函数返回,这不是我们想要的。另一方面,我们可以(并且应该应该)对returnerror块使用显式的warning。在这种情况下,return只是从对tryCatch的调用返回,而不是从整个封闭函数返回。