traceback() for interactive and non-interactive R sessions

r, traceback

Solution

With default values of its arguments, `traceback()` will look for an object named `.Traceback` in the `baseenv()` for information on the call stack. It looks (from `src/main/errors.c`) like `.Traceback` is only created if, among other conditions, `R_Interactive || haveHandler`, suggesting that this object is not created during non-interactive sessions. If there is no object named `.Traceback`, you will get the message "No traceback available".

However, by passing a non-NULL value to the `x` argument of `traceback()`, one can obtain information about the call stack from a non-interactive session. With a non-zero integer value (indicating the number of calls to skip in the stack), c-level functions (`R_GetTraceback`) are called to investigate the call stack instead of looking in `.Traceback`.

So there are a couple ways to obtain traceback information in a non-interactive session:

f = function() {
  on.exit(traceback(1))
  1 + 'a'
}
f()

Or, setting `options` as Brandon Bertelsen suggested

options(error=function()traceback(2))

The different values passed to `x` in the two examples account for the different number of functions to skip

In the `on.exit` example, `traceback(1)` skips the call to `traceback()`.

In the example setting `options`, there is an extra anonymous function that calls `traceback()` which should/could also be skipped.

In the example in the OP, there's not much more information gained by using `traceback()` compared to the automatic traceback provided in the case of an error in a non-interactive session. However, with functions that take (and are passed) arguments, using `traceback()` will be much more informative than the standard presentation of the call stack in the non-interactive session.

Problem

I observed a different between an interactive and non-interaction R session about `traceback()` which I do not understand. For the code below, it will produce an error, but in an interactive R session, I can see the traceback information, whereas if I save the code to `test.R` and call it via `Rscript test.R` or `R -f test.R`, I can no longer see the traceback: ``` f = function() { on.exit(traceback()) 1 + 'a' } f() ``` In an interactive R session: ``` > f = function() { + on.exit(traceback()) + 1 + 'a' + } > f() Error in 1 + "a" : non-numeric argument to binary operator 1: f() ``` Non-interactive execution: ``` $ Rscript test.R Error in 1 + "a" : non-numeric argument to binary operator Calls: f No traceback available Execution halted ``` I did not see an explanation in `?traceback`, and I'm wondering if there is a way to enable traceback for non-interactive R sessions. Thanks!

Original source