Breaking loop ketika "warnings ()" muncul di R

103

Saya mengalami masalah: Saya menjalankan loop untuk memproses banyak file. Matriks saya sangat besar dan oleh karena itu saya sering kehabisan memori jika saya tidak berhati-hati.

Apakah ada cara untuk keluar dari loop jika ada peringatan yang dibuat? Itu terus menjalankan loop dan melaporkan bahwa itu gagal kemudian ... menjengkelkan. Ada ide, oh, stackoverflow-ers yang bijak ?!

mmann1123
sumber

Jawaban:

150

Anda dapat mengubah peringatan menjadi kesalahan dengan:

options(warn=2)

Tidak seperti peringatan, error akan mengganggu loop. Baik, R juga akan melaporkan kepada Anda bahwa kesalahan khusus ini telah diubah dari peringatan.

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
Josh O'Brien
sumber
23
Setelah itu, gunakan options(warn=1) untuk mengembalikan pengaturan default.
Alex Holcombe
25
Nilai defaultnya adalah 0. Jadi untuk mengembalikan ke pengaturan pabrik gunakan options("warn"=0).
Dirk Eddelbuettel
Opsi reset di R biasanya paling baik ditangani oleh 1) op=options(warn=2), 2) melakukan hal Anda, dan kemudian 3) reset dengan options(op), yang akan membawa Anda kembali ke warn=0kasus ini.
mbiron
44

R memungkinkan Anda menentukan penangan kondisi

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

yang mengakibatkan

handling warning: oops
> x
[1] NA

Eksekusi berlanjut setelah tryCatch; Anda dapat memutuskan untuk mengakhirinya dengan mengubah peringatan Anda menjadi sebuah kesalahan

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

atau tangani kondisi tersebut dengan baik (evaluasi berkelanjutan setelah panggilan peringatan)

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

yang mencetak

handled warning: oops
[1] 1
Martin Morgan
sumber
+1 - Luar biasa. Saya telah berpikir untuk menyebutkan opsi ini, tetapi tidak dapat menyusun tutorial singkat tapi manis seperti itu.
Josh O'Brien
mengadakan demonstrasi dengan menyenangkan forakan lebih baik :)
JelenaČuklina
28

Setel warnopsi global :

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

Perhatikan bahwa "peringatan" bukanlah "kesalahan". Loop tidak berhenti karena peringatan (kecuali options(warn=2)).

Joshua Ulrich
sumber