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

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

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

+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)).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.