У меня есть функция 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()
, перехватить сообщение об ошибке и вернуть NA в superFoo()
. Что-то вроде:
varA = tryCatch({foo()}, error=(return(NULL)), warning(return(NULL)))
if (is.null(varA)) { return(list(NA, errorMessage)}
Проблема в том, что у меня 9 функций foo()
в superFoo()
. Интересно, есть ли более эффективный способ программирования?
Другая альтернатива - purrr:safely()
. Это, однако, столь же многословно, как tryCatch()
, потому что мне нужно переопределить foo()
в superFoo()
, прежде чем вызвать его:
safeFoo = safely(foo)
varA = safeFoo(a)
if (is.null(varA)) { return(list(NA, errorMessage) }
Какова хорошая практика обработки ошибок во вложенных функциях?