Ruptura de bucle cuando aparecen "advertencias ()" en R

103

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.

¿Hay alguna forma 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, oh sabios stackoverflow-ers?

mmann1123
fuente

Respuestas:

150

Puede convertir las advertencias en errores con:

options(warn=2)

A diferencia de las advertencias, los errores interrumpirán el ciclo. Muy bien, R también le informará que estos errores particulares se convirtieron a partir de 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
Josh O'Brien
fuente
23
Luego, use options(warn=1) para restaurar la configuración predeterminada.
Alex Holcombe
25
Sin embargo, el valor predeterminado es 0. Entonces, para restaurar la configuración de fábrica, use options("warn"=0).
Dirk Eddelbuettel
Restablecer las opciones en R generalmente se maneja mejor con 1) op=options(warn=2), 2) hacer lo tuyo y luego 3) restablecer con options(op), lo que te lleva de regreso a warn=0este caso.
mbiron
44

R le permite definir un controlador de condiciones

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

lo que resulta en

handling warning: oops
> x
[1] NA

La ejecución continúa después de tryCatch; podría decidir terminar convirtiendo su advertencia en un error

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

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

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

que imprime

handled warning: oops
[1] 1
Martín Morgan
fuente
+1 - Excelente. Había pensado en mencionar esta opción, pero no podría haber elaborado un tutorial tan corto pero dulce.
Josh O'Brien
tener una demostración con un simpático forsería aún mejor :)
JelenaČuklina
28

Establezca la warnopción global :

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 terminan por advertencias (a menos que options(warn=2)).

Joshua Ulrich
fuente