Recherche…


Paramètres

Paramètre Détails
expr Au cas où la "partie d'essai" serait terminée, tryCatch renverrait la dernière expression évaluée . Par conséquent, la valeur réelle renvoyée au cas où tout irait bien et qu’il n’ya pas de condition (c’est-à-dire un avertissement ou une erreur ) est la valeur de retour de readLines . Notez que vous n'avez pas besoin d'expliquer clairement la valeur de retour via return car le code de la partie "try" n'est pas encapsulé dans un environnement de fonction (contrairement aux gestionnaires de conditions pour les avertissements et les erreurs ci-dessous)
avertissement / erreur / etc Fournissez / définissez une fonction de gestionnaire pour toutes les conditions que vous souhaitez gérer explicitement. AFAIU, vous pouvez fournir des gestionnaires pour tout type de conditions (pas seulement des avertissements et des erreurs , mais aussi des conditions personnalisées ; voir simpleCondition et friends pour cela) tant que le nom de la fonction de gestionnaire correspondante correspond à la classe de la condition respective (voir le Détails partie de la doc pour tryCatch ).
enfin Ici va tout ce qui devrait être exécuté à la toute fin, peu importe si l'expression dans la partie "try" a réussi ou s'il y avait une condition. Si vous voulez que plusieurs expressions soient exécutées, alors vous devez les mettre entre accolades, sinon vous pourriez simplement écrire finally = <expression> (c'est-à-dire la même logique que pour "try part").

Remarques

tryCatch

tryCatch renvoie la valeur associée à l'exécution de expr sauf s'il y a une condition: un avertissement ou une erreur. Si tel est le cas, des valeurs de retour spécifiques (par exemple, return(NA) ci-dessus) peuvent être spécifiées en fournissant une fonction de gestionnaire pour les conditions respectives (voir arguments warning et error in ?tryCatch ). Celles-ci peuvent être des fonctions qui existent déjà, mais vous pouvez également les définir dans tryCatch (comme nous l'avons fait ci-dessus).

Implications du choix de valeurs de retour spécifiques pour les fonctions du gestionnaire

Comme nous avons spécifié que NA doit être renvoyé en cas d'erreur dans la partie "try", le troisième élément de y est NA . Si nous avions choisi NULL pour être la valeur de retour, la longueur de y aurait simplement été 2 au lieu de 3 car lapply ne lapply que "ignorer / supprimer" les valeurs de retour NULL . Notez également que si vous ne spécifiez pas une valeur de retour explicite via return , les fonctions du gestionnaire NULL (c'est-à-dire en cas d' erreur ou de condition d' avertissement ).

Message d'avertissement "indésirable"

Lorsque le troisième élément de notre vecteur d' urls frappe notre fonction, nous obtenons l'avertissement suivant en plus du fait qu'une erreur se produit ( readLines plaint d'abord de ne pas pouvoir ouvrir la connexion via un avertissement avant de readLines une erreur ):

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

Une erreur "gagne" sur un avertissement , nous ne sommes donc pas vraiment intéressés par l'avertissement dans ce cas particulier. Ainsi, nous avons défini warn = FALSE dans readLines , mais cela ne semble pas avoir d'effet. Une autre façon de supprimer l'avertissement est d'utiliser

suppressWarnings(readLines(con = url))

au lieu de

readLines(con = url, warn = FALSE)

Utiliser tryCatch ()

Nous définissons une version robuste d'une fonction qui lit le code HTML à partir d'une URL donnée. Robuste en ce sens que nous voulons qu’il gère des situations où quelque chose ne va pas (erreur) ou pas exactement comme prévu (avertissement). Le terme générique pour les erreurs et les avertissements est la condition

Définition de la fonction à l'aide de 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)
}

Tester les choses

Définissons un vecteur d'URL où un élément n'est pas une URL valide

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

Et transmettez ceci comme entrée à la fonction que nous avons définie ci-dessus

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

Recherche de la sortie

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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow