Zoeken…


parameters

Parameter Details
expr In het geval dat het "try-gedeelte" is voltooid, retourneert tryCatch de laatst geëvalueerde uitdrukking . De werkelijke waarde die wordt geretourneerd in het geval dat alles goed is gegaan en er geen voorwaarde (dwz een waarschuwing of een fout ) is, is de retourwaarde van readLines . Merk op dat u de retourwaarde via return niet expliciet hoeft te vermelden omdat de code in het "try-gedeelte" niet is ingepakt binnen een functieomgeving (in tegenstelling tot die voor de condition handlers voor waarschuwingen en fouten hieronder)
warning / error / etc Geef / definieer een handlerfunctie voor alle voorwaarden die u expliciet wilt behandelen. AFAIU, u kunt handlers bieden voor elk type voorwaarden (niet alleen waarschuwingen en fouten , maar ook aangepaste voorwaarden; zie hiervoor simpleCondition en vrienden) zolang de naam van de respectieve handlerfunctie overeenkomt met de klasse van de respectieve voorwaarde (zie de Details deel van het document voor tryCatch ).
Tenslotte Hier gaat alles wat aan het einde moet worden uitgevoerd, ongeacht of de uitdrukking in het "try-gedeelte" is geslaagd of als er een voorwaarde was. Als u meer dan één uitdrukking wilt uitvoeren, moet u ze tussen accolades plaatsen, anders had u gewoon finally = <expression> (dwz dezelfde logica als voor "try part").

Opmerkingen

tryCatch

tryCatch retourneert de waarde die is gekoppeld aan het uitvoeren van expr tenzij er een voorwaarde is: een waarschuwing of een fout. Als dat het geval is, kunnen specifieke retourwaarden (bijvoorbeeld return(NA) hierboven) worden opgegeven door een handlerfunctie op te geven voor de respectieve voorwaarden (zie argumenten warning en error in ?tryCatch ). Dit kunnen functies zijn die al bestaan, maar u kunt ze ook definiëren in tryCatch (zoals we hierboven deden).

Implicaties van het kiezen van specifieke retourwaarden van de handlerfuncties

Zoals we hebben gespecificeerd dat NA moet worden geretourneerd in geval van een fout in het "try-gedeelte", is het derde element in y NA . Als we zouden hebben gekozen NULL om de terugkeer waarde, de lengte van y zou gewoon zijn geweest 2 in plaats van 3 als lapply gewoon "negeren / drop" return waarden die NULL . Merk ook op dat als u geen expliciete retourwaarde opgeeft via return , de handlerfuncties NULL retourneren (dwz in het geval van een fout of een waarschuwingsconditie ).

Waarschuwingsbericht "Ongewenst"

Wanneer het derde element van onze urls onze functie raakt, krijgen we de volgende waarschuwing naast het feit dat er een fout optreedt ( readLines klaagt eerst dat het de verbinding niet kan openen via een waarschuwing voordat het daadwerkelijk mislukt met een fout ):

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

Een fout "wint" van een waarschuwing , dus we zijn niet echt geïnteresseerd in de waarschuwing in dit specifieke geval. Daarom hebben we readLines warn = FALSE in readLines , maar dat lijkt geen effect te hebben. Een alternatieve manier om de waarschuwing te onderdrukken is om te gebruiken

suppressWarnings(readLines(con = url))

in plaats van

readLines(con = url, warn = FALSE)

TryCatch () gebruiken

We definiëren een robuuste versie van een functie die de HTML-code van een bepaalde URL leest. Robuust in de zin dat we willen dat het situaties aanpakt waarin iets fout gaat (fout) of niet helemaal zoals we het hadden gepland (waarschuwing). De overkoepelende term voor fouten en waarschuwingen is voorwaarde

Functiedefinitie met 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)
}

Dingen testen

Laten we een vector van URL's definiëren waarbij één element geen geldige URL is

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"
)

En geef dit door als invoer voor de functie die we hierboven hebben gedefinieerd

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

Onderzoek van de output

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow