Unterbrechung der Schleife, wenn in R „warnings ()“ angezeigt wird

103

Ich habe ein Problem: Ich führe eine Schleife aus, um mehrere Dateien zu verarbeiten. Meine Matrizen sind riesig und deshalb geht mir oft der Speicher aus, wenn ich nicht aufpasse.

Gibt es eine Möglichkeit, aus einer Schleife auszubrechen, wenn Warnungen erstellt werden? Es läuft einfach weiter und meldet, dass es viel später fehlgeschlagen ist ... ärgerlich. Irgendwelche Ideen, oh weise Stackoverflower?!

mmann1123
quelle

Antworten:

150

Sie können Warnungen in Fehler umwandeln mit:

options(warn=2)

Im Gegensatz zu Warnungen unterbrechen Fehler die Schleife. R, Sie werden Ihnen auch mitteilen, dass diese bestimmten Fehler aus Warnungen konvertiert wurden.

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
quelle
23
Verwenden Sie anschließend options(warn=1) , um die Standardeinstellung wiederherzustellen.
Alex Holcombe
25
Der Standardwert ist jedoch 0. Um die Werkseinstellungen wiederherzustellen , verwenden Sie options("warn"=0).
Dirk Eddelbuettel
Das Zurücksetzen von Optionen in R erfolgt normalerweise am besten, indem Sie 1) op=options(warn=2), 2) Ihr Ding machen und dann 3) mit zurücksetzen options(op), was Sie warn=0in diesem Fall zurückbringt .
mbiron
44

Mit R können Sie einen Bedingungshandler definieren

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

was in ... endet

handling warning: oops
> x
[1] NA

Die Ausführung wird nach tryCatch fortgesetzt. Sie können zum Abschluss entscheiden, indem Sie Ihre Warnung in einen Fehler umwandeln

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

oder behandeln Sie die Bedingung ordnungsgemäß (Fortsetzung der Auswertung nach dem Warnruf)

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

welche druckt

handled warning: oops
[1] 1
Martin Morgan
quelle
+1 - Ausgezeichnet. Ich hatte darüber nachgedacht, diese Option zu erwähnen, hätte aber kein so kurzes, aber süßes Tutorial zusammenstellen können.
Josh O'Brien
Eine Demonstration mit einem schönen forwäre noch besser :)
JelenaČuklina
28

Stellen Sie die globale warnOption ein:

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

Beachten Sie, dass eine "Warnung" kein "Fehler" ist. Schleifen werden nicht für Warnungen beendet (es sei denn options(warn=2)).

Joshua Ulrich
quelle