Debugging in R

Um Fehler in R-Funktionen und Skripten zu diagnostizieren und aufzufinden, stellt R unter anderem die Funktion debug() zur Verfügung, die wie im folgenden Beispiel angewendet werden kann:

Nach Ausführen der Zeilen 8 und 9 gelangt man in der Konsole  in den Browser-Modus, welcher mittels der folgenden Befehle die schrittweise Ausführung der Funktion ermöglicht.

Der Debug-Browser lässt sich zudem an beliebiger Stelle im Skript durch die Funktion browser()aufrufen.

Visual debugging mit StatET (Eclipse) & RStudio

R-Entwicklungsumgebungen wie StatET oder seit der aktuellen preview Version 0.98 auch RStudio bieten darüber hinaus einen visual debug Modus, durch den zusätzliche Funktionalitäten zur Fehlerdiagnose bereit gestellt werden.

BREAKPOINTS

Alternativ zu dem zuvor beschriebenen Vorgehen, kann der Debug Modus in beiden IDE’s durch setzen eines Breakpoints im Scource-Skript angesprochen werden. Durch Klicken auf die Zeilennummer, lassen sich breakpoints innerhalb von Funktionen oder top-level Breakpoints an beliebiger Stelle im Skript setzen, die zum Beispiel ausgelöst werden, wenn das Skript mittels der source() Funktion ausgeführt wird.

Hierbei ist zu beachten, dass das Skript zunächst „gesourced“ werden muss, damit die Breakpoints aktiv sind. Die StatET Konsole muss zudem im Debug-Modus gestartet werden.

Debugger

Durch Erreichen eines Breakpoints oder einer entsprechenden R-Funktion wird der Debug-Modus automatisch gestartet. Dieser weist in beiden Entwicklungsumgebungen vergleichbare Funktionalitäten auf.

Konsole (1)

Startet man den visual debugger unter RStudio, erscheint innerhalb der Konsole eine zusätzliche Schaltfläche, welche Buttons zur Navigation im Debug-Modus bereit stellt. Diese entsprechen den R-Befehle n,c und Q, die man auch in StatET nutzt.

Scource-Skript (2)

Der Ausdruck der im nächsten Schritt (n) ausgewertet wird, wird hervorgehoben.

Environment (3)

Entsprechend der Anzeige des .GlobalEnv bei inaktivem Debug-Modus, werden in dem Tab Environment beziehungsweise Variables in StatET, die Objekte und ihre Werte, die ausschließlich innerhalb der derzeit Ausgeführten Funktion sichtbaren  sind, angezeigt (hier bar()).

Traceback (4)

Im Debug-Modus wird ein zusätzlicher Tab Traceback geöffnet. Hier werden alle derzeit aktiven Funktionen aufgelistet, analog zu dem Browser Befehl where. Darüber hinaus, wird die Funktion welche aktuell diagnostiziert wird hervorgehoben und durch klicken auf eine der Funktionen im Stack, wird das entsprechende Environment angezeigt.

Bedingte Breakpoints

StatET bietet zudem einen weiteren Tab Breakpoints, über den zusätzliche Breakpoint-Optionen gesetzt werden können.

Neben dem deaktivieren/aktivieren einzelner oder aller Breakpoints, lassen sich beliebige R-Expressions als Bedingung für das Auslösen eines Breakpoints definieren. Liefert die Bedingung einen Wahrheitswert (TRUE / FALSE), wird der entsprechende Punkt aktiviert, beziehungsweise übersprungen.

Möchte man mit RStudio bedingte Breakpoints setzen, lässt sich dies derzeit nur direkt über die R-Funktionen browser(expr),beziehungsweise  if(expr) debugonce(fun)für top-level Breakpoints realisieren:

Fazit

R verfügt durch die debugging Funktionen über gute Möglichkeiten R-Skripte zu Diagnostizieren. Durch die Integration in einen visual Debugger, wird dieser Prozess zusätzlich wesentlich erleichtert. Vor allem das Hervorheben des aktuell ausgeführten Ausdrucks und die Anzeige des zugehörigen workspaces helfen dabei, Fehler leichter zu identifizieren und den Code besser zu verstehen. Mit der neusten Version hat nun auch RStudio einen visual debugger in seine Entwicklungsumgebung integriert, der bereits in der Preview Version ein beinahe gleichwertiges  Tool zu dem seit längerem bewährten Eclipse/StatET Debugger ist.

Das Thema Debugging wird auch im Kurs „Programmieren mit R“ im Rahmen der Data Science Trainings behandelt. Mehr Informationen?

Hier entlang.