Suche…


Parameter

Parameter Einzelheiten
Ausdruck Falls der "try-Teil" erfolgreich abgeschlossen wurde, gibt tryCatch den zuletzt ausgewerteten Ausdruck zurück . Der tatsächliche Wert, der zurückgegeben wird, falls alles gut readLines ist und keine Bedingung (dh eine Warnung oder ein Fehler ) vorliegt, ist der Rückgabewert von readLines . Beachten Sie, dass Sie nicht explizit angeben müssen, dass der Rückgabewert per return da der Code im "try-Teil" nicht innerhalb einer Funktionsumgebung umschlossen ist (im Gegensatz zu den Bedingungen für die Handler für Warnungen und Fehler).
Warnung / Fehler / etc Stellen Sie eine Handler-Funktion für alle Bedingungen bereit, die Sie explizit behandeln möchten. AFAIU können Sie Handler für jede Art von Bedingung bereitstellen (nicht nur Warnungen und Fehler , sondern auch benutzerdefinierte Bedingungen; siehe dazu simpleCondition und Freunde), sofern der Name der jeweiligen Handlerfunktion der Klasse der jeweiligen Bedingung entspricht (siehe Details Teil des doc für tryCatch ).
endlich Hier wird alles ausgeführt, was am Ende ausgeführt werden soll, unabhängig davon, ob der Ausdruck im "try-Teil" erfolgreich war oder ob eine Bedingung bestand. Wenn Sie möchten, dass mehrere Ausdrücke ausgeführt werden, müssen Sie sie in geschweiften Klammern einwickeln. Andernfalls könnten Sie finally = <expression> (dh die gleiche Logik wie für "try part").

Bemerkungen

tryCatch

tryCatch gibt den Wert zurück, der der Ausführung von expr sei denn, es gibt eine Bedingung: eine Warnung oder einen Fehler. Wenn das der Fall ist , bestimmte Rückgabewerte (zB return(NA) oben) kann durch Zuführen einer Behandlungsfunktion für die jeweiligen Bedingungen angegeben werden (siehe Argumente warning und error in ?tryCatch ). Dies können Funktionen sein, die bereits vorhanden sind, aber Sie können sie auch in tryCatch definieren (wie oben beschrieben).

Auswirkungen der Auswahl bestimmter Rückgabewerte der Handlerfunktionen

Da wir angegeben haben, dass NA im Falle eines Fehlers im "try-Teil" zurückgegeben werden soll, ist das dritte Element in y NA . Wenn wir NULL als Rückgabewert gewählt hätten, wäre die Länge von y nur 2 statt 3 da lapply die NULL Rückgabewerte einfach "ignorieren / lapply wird. Beachten Sie auch, dass, wenn Sie keinen expliziten Rückgabewert über return angeben, die Handlerfunktionen NULL (dh im Falle eines Fehlers oder einer Warnbedingung ).

Warnmeldung "Unerwünscht"

Wenn das dritte Element unserer urls Vektor unsere Funktion trifft, erhalten wir die folgende Warnung zusätzlich zu der Tatsache , dass ein Fehler (tritt readLines klagt zuerst , dass sie die Verbindung über eine Warnung , bevor sie tatsächlich Fehler mit einem Fehler öffnen können):

Warning message:
    In file(con, "r") : cannot open file 'I'm no URL': No such file or directory

Ein Fehler "gewinnt" über eine Warnung , daher sind wir in diesem Fall nicht wirklich an der Warnung interessiert. Wir haben also in readLines warn = FALSE readLines , aber das scheint keine Wirkung zu haben. Eine alternative Möglichkeit, die Warnung zu unterdrücken, ist die Verwendung

suppressWarnings(readLines(con = url))

anstatt

readLines(con = url, warn = FALSE)

TryCatch () verwenden

Wir definieren eine robuste Version einer Funktion, die den HTML-Code von einer bestimmten URL liest. Robust in dem Sinne, dass wir mit Situationen umgehen wollen, in denen etwas schief geht (Fehler) oder nicht ganz so wie wir es geplant haben (Warnung). Der Oberbegriff für Fehler und Warnungen ist Bedingung

Funktionsdefinition mit tryCatch

readUrl <- function(url) {
    out <- tryCatch(

        ########################################################
        # Try part: define the expression(s) you want to "try" #
        ########################################################

        {
            # Just to highlight: 
            # If you want to use more than one R expression in the "try part" 
            # then you'll have to use curly brackets. 
            # Otherwise, just write the single expression you want to try and 

            message("This is the 'try' part")
            readLines(con = url, warn = FALSE) 
        },

        ########################################################################
        # Condition handler part: define how you want conditions to be handled #
        ########################################################################

        # Handler when a warning occurs:
        warning = function(cond) {
            message(paste("Reading the URL caused a warning:", url))
            message("Here's the original warning message:")
            message(cond)

            # Choose a return value when such a type of condition occurs
            return(NULL)
        },

        # Handler when an error occurs:
        error = function(cond) {
            message(paste("This seems to be an invalid URL:", url))
            message("Here's the original error message:")
            message(cond)

            # Choose a return value when such a type of condition occurs
            return(NA)
        },

        ###############################################
        # Final part: define what should happen AFTER #
        # everything has been tried and/or handled    #
        ###############################################

        finally = {
            message(paste("Processed URL:", url))
            message("Some message at the end\n")
        }
    )    
    return(out)
}

Dinge testen

Definieren wir einen Vektor von URLs, bei dem ein Element keine gültige URL ist

urls <- c(
    "http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html",
    "http://en.wikipedia.org/wiki/Xz",
    "I'm no URL"
)

Und übergeben Sie dies als Eingabe an die oben definierte Funktion

y <- lapply(urls, readUrl)
# Processed URL: http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html
# Some message at the end
#
# Processed URL: http://en.wikipedia.org/wiki/Xz
# Some message at the end
#
# URL does not seem to exist: I'm no URL 
# Here's the original error message:
# cannot open the connection
# Processed URL: I'm no URL
# Some message at the end
#
# Warning message:
# In file(con, "r") : cannot open file 'I'm no URL': No such file or directory

Untersuchung der Ausgabe

length(y)
# [1] 3

head(y[[1]])
# [1] "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"      
# [2] "<html><head><title>R: Functions to Manipulate Connections</title>"      
# [3] "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">"
# [4] "<link rel=\"stylesheet\" type=\"text/css\" href=\"R.css\">"             
# [5] "</head><body>"                                                          
# [6] ""    

y[[3]]
# [1] NA


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow