R'de "uyarılar ()" göründüğünde kırılma döngüsü


103

Bir sorun yaşıyorum: Birden çok dosyayı işlemek için bir döngü çalıştırıyorum. Matrislerim çok büyük ve bu nedenle dikkatli olmazsam çoğu zaman hafızam biter.

Herhangi bir uyarı oluşturulursa döngüden çıkmanın bir yolu var mı? Döngüyü çalıştırmaya devam ediyor ve çok sonra başarısız olduğunu bildiriyor ... sinir bozucu. Akılcı yığın akışı hakkında bir fikir var mı ?!

Yanıtlar:


150

Uyarıları hatalara dönüştürebilirsiniz:

options(warn=2)

Uyarıların aksine, hatalar döngüyü kesintiye uğratır. Güzel bir şekilde, R size bu belirli hataların uyarılardan dönüştürüldüğünü de bildirecektir.

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

24
Daha sonra options(warn=1) varsayılan ayarı geri yüklemek için kullanın .
Alex Holcombe

25
Varsayılan değer 0'dır. Yani fabrika ayarlarını geri yüklemek için kullanın options("warn"=0).
Dirk Eddelbuettel

R'deki seçenekleri sıfırlamak genellikle en iyi 1) op=options(warn=2), 2) işinizi yapmak ve ardından 3) ile sıfırlamak options(op), sizi warn=0bu durumda geri götürür .
mbiron

44

R, bir koşul işleyici tanımlamanıza izin verir

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

hangi sonuçlanır

handling warning: oops
> x
[1] NA

TryCatch'ten sonra yürütme devam eder; uyarınızı bir hataya dönüştürerek bitirmeye karar verebilirsiniz

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

veya durumu nazikçe ele alın (uyarı çağrısından sonra değerlendirmeye devam edilir)

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

hangi baskılar

handled warning: oops
[1] 1

+1 - Mükemmel. Bu seçenekten bahsetmeyi düşünmüştüm, ancak bu kadar kısa ama tatlı bir öğreticiyi bir araya getiremezdim.
Josh O'Brien

güzel bir gösteri yapmak fordaha da iyi olurdu :)
JelenaČuklina

28

Genel warnseçeneği ayarlayın :

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

Bir "uyarının" bir "hata" olmadığını unutmayın. Döngüler uyarılar için sona ermez (olmadıkça options(warn=2)).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.