Ах, это хороший намек. Закрытие обновляется. Я использовал это только для многоядерных случаев, когда каждая копия функции вызывалась один раз. Я посмотрю и посмотрю, есть ли исправление. Возможно, при запуске переменной ошибки присваивается значение FALSE.

ользую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"

Здесь есть несколько вопросов, которые обсуждаютtryCatch и обработка ошибок, но ни одна, которую я нашел, не решает эту конкретную проблему. ВидетьКак я могу проверить, приводит ли вызов функции к предупреждению?, warnings () не работает внутри функции? Как можно обойти это?, а такжеКак сказать lapply игнорировать ошибку и обрабатывать следующую вещь в списке? для самых актуальных.

Ответы на вопрос(4)

Ваш ответ на вопрос