web-dev-qa-db-ja.com

Rに「warnings()」が表示された場合のループの解除

問題が発生しています:ループを実行して複数のファイルを処理しています。私のマトリックスは膨大であるため、注意を怠るとメモリ不足になることがよくあります。

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

96
mmann1123

次の方法で警告をエラーに変えることができます。

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
140
Josh O'Brien

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
40
Martin Morgan

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

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

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

24
Joshua Ulrich