Interruzione del ciclo quando “warnings ()” appare in R


103

Sto riscontrando un problema: sto eseguendo un ciclo per elaborare più file. Le mie matrici sono enormi e quindi spesso esaurisco la memoria se non sto attento.

C'è un modo per uscire da un ciclo se vengono creati avvisi? Continua a eseguire il ciclo e segnala che è fallito molto più tardi ... fastidioso. Delle idee, oh saggi stackoverflow-ers ?!

Risposte:


150

Puoi trasformare gli avvisi in errori con:

options(warn=2)

A differenza degli avvisi, gli errori interromperanno 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

23
Successivamente, utilizzare options(warn=1) per ripristinare l'impostazione predefinita.
Alex Holcombe

25
Il valore predefinito è 0 però. Quindi per ripristinare le impostazioni di fabbrica utilizzare options("warn"=0).
Dirk Eddelbuettel

Il ripristino delle opzioni in R è solitamente gestito al meglio da 1) op=options(warn=2), 2) facendo le tue cose, e poi 3) ripristinando con options(op), che ti riporta a warn=0in questo caso.
mbiron

44

R consente di definire un gestore di condizioni

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; potresti decidere di terminare convertendo il tuo avviso in un errore

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

o gestire la condizione con garbo (continuando la valutazione dopo la chiamata di avviso)

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

che stampa

handled warning: oops
[1] 1

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

fare una dimostrazione con un simpatico forsarebbe ancora meglio :)
JelenaČuklina

28

Imposta l' warnopzione globale :

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

Notare che un "avviso" non è un "errore". I cicli non terminano per gli avvisi (a meno che options(warn=2)).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.