2016-03-03 4 views
1

То, что я пытаюсь сделать

Написать 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).

Вопросы,

  1. Почему invokeRestart("muffleWarning") не работает в моем примере выше?
  2. При использовании tryCatch какая функция должна назначаться warning, чтобы позволить коду просто продолжать работать и подавлять генерируемые предупреждения?

Спасибо за чтение!

+1

Попробуйте 'warning = function (w) {}' – nrussell

+0

Мне нужно 'bar', чтобы все еще вернуть значение' foo (x) ' – Adam

+0

О, я пропустил это. – nrussell

ответ

1

Я столкнулся с этой проблемой после интуиции nrussell. Решение состоит в том, чтобы заменить общий

tryCatch({ 
    some_fn() 
}, warning = function(w) { 
    print(paste('warning:', w)) 
}, error = function(e) { 
    print(paste('error:', e)) 
}) 

с

tryCatch({ 
    some_fn() 
}, error = function(e) { 
    print(paste('error:', e)) 
}) 

Этот формат/синтаксис работал для меня. Вы можете легко заключить его в такую ​​функцию, как вам нужно:

Смежные вопросы