Ломаная петля, когда "предупреждения()" появляются в R
У меня проблема: Я запускаю цикл для обработки нескольких файлов. Мои матрицы огромны, и поэтому у меня часто заканчивается память, если я не осторожен.
Есть ли способ выйти из цикла, если будут созданы какие-либо предупреждения? Он просто продолжает работать в цикле и сообщает, что он потерпел неудачу намного позже... раздражает. Любые идеи о мудрых stackoverflow-ers?!
Ответы
Ответ 1
Вы можете включить предупреждения в:
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
Ответ 2
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
Ответ 3
Установите глобальную опцию warn
:
options(warn=1) # print warnings as they occur
options(warn=2) # treat warnings as errors
Обратите внимание, что "предупреждение" не является "ошибкой". Циклы не заканчиваются для предупреждений (кроме options(warn=2)
).