我有一个函数superFoo()
,它调用其他函数foo()
。每个foo()
函数都有不同的输出,即列表,数据帧,标量。我需要:
superFoo()
失败时停止执行foo()
(它表示错误或警告)foo = function(a){
log(a)
}
superFoo = function (a){
varA = foo(a)
# IF foo(a) fails, superFoo has to: stop and return NA
varB = foo(varA+3)
varA + varB
}
# Iteration
HyperY = setups %>% split(.$IDsample) %>%
map(superFoo)
我知道我可以在tryCatch()
里面做superFoo()
,捕获错误信息并在superFoo()
中返回NA。就像是:
varA = tryCatch({foo()}, error=(return(NULL)), warning(return(NULL)))
if (is.null(varA)) { return(list(NA, errorMessage)}
问题是我在foo()
有9个函数superFoo()
。我想知道是否有一种更有效的编程方式。
另一种选择是purrr:safely()
。然而,这与tryCatch()
一样冗长,因为我必须在foo()
重新声明superFoo()
之后再说:
safeFoo = safely(foo)
varA = safeFoo(a)
if (is.null(varA)) { return(list(NA, errorMessage) }
嵌套函数中错误处理的一个好方法是什么?
如果你对9个函数调用中的任何一个有相同的响应,那么你可以将整个superFoo
包裹在一个tryCatch
中,例如
superFoo = function (a){
tryCatch({
varA = foo(a)
# IF foo(a) fails, superFoo has to: stop and return NA
varB = foo(varA+3)
varA + varB
}, error = return(NULL), warning = return(NULL))
}
这会跳过对is.null(varA)
的单独检查。如果你想要,添加一行
if (is.null(varA)) stop("varA is NULL")
这将被捕获与其他错误被捕获相同。