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.