Розрив циклу, коли в R з'являються "попередження ()"


103

У мене виникає проблема: я запускаю цикл для обробки декількох файлів. Мої матриці величезні, і тому мені часто не вистачає пам’яті, якщо я не обережний.

Чи є спосіб вийти з циклу, якщо створено якісь попередження? Він просто продовжує запускати цикл і повідомляє, що він вийшов з ладу набагато пізніше ... дратує. Будь-які ідеї о мудрі стаковіверхи ?!

Відповіді:


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

23
Після цього використовуйте 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)).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.