Na dann: Willkommen in der R-Welt ;-)
Bitte schön
Code einrichten
urls <- c(
"http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html",
"http://en.wikipedia.org/wiki/Xz",
"xxxxx"
)
readUrl <- function(url) {
out <- tryCatch(
{
# 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.
# 'tryCatch()' will return the last evaluated expression
# in case the "try" part was completed successfully
message("This is the 'try' part")
readLines(con=url, warn=FALSE)
# The return value of `readLines()` is the actual value
# that will be returned in case there is no condition
# (e.g. warning or error).
# You don't need to state the return value via `return()` as code
# in the "try" part is not wrapped insided a function (unlike that
# for the condition handlers for warnings and error below)
},
error=function(cond) {
message(paste("URL does not seem to exist:", url))
message("Here's the original error message:")
message(cond)
# Choose a return value in case of error
return(NA)
},
warning=function(cond) {
message(paste("URL caused a warning:", url))
message("Here's the original warning message:")
message(cond)
# Choose a return value in case of warning
return(NULL)
},
finally={
# NOTE:
# Here goes everything that should be executed at the end,
# regardless of success or error.
# If you want more than one expression to be executed, then you
# need to wrap them in curly brackets ({...}); otherwise you could
# just have written 'finally=<expression>'
message(paste("Processed URL:", url))
message("Some other message at the end")
}
)
return(out)
}
Anwenden des Codes
> y <- lapply(urls, readUrl)
Processed URL: http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html
Some other message at the end
Processed URL: http://en.wikipedia.org/wiki/Xz
Some other message at the end
URL does not seem to exist: xxxxx
Here's the original error message:
cannot open the connection
Processed URL: xxxxx
Some other message at the end
Warning message:
In file(con, "r") : cannot open file 'xxxxx': No such file or directory
Untersuchung der Ausgabe
> 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] ""
> length(y)
[1] 3
> y[[3]]
[1] NA
Zusätzliche Bemerkungen
tryCatch
tryCatch
Gibt den Wert zurück, der der Ausführung zugeordnet ist, es expr
sei denn, es liegt ein Fehler oder eine Warnung vor. In diesem Fall können bestimmte Rückgabewerte (siehe return(NA)
oben) durch Angabe einer entsprechenden Handlerfunktion angegeben werden (siehe Argumente error
und warning
in ?tryCatch
). Dies können bereits vorhandene Funktionen sein, aber Sie können sie auch innerhalb definieren tryCatch()
(wie oben beschrieben).
Die Auswirkungen der Auswahl bestimmter Rückgabewerte der Handlerfunktionen
Wie wir festgelegt haben , dass NA
im Fehlerfall zurückgegeben werden soll, in das dritte Element y
ist NA
. Wenn wir würden gewählt , NULL
den Rückgabewert sein, die Länge y
wäre einfach gewesen, 2
statt 3
wie lapply()
einfach „ignorieren“ Rückgabewerte , die sind NULL
. Beachten Sie auch , dass , wenn Sie keine angeben expliziten Rückgabewert über return()
die Handler - Funktionen zurückkehren NULL
(dh im Falle eines Fehlers oder eines Warnzustand).
Warnmeldung "Unerwünscht"
Da warn=FALSE
dies keine Auswirkungen zu haben scheint, besteht eine alternative Möglichkeit zur Unterdrückung der Warnung (die in diesem Fall nicht wirklich von Interesse ist) in der Verwendung
suppressWarnings(readLines(con=url))
anstatt
readLines(con=url, warn=FALSE)
Mehrere Ausdrücke
Beachten Sie, dass Sie auch mehrere Ausdrücke in den Teil "Tatsächliche Ausdrücke" (Argument expr
von tryCatch()
) einfügen können, wenn Sie sie in geschweifte Klammern setzen (genau wie im finally
Teil dargestellt).
paste
Funktionen mit einem Leerzeichen endet, lassen Sie das Leerzeichen und das Leerzeichensep=""
weg.paste0
!paste0()
ist in der Basis. Intern beidepaste()
undpaste0()
Anrufdo_paste
in paste.c . Der einzige Unterschied ist,paste0()
dass keinsep
Argument übergeben wird.readLines(con=url, warn=FALSE)
ist dies das eigentliche Objekt , das schief gehen könnte). Wenn Sie also eine Nachricht hinzufügen möchten, müssen Sie den tatsächlichen Retun-Wert in einer Variablen speichern:out <- readLines(con=url, warn=FALSE)
gefolgt vonmessage("Everything worked")
gefolgtout
, um dies zum letzten Objekt zu machen, das tatsächlich zurückgegeben wirdR verwendet Funktionen zum Implementieren des Try-Catch-Blocks:
Die Syntax sieht ungefähr so aus:
In tryCatch () können zwei 'Bedingungen' behandelt werden: 'Warnungen' und 'Fehler'. Das Wichtigste beim Schreiben jedes Codeblocks ist der Ausführungsstatus und der Umfang. @Quelle
quelle
error-handler-code
durchcat("web url is wrong, can't get")
tryCatch
hat eine leicht komplexe Syntaxstruktur. Sobald wir jedoch die 4 Teile verstanden haben, die einen vollständigen tryCatch-Aufruf darstellen, wie unten gezeigt, wird es leicht, sich zu erinnern:Ausdruck : [ Erforderlich ] R-Code (s), die ausgewertet werden sollen
Fehler : [ Optional ] Was soll ausgeführt werden, wenn beim Auswerten der Codes in Ausdruck ein Fehler aufgetreten ist?
Warnung : [ Optional ] Was sollte ausgeführt werden, wenn beim Auswerten der Codes in Ausdruck eine Warnung aufgetreten ist?
Schließlich : [ Optional ] Was sollte unmittelbar vor dem Beenden des tryCatch-Aufrufs ausgeführt werden, unabhängig davon, ob expr erfolgreich ausgeführt wurde, mit einem Fehler oder einer Warnung
Ein Spielzeugbeispiel zur Berechnung des Protokolls eines Werts könnte daher folgendermaßen aussehen:
Nun werden drei Fälle ausgeführt:
Ein gültiger Fall
Ein "Warn" -Fall
Ein "Fehler" -Fall
Ich habe über einige nützliche Anwendungsfälle geschrieben, die ich regelmäßig verwende. Weitere Details finden Sie hier: https://rsangole.netlify.com/post/try-catch/
Hoffe das ist hilfreich.
quelle
Hier ein einfaches Beispiel :
Wenn Sie auch eine "Warnung" erfassen möchten, fügen Sie einfach
warning=
ähnlich wie daserror=
Teil hinzu.quelle
expr
Teil geschweifte Klammern geben , da es zwei Linien anstelle von einer gibt?Error: unexpected ')' in " )"
undError: unexpected ')' in " )"
. Das Hinzufügen eines Paares geschweifter Klammern löst das Problem.Da ich gerade zwei Tage meines Lebens verloren habe, als ich versucht habe, tryCatch für eine irr-Funktion zu lösen, dachte ich, ich sollte meine Weisheit teilen (und was fehlt). FYI - irr ist in diesem Fall eine tatsächliche Funktion von FinCal, bei der in einigen Fällen Fehler in einem großen Datensatz aufgetreten sind.
Richten Sie tryCatch als Teil einer Funktion ein. Zum Beispiel:
Damit der Fehler (oder die Warnung) funktioniert, müssen Sie tatsächlich eine Funktion erstellen. Ich habe ursprünglich für den Fehlerteil gerade geschrieben
error = return(NULL)
und ALLE Werte sind null zurückgekommen.Denken Sie daran, eine Unterausgabe (wie mein "out") zu erstellen und zu
return(out)
.quelle