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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow