Script R les numéros de ligne à l'erreur?
Si je suis en cours d'exécution d'un long R de script en ligne de commande (R --esclave script.R), comment puis-je obtenir à donner les numéros de ligne à des erreurs?
Je ne veux pas ajouter des commandes de débogage du script, si c'est possible -- je veux juste R à se comporter comme la plupart des autres langages de script ...
- Toutes les mises à jour? Quatre 4 ans plus tard, semble que le problème persiste, malgré l'adoption généralisée de R.
- J'ai aussi une très longue script R avec beaucoup de petites sortie, je veux imprimer (trait de soulignement)(trait de soulignement)en LIGNE/FICHIER(trait de soulignement)(trait de soulignement) (les numéros de ligne et de scriptname) comme ça en C, au lieu de coder en dur les line-numbers en source.
- Je ne sais pas si la R interne a vraiment une notion de " ligne de nombres. Cependant, il a une notion de compléter les tâches, c'est à dire le haut niveau des tâches. On pourrait, par exemple, facilement définir une tâche de gestionnaire de dire qui de haut niveau de la tâche a échoué. Bien sûr, ce n'est pas le grand confort pour ceux avec de grandes chaînes des grandes ou des instructions conditionnelles.
Vous devez vous connecter pour publier un commentaire.
Ce ne sera pas vous donner le numéro de la ligne, mais il vous dira où la panne se produit dans la pile d'appel qui est très utile:
[Edit:] Lors de l'exécution d'un script à partir de la ligne de commande, vous aurez à passer un ou deux appels, voir traceback() pour interactif et non interactif de recherche de séances de
Je ne suis pas au courant d'un autre moyen de le faire sans l'habitude de débogage suspects:
Vous voudrez peut-être regarder à ce poste.
[Edit:] Désolé...juste vu que vous exécutez cette ligne de commande. Dans ce cas, je vous suggère de travailler avec les options(erreur) fonctionnalité. Voici un exemple simple:
Vous pouvez créer autant d'élaborer un script que vous le souhaitez sur une condition d'erreur, vous devez donc vous venez de décider quelles sont les informations dont vous avez besoin pour le débogage.
Sinon, si il y a des domaines que vous êtes concerné (par exemple, la connexion à une base de données), puis les envelopper dans une tryCatch() fonction.
options(error=function() { traceback(2); if(!interactive()) quit("no", status = 1, runLast = FALSE) })
(voir le commentaire de accepté de répondre). Je pense qu'il serait judicieux d'ajouter à la réponse ici plutôt que de fournir un lien vers un autre thread.Faire
options(error=traceback)
fournit un peu plus d'informations sur le contenu des lignes menant à l'erreur. Il provoque un traceback si il y a une erreur, et pour les quelques erreurs qu'il a le numéro de la ligne, préfixé par#
. Mais il est frappé ou manquer, de nombreuses erreurs à ne pas obtenir les numéros de ligne.No traceback available
après l'erreur.Soutien sera à venir dans la R 2.10 et plus tard. Duncan Murdoch vient de poster à la r-devel sur Sep 10 2009 sujet findLineNum et setBreapoint:
Vous le faire par la mise en
Je me demande juste pourquoi ce paramètre n'est pas un défaut dans la R? Il faut, comme dans toute autre langue.
Spécifiant le mondial de R option pour la gestion des non-catastrophique erreurs travaillé pour moi, avec un flux de travail personnalisé pour la rétention d'info sur l'erreur et l'examen de cette info, suite à l'échec. Je suis actuellement en cours d'exécution de la R version 3.4.1.
Ci-dessous, j'ai inclus une description du flux de travail qui a fonctionné pour moi, ainsi que certains de code que j'ai utilisé pour définir le global option de gestion d'erreur dans l'arrêt R.
Que je l'ai configuré, le traitement des erreurs crée également un fichier RData contenant tous les objets dans la mémoire de travail au moment de l'erreur. Ce cliché peut être lu en R à l'aide de
load()
et puis les différents environnements, tels qu'ils existaient au moment de l'erreur peut être inspectés de manière interactive à l'aide dedebugger(errorDump)
.Je note que j'ai été en mesure d'obtenir les numéros de ligne dans le
traceback()
de sortie de toutes les fonctions personnalisées à l'intérieur de la pile, mais seulement si j'ai utilisé lekeep.source=TRUE
option lors de l'appel desource()
pour toutes les fonctions personnalisées utilisées dans mon script. Sans cette option, le réglage de la global option de gestion d'erreur comme ci-dessous envoyé la sortie complète de latraceback()
à une erreur de log nomméerror.log
, mais les numéros de ligne n'étaient pas disponibles.Voici les étapes que j'ai pris dans mon flux de travail et comment j'ai pu accéder au vidage de la mémoire et journal d'erreur après un non-interactif de recherche de panne.
J'ai mis la suivante en haut du script principal, j'ai été appeler à partir de la ligne de commande. Ceci définit la gestion des erreurs global de l'option pour le R de la session. Mon script principal a été appelé
myMainScript.R
. Les différentes lignes dans le code les commentaires après leur décrivant ce qu'ils font. En fait, avec cette option, lorsque R rencontre une erreur qui déclenchestop()
, il faudra créer un RData (*.ajr) fichier de vidage de la mémoire de travail dans tous les environnements actifs dans le répertoire~/myUsername/directoryForDump
et aussi écrire un journal des erreurs nomméerror.log
avec quelques informations utiles pour le même répertoire. Vous pouvez modifier cet extrait de code afin d'ajouter d'autres manipulations sur l'erreur (par exemple, ajouter un horodatage du fichier de vidage et le journal des erreurs de noms de fichiers, etc.).Assurez-vous que depuis le script principal, et tous les appels de fonction, à chaque fois qu'une fonction est d'origine, l'option
keep.source=TRUE
est utilisé. C'est, à la source d'une fonction, vous devez utilisersource('~/path/to/myFunction.R', keep.source=TRUE)
. Ceci est nécessaire pour letraceback()
sortie à contenir des numéros de ligne. Il semble que vous pouvez également définir cette option à l'échelle mondiale à l'aide deoptions( keep.source=TRUE )
, mais je n'ai pas testé pour voir si elle fonctionne. Si vous n'avez pas besoin des numéros de ligne, vous pouvez omettre cette option.Rscript myMainScript.R
. Cela commence un nouveau non-interactif de recherche de session et exécute le scriptmyMainScript.R
. L'extrait de code donné à l'étape 1, qui a été placé au sommet demyMainScript.R
définit l'option de gestion d'erreur pour les non-interactif de recherche de session.myMainScript.R
. Cela peut être dans le script principal, lui-même, imbriquée ou plusieurs fonctions de profondeur. Lorsque l'erreur est rencontrée, la manipulation sera effectué comme indiqué dans l'étape 1, et la R de la session va se terminer.errorDump.rda
et et journal des erreurs nomméerror.log
sont créés dans le répertoire spécifié par'~/myUsername/directoryForDump'
dans le système mondial de gestion des erreurs à l'option de réglage.À votre guise, inspecter
error.log
pour consulter les informations sur l'erreur, notamment le message d'erreur lui-même et le full stack trace menant à l'erreur. Voici un exemple de journal qui est générée en cas d'erreur, notez les numéros après le#
caractère sont les numéros de ligne de l'erreur à différents points dans la pile d'appel:À votre guise, vous pouvez charger
errorDump.rda
interactive R session à l'aide deload('~/path/to/errorDump.rda')
. Une fois chargé, l'appeldebugger(errorDump)
pour parcourir l'ensemble de la R les objets en mémoire dans l'un des environnements actifs. Voir la R de l'aide surdebugger()
pour plus d'info.Ce flux de travail est très utile lors de l'exécution de la R dans un certain type d'environnement de production où vous avez non-interactif de recherche de séances d'être initiés à la ligne de commande et que vous souhaitez des informations conservées sur des erreurs inattendues. La possibilité de vider la mémoire dans un fichier que vous pouvez utiliser pour inspecter la mémoire de travail au moment de l'erreur, ainsi que d'avoir les numéros de ligne de l'erreur dans la pile d'appel, faciliter la rapidité des débogage post-mortem de ce qui a causé l'erreur.
D'abord,
options(show.error.locations = TRUE)
et puistraceback()
. L'erreur numéro de ligne sera affiché après #