Прерывание цикла при появлении «warnings ()» в R

103

У меня проблема: я запускаю цикл для обработки нескольких файлов. Мои матрицы огромны, и поэтому мне часто не хватает памяти, если я не буду осторожен.

Есть ли способ выйти из цикла при появлении каких-либо предупреждений? Он просто продолжает запускать цикл и сообщает, что он потерпел неудачу намного позже ... раздражает. Какие-нибудь идеи о мудрых stackoverflow-ers ?!

mmann1123
источник

Ответы:

150

Вы можете превратить предупреждения в ошибки с помощью:

options(warn=2)

В отличие от предупреждений, ошибки прерывают цикл. Хорошо, R также сообщит вам, что эти конкретные ошибки были преобразованы из предупреждений.

j <- function() {
    for (i in 1:3) {
        cat(i, "\n")
        as.numeric(c("1", "NA"))
}}

# warn = 0 (default) -- warnings as warnings!
j()
# 1 
# 2 
# 3 
# Warning messages:
# 1: NAs introduced by coercion 
# 2: NAs introduced by coercion 
# 3: NAs introduced by coercion 

# warn = 2 -- warnings as errors
options(warn=2)
j()
# 1 
# Error: (converted from warning) NAs introduced by coercion
Джош О'Брайен
источник
24
После этого используйте options(warn=1) для восстановления настроек по умолчанию.
Алекс Холкомб
25
Однако значение по умолчанию - 0. Так что для восстановления заводских настроек используйте options("warn"=0).
Дирк Эддельбюттель
Сброс параметров в R обычно лучше всего выполняется с помощью 1) op=options(warn=2), 2) выполнения ваших действий, а затем 3) сброса с помощью options(op), что возвращает вас warn=0в этом случае.
mbiron
44

R позволяет вам определить обработчик условия

x <- tryCatch({
    warning("oops")
}, warning=function(w) {
    ## do something about the warning, maybe return 'NA'
    message("handling warning: ", conditionMessage(w))
    NA
})

что приводит к

handling warning: oops
> x
[1] NA

Выполнение продолжается после tryCatch; вы можете решить закончить, преобразовав свое предупреждение в ошибку

x <- tryCatch({
    warning("oops")
}, warning=function(w) {
    stop("converted from warning: ", conditionMessage(w))
})

или обработать условие изящно (продолжение оценки после вызова предупреждения)

withCallingHandlers({
    warning("oops")
    1
}, warning=function(w) {
    message("handled warning: ", conditionMessage(w))
    invokeRestart("muffleWarning")
})

который печатает

handled warning: oops
[1] 1
Мартин Морган
источник
+1 - Отлично. Я думал упомянуть об этой опции, но не смог составить такой короткий, но приятный урок.
Джош О'Брайен
forбыло бы еще лучше провести демонстрацию с приятным :)
JelenaČuklina
28

Установите глобальный warnпараметр:

options(warn=1)  # print warnings as they occur
options(warn=2)  # treat warnings as errors

Обратите внимание, что «предупреждение» не является «ошибкой». Циклы не завершаются для предупреждений (кроме случаев options(warn=2)).

Джошуа Ульрих
источник