Frage Schleife, wenn "warnings ()" in R erscheint


Ich habe ein Problem:   Ich führe eine Schleife, um mehrere Dateien zu verarbeiten. Meine Matrizen sind riesig und deshalb habe ich oft keine Speicher mehr, wenn ich nicht vorsichtig bin.

Gibt es eine Möglichkeit, aus einer Schleife auszubrechen, wenn Warnungen erstellt werden? Es läuft einfach weiter und berichtet, dass es viel später gescheitert ist ... nervig. Irgendwelche Ideen oh weise stack overflowers ?!


75
2017-11-21 20:09


Ursprung


Antworten:


Sie können Warnungen zu Fehlern machen mit:

options(warn=2)

Im Gegensatz zu Warnungen unterbrechen Fehler die Schleife. Schön, R wird Ihnen auch berichten, dass diese speziellen Fehler von Warnungen umgewandelt 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

114
2017-11-21 20:12



Mit R können Sie einen Condition-Handler definieren

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

was dazu führt

handling warning: oops
> x
[1] NA

Die Ausführung wird nach tryCatch fortgesetzt. Sie könnten entscheiden, die Warnung in einen Fehler zu konvertieren

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")
})

welches druckt

handled warning: oops
[1] 1

33
2017-11-21 21:29



Setze das Globale warn Möglichkeit:

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

Beachten Sie, dass eine "Warnung" kein "Fehler" ist. Schleifen enden nicht für Warnungen (außer options(warn=2)).


17
2017-11-21 20:12