Si estoy ejecutando un script R largo desde la línea de comando (R --slave script.R), ¿cómo puedo hacer que dé números de línea en los errores?
No quiero agregar comandos de depuración al script si es posible, solo quiero que R se comporte como la mayoría de los otros lenguajes de script ...
Respuestas:
Esto no le dará el número de línea, pero le dirá dónde ocurre la falla en la pila de llamadas, lo cual es muy útil:
[Editar:] Al ejecutar un script desde la línea de comandos, tendrá que omitir una o dos llamadas, consulte traceback () para sesiones de R interactivas y no interactivas
No conozco otra forma de hacer esto sin los sospechosos de depuración habituales:
Es posible que desee ver esta publicación relacionada.
[Editar:] Lo siento ... acabo de ver que estás ejecutando esto desde la línea de comandos. En ese caso, sugeriría trabajar con la funcionalidad de opciones (error). He aquí un ejemplo sencillo:
Puede crear un script tan elaborado como desee en una condición de error, por lo que debe decidir qué información necesita para la depuración.
De lo contrario, si hay áreas específicas que le preocupan (por ejemplo, conectarse a una base de datos), envuélvalas en una función tryCatch ().
fuente
options(error=function() { traceback(2); if(!interactive()) quit("no", status = 1, runLast = FALSE) })
(ver comentario de respuesta aceptada). Creo que tendría sentido agregarlo a la respuesta aquí en lugar de solo proporcionar un enlace a otro hilo.Doing
options(error=traceback)
proporciona un poco más de información sobre el contenido de las líneas que conducen al error. Hace que aparezca un rastreo si hay un error, y para algunos errores tiene el número de línea precedido por#
. Pero es impredecible, muchos errores no obtienen números de línea.fuente
No traceback available
después del error.El soporte para esto estará disponible en R 2.10 y posteriores. Duncan Murdoch acaba de publicar en r-devel el 10 de septiembre de 2009 sobre findLineNum y setBreapoint :
fuente
Lo haces estableciendo
Me pregunto por qué esta configuración no es predeterminada en R. Debería serlo, como en cualquier otro idioma.
fuente
Especificar la opción R global para manejar errores no catastróficos funcionó para mí, junto con un flujo de trabajo personalizado para retener información sobre el error y examinar esta información después de la falla. Actualmente estoy ejecutando R versión 3.4.1. A continuación, incluí una descripción del flujo de trabajo que me funcionó, así como un código que usé para configurar la opción de manejo de errores global en R.
Como lo tengo configurado, el manejo de errores también crea un archivo RData que contiene todos los objetos en la memoria de trabajo en el momento del error. Este volcado se puede leer de nuevo en R usando
load()
y luego los diversos entornos tal como existían en el momento del error se pueden inspeccionar de forma interactiva usandodebugger(errorDump)
.Notaré que pude obtener números de línea en la
traceback()
salida de cualquier función personalizada dentro de la pila, pero solo si usé lakeep.source=TRUE
opción al llamarsource()
a las funciones personalizadas utilizadas en mi script. Sin esta opción, la configuración de la opción de manejo de errores globales como se muestra a continuación envió la salida completa detraceback()
a un registro de errores llamadoerror.log
, pero los números de línea no estaban disponibles.Estos son los pasos generales que tomé en mi flujo de trabajo y cómo pude acceder al volcado de memoria y al registro de errores después de una falla de R no interactiva.
Puse lo siguiente en la parte superior del script principal al que estaba llamando desde la línea de comandos. Esto establece la opción de manejo de errores global para la sesión R. Mi guión principal se llamó
myMainScript.R
. Las diversas líneas del código tienen comentarios después de ellas que describen lo que hacen. Básicamente, con esta opción, cuando R encuentra un error que se activastop()
, creará un archivo de volcado RData (* .rda) de la memoria de trabajo en todos los entornos activos en el directorio~/myUsername/directoryForDump
y también escribirá un registro de erroreserror.log
con información útil para el mismo directorio. Puede modificar este fragmento para agregar otro manejo en caso de error (por ejemplo, agregar una marca de tiempo al archivo de volcado y nombres de archivo de registro de errores, etc.).Asegúrese de que desde el script principal y cualquier llamada de función subsiguiente, siempre que se obtenga una función,
keep.source=TRUE
se utilice la opción . Es decir, para obtener una función, usaríasource('~/path/to/myFunction.R', keep.source=TRUE)
. Esto es necesario para que latraceback()
salida contenga números de línea. Parece que también puede configurar esta opción globalmente usandooptions( keep.source=TRUE )
, pero no lo he probado para ver si funciona. Si no necesita números de línea, puede omitir esta opción.Rscript myMainScript.R
. Esto inicia una nueva sesión de R no interactiva y ejecuta el scriptmyMainScript.R
. El fragmento de código proporcionado en el paso 1 que se colocó en la parte superior demyMainScript.R
establece la opción de manejo de errores para la sesión R no interactiva.myMainScript.R
. Esto puede estar en el propio script principal o anidar varias funciones en profundidad. Cuando se encuentra el error, el manejo se realizará como se especifica en el paso 1 y la sesión de R terminará.errorDump.rda
y un registro de errores denominadoerror.log
en el directorio especificado por'~/myUsername/directoryForDump'
en la configuración de la opción de manejo de errores globales.En su tiempo libre, inspeccione
error.log
para revisar la información sobre el error, incluido el mensaje de error y el seguimiento de la pila completa que condujo al error. Aquí hay un ejemplo del registro que se genera en caso de error; tenga en cuenta que los números después del#
carácter son los números de línea del error en varios puntos de la pila de llamadas:En su tiempo libre, puede cargar
errorDump.rda
en una sesión R interactiva usandoload('~/path/to/errorDump.rda')
. Una vez cargado, llamedebugger(errorDump)
para examinar todos los objetos R en la memoria en cualquiera de los entornos activos. Consulte la ayuda de Rdebugger()
para obtener más información.Este flujo de trabajo es enormemente útil cuando se ejecuta R en algún tipo de entorno de producción en el que se inician sesiones de R no interactivas en la línea de comandos y desea que se conserve información sobre errores inesperados. La capacidad de volcar la memoria en un archivo que puede usar para inspeccionar la memoria de trabajo en el momento del error, junto con tener los números de línea del error en la pila de llamadas, facilita la depuración post mortem rápida de lo que causó el error.
fuente
Primero
options(show.error.locations = TRUE)
y luegotraceback()
. El número de línea de error se mostrará después de #fuente