Search code examples
rerror-handlingr-faq

Debugging unexpected errors in R -- how can I find where the error occurred?


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.


Solution

  • 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.