Comment écrire trycatch dans la R
Je veux écrire trycatch
le code d'erreur dans le téléchargement à partir du web.
url <- c(
"http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html",
"http://en.wikipedia.org/wiki/Xz")
y <- mapply(readLines, con=url)
Ces deux états exécuter avec succès. Ci-dessous, j'ai créer un non-existent web à l'adresse:
url <- c("xxxxx", "http://en.wikipedia.org/wiki/Xz")
url[1]
n'existe pas. Comment écrit-on un trycatch
boucle (function) de sorte que:
- Lorsque l'URL est fausse, la sortie sera: "URL web est faux, ne peuvent pas obtenir".
- Lorsque l'URL est incorrecte, le code ne s'arrête pas, mais continue à télécharger jusqu'à la fin de la liste des Url?
Vous devez vous connecter pour publier un commentaire.
Bien alors: bienvenue dans le monde R 😉
Ici, vous allez
Réglage du code
L'application du code
De l'enquête de la sortie
Remarques supplémentaires
tryCatch
tryCatch
retourne la valeur associée à l'exécution deexpr
sauf si il y a une erreur ou un avertissement. Dans ce cas, les valeurs de retour (voirreturn(NA)
ci-dessus) peut être spécifié en fournissant une fonction de gestionnaire (voir les argumentserror
etwarning
dans?tryCatch
). Ceux-ci peuvent être des fonctions qui existent déjà, mais vous pouvez également définir danstryCatch()
(comme je l'ai fait ci-dessus).Les implications du choix des valeurs de retour des fonctions de gestionnaire d'
Comme nous l'avons précisé que
NA
doit être retourné en cas d'erreur, le troisième élément de lay
estNA
. Si nous aurions choisiNULL
à la valeur de retour, la durée dey
aurait juste été2
au lieu de3
commelapply()
aurez simplement à "ignorer" les valeurs de retour qui sontNULL
. Notez également que si vous ne spécifiez pas de explicite valeur de retour viareturn()
, les fonctions de gestionnaire sera de retourNULL
(c'est à dire dans le cas d'une erreur ou d'une condition d'alarme)."Indésirables" message d'avertissement
Comme
warn=FALSE
ne semble pas avoir d'effet, une autre façon de supprimer l'avertissement (qui dans ce cas n'est pas vraiment d'intérêt) est à utiliserau lieu de
Plusieurs expressions
Notez que vous pouvez également placer plusieurs expressions dans le "réel expressions partie" (argument
expr
detryCatch()
) si vous les emballez dans des accolades (juste comme je l'ai illustré dans lafinally
partie).paste
fonctions se termine par un espace, pourquoi ne pas omettre l'espace et lesep=""
?paste0
pour que!paste0()
est dans la base. En interne, les deuxpaste()
etpaste0()
appeldo_paste
dans coller.c. La seule différence estpaste0()
ne passe pas unsep
argument.paste
dès le débutout
seraNULL
si unwarning
est émis dans letryCatch
dans votre exemple?out
défini dans le cadre de lawarning
fonction. Juste en le regardant, je ne suis pas sûr de ce que R prendra comme valeur pourout
via une portée lexicale. Je vais vérifierNULL
. De retourout
dans le cas d'alerte n'a pas de sens pour moi anyomre, donc je l'ai changé pourreturn(NULL)
juste pour illustrer. J'espère que c'est clair maintenant.return (out)
trop? N'est-ce pas cette situation semblable à lareturn
dans la fonction d'avertissement?error
bits a toujours été exécutée - accolades fixe!readLines(con=url, warn=FALSE)
qui est la chose réelle à ce qui pourrait aller mal). Donc, si vous voulez ajouter un message, vous auriez besoin de stocké le réel de retun de la valeur dans une variable:out <- readLines(con=url, warn=FALSE)
suivie parmessage("Everything worked")
suivie parout
afin de faire de ce le dernier objet qui est en fait retournéconditionMessage (cond)
. C'est le message d'erreur réel comme une chaîne de caractères.R utilise des fonctions pour la mise en œuvre de bloc try-catch:
La syntaxe un peu ressemble à ceci:
Dans tryCatch() il y a deux "conditions" qui peuvent être traitées: les avertissements et les erreurs. La chose importante à comprendre lors de l'écriture de chaque bloc de code est l'état de l'exécution et de la portée.
@source
error-handler-code
aveccat("web url is wrong, can't get")
Ici va un exemple simple:
Si vous aussi vous voulez capturer un "avertissement", il suffit d'ajouter
warning=
similaire à laerror=
partie.expr
partie, puisqu'il y a deux lignes au lieu d'une?Error: unexpected ')' in " )"
etError: unexpected ')' in " )"
. L'ajout d'une paire d'accolades résout le problème.Car je viens de perdre deux jours de ma vie à essayer de résoudre pour tryCatch pour un tri fonction, j'ai pensé que je devais partager ma sagesse (et ce qui est manquant). Pour info - tri est une fonction réelle de FinCal dans ce cas, où eu des erreurs dans quelques cas, sur un grand ensemble de données.
Configurer tryCatch dans le cadre d'une fonction. Par exemple:
Pour l'erreur (ou d'avertissement) pour travailler, vous avez besoin de créer une fonction. J'ai à l'origine de l'erreur de la partie juste écrit
error = return(NULL)
et TOUTES les valeurs revint null.N'oubliez pas de créer un sous-sortie (comme mon "out") et à
return(out)
.tryCatch
est un peu complexe de la structure syntaxique. Cependant, une fois que nous comprenons les 4 parties qui constituent une complète tryCatch appel comme indiqué ci-dessous, il devient facile à retenir:expr: [Nécessaire] R code(s) à évaluer
erreur : [Facultatif] Ce qui doit s'exécuter si une erreur s'est produite lors de l'évaluation de l'codes expr
avertissement : [Facultatif] Ce qui doit s'exécuter si une alarme s'est produite lors de l'évaluation de l'codes expr
enfin : [Facultatif] Que doit exécuter juste avant de quitter le tryCatch appel, indépendamment de si expr a été exécuté avec succès, avec une erreur ou un avertissement
Ainsi, un jouet exemple, pour calculer le journal d'une valeur qui pourrait ressembler à:
Maintenant, l'exécution de trois cas:
Un cas valide
Un "avertissement" cas
Une "erreur" cas
J'ai écrit à propos de quelques cas d'utilisation que j'utilise régulièrement. Trouver plus de détails ici: https://rsangole.netlify.com/post/try-catch/
Espère que cela est utile.