manipulation ggtitle ggplot change r traceback

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

  1. En el ejemplo on.exit , traceback(1) salta la llamada a traceback() .

  2. En las options configuración de ejemplo, hay una función anónima adicional que llama a traceback() 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)}))