ggtitle - traceback() para sesiones R interactivas y no interactivas
plot title r (2)
Observé una sesión de R interactiva y no interactiva sobre traceback()
que no entiendo. Para el código a continuación, producirá un error, pero en una sesión interactiva de R, puedo ver la información de rastreo, mientras que si test.R
el código para test.R
y lo llamo a través de Rscript test.R
o R -f test.R
, Ya no puedo ver el rastro:
f = function() {
on.exit(traceback())
1 + ''a''
}
f()
En una sesión interactiva de R:
> f = function() {
+ on.exit(traceback())
+ 1 + ''a''
+ }
> f()
Error in 1 + "a" : non-numeric argument to binary operator
1: f()
Ejecución no interactiva:
$ Rscript test.R
Error in 1 + "a" : non-numeric argument to binary operator
Calls: f
No traceback available
Execution halted
No vi una explicación en ?traceback
, y me pregunto si hay una manera de habilitar el rastreo para sesiones R no interactivas. ¡Gracias!
Con los valores predeterminados de sus argumentos, traceback()
buscará un objeto llamado .Traceback
en el baseenv()
para obtener información sobre la pila de llamadas. Parece (desde src/main/errors.c
) que .Traceback
solo se crea si, entre otras condiciones, R_Interactive || haveHandler
R_Interactive || haveHandler
, sugiriendo que este objeto no se crea durante las sesiones no interactivas. Si no hay ningún objeto llamado .Traceback
, aparecerá el mensaje "No hay un rastreo disponible".
Sin embargo, al pasar un valor no NULL al argumento x
de traceback()
, se puede obtener información sobre la pila de llamadas desde una sesión no interactiva. Con un valor entero distinto de cero (que indica el número de llamadas a omitir en la pila), se llama a las funciones de nivel c ( R_GetTraceback
) para investigar la pila de llamadas en lugar de buscar en .Traceback
.
Así que hay un par de formas de obtener información de rastreo en una sesión no interactiva:
f = function() {
on.exit(traceback(1))
1 + ''a''
}
f()
O bien, configurando options
como Brandon Bertelsen sugirió
options(error=function()traceback(2))
Los diferentes valores pasados a x
en los dos ejemplos explican la cantidad diferente de funciones que se deben omitir
En el ejemplo
on.exit
,traceback(1)
salta la llamada atraceback()
.En las
options
configuración de ejemplo, hay una función anónima adicional que llama atraceback()
que debería / también podría ser omitida.
En el ejemplo en el OP, no hay mucha más información obtenida mediante el uso de traceback()
comparación con el rastreo automático proporcionado en el caso de un error en una sesión no interactiva. Sin embargo, con las funciones que toman (y se pasan) argumentos, el uso de traceback()
será mucho más informativo que la presentación estándar de la pila de llamadas en la sesión no interactiva.
También existe la posibilidad de volcar información de depuración y cargarla más adelante. (Ver buenas ?debugger
Páginas de ayuda del ?debugger
y comentarios sobre el tema)
a través de, por ejemplo:
options(error = quote(dump.frames("testdump", TRUE)))
...
load("testdump.rda")
debugger(testdump)
o
options(error = quote({dump.frames(to.file = TRUE); q(status = 1)}))