Rに「warnings()」が表示されたときにループを解除する


103

問題があります。複数のファイルを処理するループを実行しています。私の行列は巨大なので、注意しないとメモリが足りなくなることがよくあります。

警告が作成された場合にループから抜け出す方法はありますか?それはループを実行し続け、ずっと後で失敗したことを報告します...迷惑です。アイデアは、ああ賢いstackoverflow-ersですか?!

回答:


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) してデフォルト設定を復元します。
Alex Holcombe

25
ただし、デフォルト値は0です。したがって、出荷時の設定に戻すには、を使用しますoptions("warn"=0)
Dirk Eddelbuettel

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-すばらしい。私はこのオプションについて言及することを考えていましたが、そのように短くて甘いチュートリアルをまとめることはできませんでした。
Josh O'Brien

素敵でデモンストレーションを有するfor:)でも良いだろう
JelenaČuklina

28

グローバルwarnオプションを設定します。

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

「警告」は「エラー」ではないことに注意してください。ループは警告のために終了しません(でない限りoptions(warn=2))。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.