Я использую lapply
для запуска сложной функции на большое количество элементов, и я хотел бы сохранить вывод каждого элемента (если есть) вместе с любыми предупреждениями / ошибками, которые были созданы, чтобы я мог сказать, какой элемент выдал какое предупреждение / ошибку.
Я нашел способ перехвата предупреждений с помощью withCallingHandlers
( описан здесь ). Однако мне также нужно отлавливать ошибки. Я могу сделать это, заключив его в tryCatch
(как в приведенном ниже коде), но есть ли лучший способ сделать это?
catchToList <- function(expr) {
val <- NULL
myWarnings <- NULL
wHandler <- function(w) {
myWarnings <<- c(myWarnings, w$message)
invokeRestart("muffleWarning")
}
myError <- NULL
eHandler <- function(e) {
myError <<- e$message
NULL
}
val <- tryCatch(withCallingHandlers(expr, warning = wHandler), error = eHandler)
list(value = val, warnings = myWarnings, error=myError)
}
Пример вывода этой функции:
> catchToList({warning("warning 1");warning("warning 2");1})
$value
[1] 1
$warnings
[1] "warning 1" "warning 2"
$error
NULL
> catchToList({warning("my warning");stop("my error")})
$value
NULL
$warnings
[1] "my warning"
$error
[1] "my error"
Есть несколько вопросы здесь по SO, которые обсуждают tryCatch
и обработку ошибок, но ни один из найденных мной не решает эту конкретную проблему. См. Как я могу проверить, вызывает ли вызов функции предупреждение? , warnings () не работает внутри функции? Как можно обойти это? и Как указать lapply игнорировать ошибку и обрабатывать следующее в списке? для наиболее важных.