Pourquoi est-R-dire pas de boucle pour pause/suivant, en sautant de haut niveau
Pourquoi ne R jeter le message d'erreur "Erreur dans la valeur[3L] : pas de boucle pour pause/suivant, en sautant de haut niveau" au lieu de passer à l'itération suivante d'une boucle? Je suis sur R version 2.13.1 (2011-07-08)
for (i in seq(10)) {
tryCatch(stop(), finally=print('whoops'), error=function(e) next)
}
Ce problème est venu parce que je voulais créer une autre image ou pas d'image du tout lorsque le complot avait échoué. Le code, à l'aide de joran, devrait ressembler à ceci:
for (i in c(1,2,Inf)) {
fname = paste(sep='', 'f', i, '.png')
png(fname, width=1024, height=768)
rs <- tryCatch(plot(i), error=function(e) NULL)
if (is.null(rs)){
print("I'll create a different picture because of the error.")
}
else{
print(paste('image', fname, 'created'))
dev.off()
next
}
}
OriginalL'auteur selden | 2011-08-11
Vous devez vous connecter pour publier un commentaire.
Peut-être que vous pourriez essayer :
OriginalL'auteur Simon
Malheureusement, une fois que vous obtenez à l'intérieur de votre
error
fonction, vous n'êtes plus dans une boucle. Il y a une façon pour vous de hack pour cela:Mais c'est... eh bien, hacky. Il est peut-être moins hacky façon, mais je n'en vois pas tout de suite.
(Ceci fonctionne parce que
delayedAssign
qui se passe à chaque boucle, d'annuler les efforts deforce
)MODIFIER
Ou vous pouvez utiliser les continuations:
MODIFIER
Joris points, vous ne devriez probablement pas fait usage de l'un de ces, parce qu'ils sont difficile à lire. Mais si vous voulez vraiment appeler
next
dans une boucle, c'est la façon de faire :).+1 bonne explication, bien que je conseille vivement à l'encontre de vos constructions. Il y a beaucoup mieux de la programmation des flux qui peut conduire à la même, sans le piratage autour. Mettre ce que vous voulez faire dans une fonction interne, et l'emballage que dans le tryCatch par exemple.
oui, vous êtes vraiment de droite. J'étais juste intrigué par l'idée d'appeler
next
de l'intérieur d'une fonction. Je vais ajouter une note en s'excusant pour moi la folie 😉OriginalL'auteur Owen
Ne serait-il pas plus logique de mettre la
next
à l'extérieur de latryCatch
basée sur uneif
vérifier? Quelque chose comme ceci:bien que je ne suis pas sûr que c'est ce que vous voulez, car je suis un peu dans le flou sur ce que vous essayez de faire.
MODIFIER
Basé sur l'OP de révisions, cette formule fonctionne pour moi:
Je suis certain que ne pas avoir de
dev.off()
appel dans le cas d'une erreur à corriger. J'aurais du creuser un peu plus pour comprendre exactement pourquoi séparerpng
etplot
a été à l'origine des problèmes. Mais je pense que c'est probablement plus propre à conserver lapng(); plot(); dev.off()
séquence autonome de toute façon. Notez également que j'ai mis undev.off()
dans la fonction d'erreur.Je n'ai pas testé ce qui se passera si
plotFn
déclenche une erreur surpng()
, ne crée jamais de l'appareil, puis atteint la fonction d'erreur et les appelsdev.off()
. Le comportement peut dépendre de ce que vous avez à faire dans votre R session.OriginalL'auteur joran