Si j'exécute un long script R à partir de la ligne de commande (R --slave script.R), comment puis-je lui faire donner des numéros de ligne en cas d'erreurs?
Je ne veux pas ajouter de commandes de débogage au script si possible - je veux juste que R se comporte comme la plupart des autres langages de script ...
Réponses:
Cela ne vous donnera pas le numéro de ligne, mais cela vous dira où l'échec se produit dans la pile d'appels, ce qui est très utile:
[Edit:] Lors de l'exécution d'un script à partir de la ligne de commande, vous devrez sauter un ou deux appels, voir traceback () pour les sessions R interactives et non interactives
Je ne connais pas d'autre moyen de le faire sans les suspects de débogage habituels:
Vous voudrez peut-être consulter cet article lié
[Edit:] Désolé ... je viens de voir que vous exécutez ceci à partir de la ligne de commande. Dans ce cas, je suggérerais de travailler avec la fonctionnalité d'options (erreur). Voici un exemple simple:
Vous pouvez créer un script aussi élaboré que vous le souhaitez en cas d'erreur, vous devez donc simplement décider des informations dont vous avez besoin pour le débogage.
Sinon, s'il y a des domaines spécifiques qui vous préoccupent (par exemple la connexion à une base de données), enveloppez-les dans une fonction tryCatch ().
la source
options(error=function() { traceback(2); if(!interactive()) quit("no", status = 1, runLast = FALSE) })
(voir commentaire de la réponse acceptée). Je pense qu'il serait logique de l'ajouter à la réponse ici plutôt que de fournir uniquement un lien vers un autre fil.Faire
options(error=traceback)
fournit un peu plus d'informations sur le contenu des lignes menant à l'erreur. Il provoque l'apparition d'une trace en cas d'erreur et pour certaines erreurs, le numéro de ligne est précédé du préfixe#
. Mais c'est aléatoire, de nombreuses erreurs n'obtiendront pas de numéros de ligne.la source
No traceback available
après l'erreur.Le support pour cela sera disponible dans R 2.10 et versions ultérieures. Duncan Murdoch vient de poster sur r-devel le 10 septembre 2009 à propos de findLineNum et setBreapoint :
la source
Vous le faites en définissant
Je me demande simplement pourquoi ce paramètre n'est pas une valeur par défaut dans R? Cela devrait être, comme dans toutes les autres langues.
la source
La spécification de l'option R globale pour la gestion des erreurs non catastrophiques a fonctionné pour moi, ainsi qu'un flux de travail personnalisé pour conserver les informations sur l'erreur et examiner ces informations après l'échec. J'utilise actuellement la version 3.4.1 de R. Ci-dessous, j'ai inclus une description du flux de travail qui a fonctionné pour moi, ainsi que du code que j'ai utilisé pour définir l'option de gestion d'erreur globale dans R.
Comme je l'ai configuré, la gestion des erreurs crée également un fichier RData contenant tous les objets de la mémoire de travail au moment de l'erreur. Cette sauvegarde peut être relue dans R en utilisant
load()
, puis les différents environnements tels qu'ils existaient au moment de l'erreur peuvent être inspectés de manière interactive à l'aide dedebugger(errorDump)
.Je noterai que j'ai pu obtenir des numéros de ligne dans la
traceback()
sortie de toutes les fonctions personnalisées de la pile, mais uniquement si j'ai utilisé l'keep.source=TRUE
option lors de l'appelsource()
de toutes les fonctions personnalisées utilisées dans mon script. Sans cette option, la définition de l'option de gestion globale des erreurs comme ci-dessous a envoyé la sortie complète dutraceback()
à un journal d'erreurs nomméerror.log
, mais les numéros de ligne n'étaient pas disponibles.Voici les étapes générales que j'ai suivies dans mon flux de travail et comment j'ai pu accéder au vidage de la mémoire et au journal des erreurs après un échec R non interactif.
J'ai mis ce qui suit en haut du script principal que j'appelais depuis la ligne de commande. Cela définit l'option globale de gestion des erreurs pour la session R. Mon script principal a été appelé
myMainScript.R
. Les différentes lignes du code sont suivies de commentaires décrivant ce qu'elles font. Fondamentalement, avec cette option, lorsque R rencontre une erreur qui se déclenchestop()
, il crée un fichier de vidage RData (* .rda) de la mémoire de travail dans tous les environnements actifs du répertoire~/myUsername/directoryForDump
et écrira également un journal d'erreurs nomméerror.log
avec des informations utiles dans le même répertoire. Vous pouvez modifier cet extrait de code pour ajouter une autre gestion en cas d'erreur (par exemple, ajouter un horodatage au fichier de vidage et les noms de fichiers du journal des erreurs, etc.).Assurez-vous qu'à partir du script principal et des appels de fonction ultérieurs, à chaque fois qu'une fonction est générée, l'option
keep.source=TRUE
est utilisée. Autrement dit, pour rechercher une fonction, vous utiliseriezsource('~/path/to/myFunction.R', keep.source=TRUE)
. Ceci est nécessaire pour que latraceback()
sortie contienne des numéros de ligne. Il semble que vous puissiez également définir cette option globalement en utilisantoptions( keep.source=TRUE )
, mais je n'ai pas testé cela pour voir si cela fonctionne. Si vous n'avez pas besoin de numéros de ligne, vous pouvez omettre cette option.Rscript myMainScript.R
. Cela démarre une nouvelle session R non interactive et exécute le scriptmyMainScript.R
. L'extrait de code donné à l'étape 1 qui a été placé en haut demyMainScript.R
définit l'option de gestion des erreurs pour la session R non interactive.myMainScript.R
. Cela peut être dans le script principal lui-même ou imbriqué plusieurs fonctions en profondeur. Lorsque l'erreur est rencontrée, la gestion sera effectuée comme spécifié à l'étape 1 et la session R se terminera.errorDump.rda
et et le journal des erreurs nomméerror.log
sont créés dans le répertoire spécifié par'~/myUsername/directoryForDump'
dans le paramètre de l'option de gestion des erreurs globale.À votre guise, inspectez
error.log
pour examiner les informations sur l'erreur, y compris le message d'erreur lui-même et la trace de pile complète menant à l'erreur. Voici un exemple du journal généré en cas d'erreur; notez que les numéros après le#
caractère sont les numéros de ligne de l'erreur à différents points de la pile d'appels:À votre guise, vous pouvez charger
errorDump.rda
dans une session R interactive en utilisantload('~/path/to/errorDump.rda')
. Une fois chargé, appelezdebugger(errorDump)
pour parcourir tous les objets R en mémoire dans l'un des environnements actifs. Voir l'aide R surdebugger()
pour plus d'informations.Ce flux de travail est extrêmement utile lors de l'exécution de R dans un certain type d'environnement de production où des sessions R non interactives sont lancées sur la ligne de commande et que vous souhaitez conserver des informations sur les 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 les numéros de ligne de l'erreur dans la pile d'appels, facilitent le débogage post-mortem rapide de la cause de l'erreur.
la source
D'abord,
options(show.error.locations = TRUE)
et ensuitetraceback()
. Le numéro de la ligne d'erreur sera affiché après #la source