Pertanyaan Lingkaran putus ketika "peringatan ()" muncul di R


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

Apakah ada cara untuk keluar dari loop jika ada peringatan yang dibuat? Itu hanya terus menjalankan loop dan melaporkan bahwa itu gagal lama kemudian ... menjengkelkan. Ada ide apa pun yang bijak?


75
2017-11-21 20:09


asal


Jawaban:


Anda dapat mengubah peringatan menjadi kesalahan dengan:

options(warn=2)

Tidak seperti peringatan, kesalahan akan mengganggu pengulangan. Dengan baik, R juga akan melaporkan kepada Anda bahwa kesalahan khusus ini 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

114
2017-11-21 20:12



R memungkinkan Anda untuk menentukan handler 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 mengakhiri dengan mengubah peringatan Anda menjadi kesalahan

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

atau menangani kondisi dengan baik (evaluasi berkelanjutan setelah panggilan peringatan)

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

yang dicetak

handled warning: oops
[1] 1

33
2017-11-21 21:29



Atur global warn pilihan:

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

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


17
2017-11-21 20:12