R Programming/Debugging
Some basic tips
[edit | edit source]- Use
print()statements in your functions to print variable values. Although this technique is considered low-tech or even old fashioned by some, it can still be a quick and easy way to trace an error. - Place a
browser()statement in the function just before the crashing line. When the function is called, it will be executed up to thebrowser()line. The command-line interface then switches to the function environment, so that all variables in the function can be inspected or changed. See below for commands available inbrowser()mode.
Tracing errors with traceback()
[edit | edit source]A standard error message in R will tell you which function threw the error. Consider as an example the following function whose sole purpose is to throw an error.
myFun <- function(){ stop("Woops! An error") } A call to myFun() gives
> myFun() Error in myFun() : Woops! An error After an error is raised, the traceback() function allows you to show the call stack leading to the error. For example, the function below calls myFun.
myFun2 <- function(){ myFun() } Calling myFun2() and traceback() gives
> myFun2() Error in myFun() : Woops! An error > traceback() 3: stop("Woops! An error") 2: myFun() 1: myFun2() The traceback() function can be executed automatically each time an error is raised with the option
options(error=traceback) It may be switched off again with
options(error=NULL) Executing code line by line
[edit | edit source]A function can be executed by setting it to debugging mode with
debug(FUNCTION_NAME) .
Then, when the function is called, and a browser in that function's environment is opened so that it can be executed line by line. In the debugging browser, apart from all standard R functionality, the following commands are available.
| Command | Meaning |
|---|---|
n | Advance to next step. An empty line also works. |
c, cont | Continue to the end of the current context. E.g. to the end the loop within a loop or to the end of the function. |
where | Print the stack of function calls (where are you?) |
Q | Exit the browser and return to the top-level R prompt. |
Debugging can be switched off with
undebug(FUNCTION_NAME) There are a few related functions as well:
debugonce()Switch off debugging after the first call.isdebugged()Check if a function is in degugging mode.
Browsing the call stack
[edit | edit source]This is the most advanced debugging option in R base. By setting options(error=recover) you get the opportunity to browse any environment in the call stack. For example,
> options(error=recover) > myFun2() Error in myFun() : Woops! An error Enter a frame number, or 0 to exit 1: myFun2() 2: myFun() Selection: By typing '1' or '2' behind Selection: the browser will jump to the selected environment. Once in the browser, all standard R functionality is at your disposal, as well as the commands in the table below.
| Command | Meaning |
|---|---|
c, cont | Exit the browser and continue at the next statement. An empty line will do the same. |
n | Enter the step-through debugger (this changes the meaning of c) |
where | Print a stack trace of active function calls (where are you in the stack?). |
Q | Exit the browser, do not continue at the next statement but go back to the top-level R browser. |
Recovery mode can be switched off by
options(error=NULL) 