我有一个函数superFoo()
它调用其他函数foo()
。每个foo()
函数都有不同的输出,即列表、数据帧、标量。 我需要:
- 每当任何
foo()
失败时停止执行superFoo()
(它表示错误或警告( -
捕获错误消息。
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)
我知道我可以在superFoo()
内部执行tryCatch()
,捕获错误消息并在superFoo()
中返回NA。像这样:
varA = tryCatch({foo()}, error=(return(NULL)), warning(return(NULL)))
if (is.null(varA)) { return(list(NA, errorMessage)}
问题是我在superFoo()
中有 9 个foo()
函数。我想知道是否有更有效的编程方法。
另一种选择是purrr:safely()
.然而,这和tryCatch()
一样啰嗦,因为我必须在superFoo()
中重新声明foo()
,然后才能调用它:
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")
这将与其他错误一样被捕获。