2011-11-21 5 views
67

Ho un problema: Sto eseguendo un ciclo per elaborare più file. Le mie matrici sono enormi e quindi spesso mi manca la memoria se non sto attento.Ciclo di interruzione quando "avvisi()" vengono visualizzati in R

C'è un modo per interrompere un ciclo se vengono creati degli avvisi? Continua a fare il giro e segnala che è fallito molto più tardi ... annoying. Qualche idea, oh, saggio stackoverflow?

risposta

104

È possibile attivare gli avvisi in errori con:

options(warn=2) 

A differenza di avvertimenti, errori interrompono il ciclo. Bene, R ti segnalerà anche che questi particolari errori sono stati convertiti da avvisi.

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

In seguito, l'uso 'options (warn = 1)' per ripristinare le impostazioni predefinite. –

+13

Il valore predefinito è 0 però. Quindi per ripristinare le _factory settings_ usare 'options (" warn "= 0)'. –

17

Impostare l'opzione globale warn:

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

Si noti che un "avvertimento" non è un "errore". I loop non terminano per gli avvisi (a meno che non sia options(warn=2)).

31

R consente di definire un gestore condizione

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

che si traduce in

handling warning: oops 
> x 
[1] NA 

l'esecuzione continua dopo TryCatch; si potrebbe decidere di porre fine convertendo il tuo avvertimento di un errore

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

o gestire la condizione di grazia (valutazione continua dopo la chiamata di allarme)

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

che stampa

handled warning: oops 
[1] 1 
+0

+1 - Eccellente. Avevo pensato di menzionare questa opzione, ma non avrei potuto mettere insieme un tutorial così breve ma dolce. –

+0

avere una dimostrazione con un bel 'for' sarebbe ancora meglio :) –