Boucle de rupture lorsque des "avertissements ()" apparaissent dans R

103

J'ai un problème: j'exécute une boucle pour traiter plusieurs fichiers. Mes matrices sont énormes et donc je manque souvent de mémoire si je ne fais pas attention.

Existe-t-il un moyen de sortir d'une boucle si des avertissements sont créés? Il continue juste à exécuter la boucle et rapporte qu'il a échoué beaucoup plus tard ... ennuyeux. Des idées oh sages stackoverflow-ers?!

mmann1123
la source

Réponses:

150

Vous pouvez transformer les avertissements en erreurs avec:

options(warn=2)

Contrairement aux avertissements, les erreurs interrompent la boucle. Eh bien, R vous signalera également que ces erreurs particulières ont été converties à partir d'avertissements.

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
la source
24
Ensuite, utilisez options(warn=1) pour restaurer le paramètre par défaut.
Alex Holcombe
25
La valeur par défaut est cependant 0. Donc, pour restaurer les paramètres d'usine, utilisez options("warn"=0).
Dirk Eddelbuettel
La réinitialisation des options dans R est généralement mieux gérée par 1) op=options(warn=2), 2) faire votre travail, puis 3) réinitialiser avec options(op), ce qui vous ramène warn=0dans ce cas.
mbiron
44

R vous permet de définir un gestionnaire de conditions

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

ce qui se traduit par

handling warning: oops
> x
[1] NA

L'exécution se poursuit après tryCatch; vous pouvez décider de terminer en convertissant votre avertissement en erreur

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

ou gérer la condition avec élégance (évaluation continue après l'appel d'avertissement)

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

qui imprime

handled warning: oops
[1] 1
Martin Morgan
la source
+1 - Excellent. J'avais pensé à mentionner cette option, mais je n'aurais pas pu mettre en place un tutoriel aussi court mais doux.
Josh O'Brien
avoir une démonstration avec un joli forserait encore mieux :)
JelenaČuklina
28

Définissez l' warnoption globale :

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

Notez qu'un "avertissement" n'est pas une "erreur". Les boucles ne se terminent pas pour les avertissements (sauf si options(warn=2)).

Joshua Ulrich
la source