Отладка скриптов в R

Отладка - одна из важнейших вещей в программировании, без которой, увы, обойтись крайне сложно. Если вы пишете сколько-нибудь сложные скрипты для R, то наверняка сталкивались с необходимостью отлаживать свой код или изучать чужой. Какие же возможности есть в R для отладки скриптов?

traceback() – показывает стек вызова

 

use tryCatch() to hold exceptions

 

debug()  - debug a function. Next step by <ENTER>, see the values of variables by typing their names. Typing 'c' or 'cont'- continue to the end of the function (or loop if within a loop).’n’ – показывает код, который сейчас будет выполнен

undebug()

 

browser() - analog breakpoint. Вставляется в коде функции. Interrupt the execution of an expression and allow the inspection of the environment where browser() was called from. Но: лучше не вставлять вручную это, поттому что потом долго убирать и т.д. Вместо этого лучше указывать options(error=recover) будем всегда переходит в режим отладчика при любой ошибке.

 

recover() – более мощная вещь чем browser т.к. позволяет работать со вложенными вызовами функций. Лучше всегда включать путем указания опции error, но можно и вручную.

 

cat() - analog of format() in C; ex: print(cat("iter=",iter,"\n"))

 

options(error=recover) – позволяет при ошибке смотреть post-mortem состояние, переходит в режим отладки. Эту опцию лучше всегда включать по умолчанию

или

options(error = dump.frames)  - will save all the data in the calls that were active when an error occurred. Но error=recover лучше, т.к. можно всегда самому сохранить

 

debugger() – post-mortem debugging

>dump.frames(dumpto = "last.dump", to.file = FALSE)
>debugger(dump = last.dump)

 

trace() - allows you to insert debugging code (e.g., a call to browser or recover) at chosen places in any function. Аргумент edit – позволяет отредактировать код функции и вставить в нужных местах browser() и т.д. Edited version takes the place of the original либо до конца сессии, либо до untrace(). Похоже на fix() с именем функции. Полезная штука! Аргумент signature позволяет указывать класс объектов. Ex:

  >trace(show, exit = browser, signature = "gpsPath")

будет трассировать show для объектов класса gpsPath

Другое использование – смотреть на те R-функции, которые вызывают внешний Fortran-код:

> trace(.Fortran, recover).

Теперь любая функция использующая Fortran будет отслежена (NB: используем recover вместо browser, т.е. нужно смотреть на разных уровнях вызова)

 

TODO

http://www.cims.nyu.edu/cgi-systems/info2html?(R-exts.info.gz)Debugging%2520R%2520code

посмотреть An Introduction to the Interactive Debugging Tools in R

Добавить комментарий


Защитный код
Обновить