Przerwanie pętli, gdy w R pojawi się „ostrzeżenia ()”

103

Mam problem: używam pętli do przetwarzania wielu plików. Moje matryce są ogromne i dlatego często brakuje mi pamięci, jeśli nie jestem ostrożny.

Czy istnieje sposób na wyrwanie się z pętli, jeśli zostaną utworzone jakieś ostrzeżenia? Po prostu działa w pętli i zgłasza, że ​​zawiodło znacznie później ... denerwujące. Jakieś pomysły, och, mądre przepływy stosów ?!

mmann1123
źródło

Odpowiedzi:

150

Możesz zmienić ostrzeżenia w błędy za pomocą:

options(warn=2)

W przeciwieństwie do ostrzeżeń, błędy przerywają pętlę. Dobrze, R poinformuje Cię również, że te konkretne błędy zostały przekonwertowane z ostrzeżeń.

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
źródło
24
Następnie użyj, options(warn=1) aby przywrócić ustawienie domyślne.
Alex Holcombe
25
Wartość domyślna to jednak 0. Aby więc przywrócić ustawienia fabryczne, użyj options("warn"=0).
Dirk Eddelbuettel
Resetowanie opcji w R jest zwykle najlepiej obsługiwane przez 1) op=options(warn=2), 2) robienie swoich rzeczy, a następnie 3) resetowanie za pomocą options(op), co warn=0w tym przypadku przenosi cię z powrotem do .
mbiron
44

R umożliwia zdefiniowanie procedury obsługi warunków

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

Co skutkuje w

handling warning: oops
> x
[1] NA

Wykonywanie jest kontynuowane po tryCatch; możesz zdecydować o zakończeniu, zamieniając ostrzeżenie na błąd

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

lub z wdziękiem radzić sobie ze stanem (kontynuacja oceny po wywołaniu ostrzeżenia)

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

który drukuje

handled warning: oops
[1] 1
Martin Morgan
źródło
+1 - Doskonale. Myślałem o wspominaniu o tej opcji, ale nie mogłem stworzyć tak krótkiego, ale słodkiego samouczka.
Josh O'Brien
pokaz z fajnym forbyłby jeszcze lepszy :)
JelenaČuklina
28

Ustaw warnopcję globalną :

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

Zauważ, że „ostrzeżenie” nie jest „błędem”. Pętle nie kończą się w przypadku ostrzeżeń (chyba że options(warn=2)).

Joshua Ulrich
źródło