I get an error when using an R function that I wrote:
Warning messages: 1: glm.fit: algorithm did not converge 2: glm.fit: algorithm did not converge
What I have done:
glm.fit
. They are window()
and save()
.My general approaches include adding print
and stop
commands, and stepping through a function line by line until I can locate the exception.
However, it is not clear to me using those techniques where this error comes from in the code. I am not even certain which functions within the code depend on glm.fit
. How do I go about diagnosing this problem?
The most common (and easiest) way to stop on a line of code is to set a breakpoint on that line. You can do this in RStudio by clicking to the left of the line number in the editor, or by pressing Shift+F9 with your cursor on the desired line. We call this an “editor breakpoint”.
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. The number means how deep we are in the nested functions.
c to leave the debug mode and continue with the regular execution of the function. Q to stop debug mode, terminate the function, and return to the R prompt.
I'd say that debugging is an art form, so there's no clear silver bullet. There are good strategies for debugging in any language, and they apply here too (e.g. read this nice article). For instance, the first thing is to reproduce the problem...if you can't do that, then you need to get more information (e.g. with logging). Once you can reproduce it, you need to reduce it down to the source.
Rather than a "trick", I would say that I have a favorite debugging routine:
traceback()
: that shows you where the error occurred, which is especially useful if you have several nested functions.options(error=recover)
; this immediately switches into browser mode where the error occurs, so you can browse the workspace from there.debug()
function and step through the script line by line. The best new trick in R 2.10 (when working with script files) is to use the findLineNum()
and setBreakpoint()
functions.
As a final comment: depending upon the error, it is also very helpful to set try()
or tryCatch()
statements around external function calls (especially when dealing with S4 classes). That will sometimes provide even more information, and it also gives you more control over how errors are handled at run time.
These related questions have a lot of suggestions:
The best walkthrough I've seen so far is:
http://www.biostat.jhsph.edu/%7Erpeng/docs/R-debug-tools.pdf
Anybody agree/disagree?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With