То, что я пытаюсь сделать
Написать tryCatch
, который будет обрабатывать значение ошибки, но будет игнорировать предупреждение. В качестве примераПодавить предупреждения с использованием tryCatch в R
foo <- function(x) {
if (x == 1) {
warning('Warning')
} else if (x == 0) {
stop('Error')
}
return(1)
}
bar <- function(x){
tryCatch(
expr = foo(x),
error = identity,
warning = function(w) invokeRestart("muffleWarning")
)
}
Так foo
предупреждает вас, если вы передаете 0, и ошибки, если вы передаете 1. Цель bar
является то, что вы получите сообщение об ошибке, если передать 0, но он подавляет предупреждение, генерируемое по bar
, если вы передадите 1. Команда invokeRestart("muffleWarning")
исходит из определения suppressWarnings
. Это не работает в конструкции, которую я здесь, и я не знаю, почему. (По иронии судьбы, это порождает ошибку, поэтому попытка, которая успешно вызвала предупреждение, я не хотел, чтобы ошибка, которую я не могу интерпретировать.)
Тупой ответ (TM) Я не хочу использовать и почему
Это определение bar
будет работать
bar <- function(x){
tryCatch(
expr = foo(x),
error = SomeFunctionThatDoesNotMatter,
warning = function(w){suppressWarnings(foo(x))}
)
}
bar
делает именно то, что я хочу, но он делает это потенциально ужасным способом. Представьте себе, что вместо expr = foo(x)
, как у меня здесь, у меня есть expr = lapply(X=1:50, ...)
и что FUN
занимает час. Если X[50]
генерирует единственное предупреждение, тогда мое время выполнения удваивается от 50 часов до 100 часов (yuck).
Вопросы,
- Почему
invokeRestart("muffleWarning")
не работает в моем примере выше? - При использовании
tryCatch
какая функция должна назначатьсяwarning
, чтобы позволить коду просто продолжать работать и подавлять генерируемые предупреждения?
Спасибо за чтение!
Попробуйте 'warning = function (w) {}' – nrussell
Мне нужно 'bar', чтобы все еще вернуть значение' foo (x) ' – Adam
О, я пропустил это. – nrussell