R Language
Feltolerant / fjädrande kod
Sök…
parametrar
Parameter | detaljer |
---|---|
expr | I fall "testdelen" slutfördes framgångsrik kommer tryCatch att returnera det senast utvärderade uttrycket . Därför är det faktiska värdet som returneras om allt gick bra och det inte finns något villkor (dvs. en varning eller ett fel ) är returvärdet för readLines . Observera att du inte behöver explicilty ange returvärdet via return eftersom kod i "testdelen" inte är lindad i en funktionsmiljö (till skillnad från det för villkor hanterare för varningar och fel nedan) |
varning / fel / etc | Ange / definiera en hanteringsfunktion för alla villkor som du vill hantera uttryckligen. AFAIU, du kan tillhandahålla hanterare för alla typer av villkor (inte bara varningar och fel , men också anpassade villkor; se simpleCondition och vänner för det) så länge namnet på respektive hanterarfunktion matchar klassen för respektive villkor (se Detaljer om dokumentet för tryCatch ). |
till sist | Här följer allt som borde utföras i slutet, oavsett om uttrycket i "testdelen" lyckades eller om det fanns något villkor. Om du vill att mer än ett uttryck ska köras måste du packa in dem i lockiga parenteser, annars kan du bara ha skrivit finally = <expression> (dvs. samma logik som för "prova del". |
Anmärkningar
tryCatch
tryCatch
returnerar värdet som är associerat med exekvering expr
inte det finns ett villkor: en varning eller ett fel. Om så är fallet, specifika värden retur (t.ex. return(NA)
kan ovan) anges genom att tillföra en hanterarfunktion för respektive förhållanden (se argument warning
och error
i ?tryCatch
). Dessa kan vara funktioner som redan finns, men du kan också definiera dem inom tryCatch
(som vi gjorde ovan).
Konsekvenser av att välja specifika returvärden för hanterarfunktionerna
Som vi har angett att NA
ska returneras i händelse av ett fel i "testdelen" är det tredje elementet i y
NA
. Om vi hade valt NULL
som returvärde skulle längden på y
bara ha varit 2
istället för 3
eftersom lapply
helt enkelt "ignorerar / släpp" returneringsvärden som är NULL
. Observera också att om du inte anger ett uttryckligt returvärde via return
, kommer hanteringsfunktionerna att returnera NULL
(dvs i händelse av ett fel eller ett varningstillstånd ).
"Oönskat" varningsmeddelande
När det tredje elementet i vår urls
träffar vår funktion får vi följande varning utöver det faktum att ett fel inträffar ( readLines
klagar först att den inte kan öppna anslutningen via en varning innan den faktiskt misslyckas med ett fel ):
Warning message:
In file(con, "r") : cannot open file 'I'm no URL': No such file or directory
Ett fel "vinner" över en varning , så vi är inte riktigt intresserade av varningen i det här fallet. Således har vi ställt in warn = FALSE
i readLines
, men det verkar inte ha någon effekt. Ett alternativt sätt att undertrycka varningen är att använda
suppressWarnings(readLines(con = url))
istället för
readLines(con = url, warn = FALSE)
Använda tryCatch ()
Vi definierar en robust version av en funktion som läser HTML-koden från en given URL. Robust i den meningen att vi vill att det ska hantera situationer där något antingen går fel (fel) eller inte riktigt som vi planerat det (varning). Paraplytermen för fel och varningar är villkor
Funktionsdefinition med 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)
}
Testa saker
Låt oss definiera en vektor med webbadresser där ett element inte är en giltig URL
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"
)
Och skicka detta som input till den funktion som vi definierade ovan
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
Undersöker produktionen
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