Pregunta Breaking loop cuando "warnings ()" aparecen en R


Estoy teniendo un problema:   Estoy ejecutando un ciclo para procesar múltiples archivos. Mis matrices son enormes y, por lo tanto, a menudo me quedo sin memoria si no tengo cuidado.

¿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 ?!


75
2017-11-21 20:09


origen


Respuestas:


Puede convertir 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 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

114
2017-11-21 20:12



R le permite definir un manejador de condición

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; usted puede 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 elegancia (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

33
2017-11-21 21:29



Establecer el global warn opción:

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 options(warn=2))


17
2017-11-21 20:12