2011-11-21 8 views
67

Mam problem: Uruchomiłem pętlę do przetworzenia wielu plików. Moje matryce są ogromne i dlatego często brakuje mi pamięci, jeśli nie jestem ostrożny.Przerwanie pętli, gdy "ostrzeżenia()" pojawiają się w R

Czy istnieje sposób na przerwanie pętli, jeśli są tworzone ostrzeżenia? Po prostu uruchamia pętlę i informuje, że nie powiodło się później ... denerwujące. Jakieś pomysły o mądrych stackoverflow-ers ?!

Odpowiedz

104

Można włączyć ostrzeżenia w błędy z:

options(warn=2) 

przeciwieństwie do ostrzeżeń, błędów przerywa pętlę. Dobrze, R poinformuje również, że te konkretne błędy zostały przekształcone 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 
+13

potem korzystania 'options (warn = 1)' przywraca ustawienie domyślne. –

+13

Domyślną wartością jest 0. Aby przywrócić ustawienia _factory_ użyj 'options (" warn "= 0)'. –

17

Ustaw globalny warn opcję:

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

pamiętać, że "ostrzeżenie" nie jest "błąd". Pętle nie kończą się z powodu ostrzeżeń (chyba że options(warn=2)).

31

R pozwala na zdefiniowanie obsługi warunek

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

co powoduje

handling warning: oops 
> x 
[1] NA 

Wykonanie nadal po tryCatch; można podjąć decyzję, aby zakończyć konwertując swoje ostrzeżenie błędu

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

lub obsługiwać stan wdzięcznie (ciągłą ocenę po zakończeniu rozmowy ostrzegawczej)

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

która drukuje

handled warning: oops 
[1] 1 
+0

+1 - Doskonały. Myślałem o wspomnianiu tej opcji, ale nie mogłem stworzyć tak krótkiego, ale słodkiego samouczka. –

+0

o demonstracji z ładnym 'for' będzie jeszcze lepiej :) –