Debugging unexpected errors in R -- how can I find where the error occurred?
Just to add to what @SachaEpskamp has already suggested, setting options(error=recover)
and options(show.error.locations=TRUE)
can be extremely helpful when debugging unfamiliar code. The first causes R to launch a debugging session on error, giving you the option to invoke the browser at any point in the call stack up to that error. The second option will tell R to include the source line number in the error.
You can use traceback()
to locate where the last error occurred. Usually it will point you to a call you make in your function. Then I typically put browser()
at that point, run the function again and see what is going wrong.
For example, here are two functions:
f2 <- function(x)
{
if (x==1) "foo"
}
f <- function(x)
{
f2(x)
}
Note that f2()
assumes an argument of length 1
. We can misuse f
:
> f(NULL)
Error in if (x == 1) "foo" : argument is of length zero
Now we can use traceback()
to locate what went wrong:
> traceback()
2: f2(x) at #3
1: f(NULL)
The number means how deep we are in the nested functions. So we see that f
calls f2
and that gives an error at line 3
. Pretty clear. We could reassign f
with browser
placed just before the f2
call now to check it's input. browser()
simply allows you to stop executing a function and look around in its environment. Similar to debug
and debugonce
except that you don't have to execute every line up until the point you know something goes wrong.