Utilisation tryCatch passer à la valeur suivante de la boucle sur l'erreur?
J'ai lu quelques autres DONC des questions sur tryCatch
et cuzzins, ainsi que de la documentation:
- La gestion des exceptions dans la R
- attraper une erreur, puis la logique
- Comment puis-je vérifier si un appel de fonction des résultats dans un avertissement?
- Problèmes avec les Parcelles en Boucle
mais je ne comprends toujours pas.
Je suis en cours d'exécution d'une boucle et de vouloir sauter à next
si l'un des quelques types d'erreurs se produisent:
for (i in 1:39487) {
# EXCEPTION HANDLING
this.could.go.wrong <- tryCatch(
attemptsomething(),
error=function(e) next
)
so.could.this <- tryCatch(
doesthisfail(),
error=function(e) next
)
catch.all.errors <- function() { this.could.go.wrong; so.could.this; }
catch.all.errors;
#REAL WORK
useful(i); fun(i); good(i);
} #end for
(en passant, il n'y a pas de documentation pour next
que je peux trouver)
Lorsque je l'exécute, R
klaxonne:
Error in value[[3L]](cond) : no loop for break/next, jumping to top level
Quel point suis-je manque ici? Le tryCatch
's sont clairement au sein de la for
boucle, alors pourquoi ne pas R
sais que?
Vous devez vous connecter pour publier un commentaire.
La clé de l'utilisation
tryCatch
est se rendre compte qu'elle renvoie un objet. Si il y a une erreur à l'intérieur de latryCatch
alors cet objet va hériter de la classeerror
. Vous pouvez tester l'héritage de classe avec la fonctioninherit
.Edit:
Quel est le sens de l'argument
error = function(e) e
? Ceci m'a dérouté, et je ne pense pas que c'est bien expliqué dans la documentation. Ce qui se passe, c'est que cet argument des captures de tous les messages d'erreur qui proviennent de l'expression qui vous sonttryCatch
ing. Si une erreur est traitée, elle est retournée en tant que valeur detryCatch
. Dans la documentation d'aide de ce qui est décrit comme uncalling handler
. L'argumente
à l'intérieur deerror=function(e)
est le message d'erreur provenant de votre code.Je suis de la vieille école de la programmation procédurale, où à l'aide de
next
était une mauvaise chose. Donc, je voudrais réécrire votre code quelque chose comme ça. (Note que j'ai enlevé lenext
déclaration à l'intérieur de latryCatch
.):La fonction
next
est documenté à l'intérieur de?
pour`.Si vous souhaitez utiliser à la place d'avoir votre principal travail de routine à l'intérieur d'un
if
, votre code devrait ressembler à quelque chose comme ceci:next
comme vous, mais comme je le pensais de plus en plus d'erreurs qui pourraient éventuellement être pris, le code est devenu un enchevêtrement de parenthèses: aussi mauvais ou pire que la "programmation", une série de conditions à l'intérieur d'une cellule Excel.?for
la ligne suivante est une+
. (en demandant plus d'entrée)error=function(e)
si la fonction est vide? Est censé être un raccourci pour quelque chose d'autre?error=function(e) e
. Retourne le message d'erreur. J'ai également ajouté une explication de ce mécanisme dans la réponse.calling handler
s.La seule vraie explication détaillée que j'ai vu peut être trouvé ici: http://mazamascience.com/WorkingWithData/?p=912
Voici un clip de code à partir de ce post de blog montrant comment tryCatch œuvres
Une chose qui me manquait, qui sortir de la boucle lorsque l'exécution d'une fonction à l'intérieur d'une boucle for dans la R fait clair, est-ce:
next
ne fonctionne pas à l'intérieur d'une fonction.Voldemort = TRUE
) à partir de l'intérieur de votre fonction (dans mon castryCatch
) à l'extérieur.Voldemort == TRUE
). Si vous appelezbreak
ounext
en dehors de la fonction.J'ai trouvé d'autres réponses très déroutant. Ici est extrêmement simple de mise en œuvre pour tous ceux qui veulent simplement passer à la prochaine itération de boucle dans le cas d'une erreur