Sometimes R throws me errors such as
Error in if (ncol(x) != 2) { : argument is of length zero
with no additional information, when I've written no such code. Is there a general way for finding which function in which package causes an error?
Since most packages come compressed, it isn't trivial to grep /usr/lib/R/library
.
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.