2011-11-21 5 views
67

Tengo un problema: Estoy ejecutando un bucle para procesar varios archivos. Mis matrices son enormes y, por lo tanto, a menudo me quedo sin memoria si no tengo cuidado.Bucle de ruptura cuando "advertencias()" aparecen en R

¿Hay alguna manera de salir de un bucle si se crean advertencias? Simplemente sigue ejecutando el ciclo e informa que falló mucho más tarde ... molesto. ¿Alguna idea de los sabios stackoverflowers ?!

Respuesta

104

Puede activar avisos en errores con:

options(warn=2) 

A diferencia de las advertencias, los errores van a interrumpir el bucle. Muy bien, R también le informará que estos errores en particular se convirtieron de las advertencias.

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

Posteriormente, el uso 'options (warn = 1)' para restablecer la configuración predeterminada. –

+13

El valor predeterminado es 0 embargo. Por lo tanto, para restablecer la configuración de _factory_ use 'options (" warn "= 0)'. –

17

Establecer la opción global warn:

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

Tenga en cuenta que una "advertencia" no es un "error". Los bucles no finalizan por advertencias (a menos que options(warn=2)).

31

R le permite definir un manejador de condiciones

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

que resulta en

handling warning: oops 
> x 
[1] NA 

ejecución continúa después de TryCatch; usted podría decidir terminar mediante la conversión de su advertencia a un error

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

o manejar la situación con gracia (evaluación continua después de la llamada de aviso)

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

que imprime

handled warning: oops 
[1] 1 
+0

+1 - Excelente. Había pensado en mencionar esta opción, pero no podría haber preparado un tutorial tan breve pero dulce. –

+0

tener una demostración con un agradable 'para' sería incluso mejor :) –

Cuestiones relacionadas