我有一个函数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) }
嵌套函数中错误处理的良好实践是什么?
答案 0 :(得分:0)
如果您对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")
,与捕获的其他错误相同。