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)
