lapply 的错误处理——输出失败元素的索引

Hei*_*erg 2 error-handling r lapply

回答有关 lapply始终返回错误处理NANULL元素失败时的错误处理问题,即

myfun <- function(s) {
  tryCatch(doSomething(s), error = function(e) { return(NULL) }
}
Run Code Online (Sandbox Code Playgroud)

然而,这还不够普遍,因为doSomething(s)可能会返回NULLNA本身。因此,理想情况下,我希望myfun编写这样的内容,以便lapply(mylist, myfun)我能够以某种方式获得失败元素的所有索引。这个怎么做?

Mar*_*gan 5

通过处理错误来捕获并释放错误identity()

res = lapply(list(1, "two", 3), function(i) tryCatch({
    sqrt(i)
}, error=identity)
Run Code Online (Sandbox Code Playgroud)

检查是否有错误

vapply(res, is, logical(1), "error")
Run Code Online (Sandbox Code Playgroud)

返回错误条件通常比返回“神奇”值(如NA或 )更好NULL,除非下游分析与返回值无缝配合。

作为更高级的解决方案,创建更复杂的条件或扩展错误类

my_condition = function(err)
    structure(list(message=conditionMessage(err),
                   original=err), class=c("my", "condition"))
Run Code Online (Sandbox Code Playgroud)

并返回

res <- lapply(list(1, "two", 3), function(i) {
    tryCatch({
        sqrt(i)
    }, error=my_condition)
})
Run Code Online (Sandbox Code Playgroud)