{"id":11557,"date":"2017-10-18T10:42:05","date_gmt":"2017-10-18T08:42:05","guid":{"rendered":"https:\/\/www.statworx.com\/?p=11557"},"modified":"2022-07-11T17:02:55","modified_gmt":"2022-07-11T15:02:55","slug":"fehlerbehandlung-in-r-debugging-mit-rstudio","status":"publish","type":"post","link":"https:\/\/www.statworx.com\/content-hub\/blog\/fehlerbehandlung-in-r-debugging-mit-rstudio\/","title":{"rendered":"Fehlerbehandlung in R: Debugging mit RStudio"},"content":{"rendered":"
In der Blog-Reihe \u201eFehlerbehandlung in R\u201c geht es um effizientes und systematisches \u00dcberpr\u00fcfen von R-Code. Den Beginn macht das Finden von Fehlern durch Debugging, weiter geht es mit der Handhabung von Fehlern und endet mit Unit-Testing, das zum \u00dcberpr\u00fcfen von korrekter Funktionalit\u00e4t von R-Code dient.
\nDie Reihe startet mit Debugging in R, wobei Debugging ein breitgef\u00e4chertes Thema ist. Dieser Artikel fokussiert sich daher auf die M\u00f6glichkeiten, die RStudio bietet.<\/p>\n
Debugging hilft dabei herauszufinden an welcher Stelle im Code sich ein Fehler befindet oder an welcher Stelle der Code sich anders verh\u00e4lt als erwartet. Dies beinhaltet im Generellen drei Schritte:<\/p>\n
Um in den Debugging-Modus zu kommen, muss RStudio mitgeteilt werden, wann es die Berechnungen stoppen soll. Es gibt keinen \u201ePause-Button\u201c mit welchem man eine laufende Berechnung stoppen kann um in den Debugging-Modus einzutreten. Dies ist in so gut wie allen anderen Programmiersprachen der Fall, da die Berechnungen in der Regel zu schnell von statten gehen als dass es m\u00f6glich w\u00e4re an der richtigen Stelle zu stoppen. Stattdessen bestimmt man zuvor an welcher Stelle der Code angehalten werden soll. Dies ist nicht zu verwechseln mit dem „Stop“-Button \u00fcber der der Konsole, welcher die Berechnung komplett abbricht.<\/p>\n
Der einfachste und meist genutzte Weg um in den Debugging-Modus zu gelangen, ist es einen Breakpoint im Code-Editor zu setzen. Dies kann auf einfache Weise in RStudio gemacht werden indem man links neben die Zeilennummer klickt oder durch das Dr\u00fccken von Shift+F9 auf der Tastatur und zeitgleiches Klicken mit der Maus in der gew\u00fcnschten Zeile.<\/p>\n
<\/p>\n
Hierbei wird eine Tracing-Funktion innerhalb der eigentlichen Funktion eingef\u00fcgt. Der Breakpoint wird durch einen ausgef\u00fcllten roten Kreis im Editor gekennzeichnet. Au\u00dferdem kann man einen schnellen \u00dcberblick erlangen in welcher Funktion sich ein Breakpoint befindet, indem man in das Environment-Fenster schaut, welche Funktion ebenfalls durch einen roten Kreis gekennzeichnet wird.<\/p>\n
Falls die Funktion noch nicht existiert, zu einem weil man das File noch nicht gesourced hat oder zu anderem weil sich die Funktion im Environment und im Editor unterscheiden, kann der Breakpoint noch nicht aktiviert werden. Dies wird durch einen nicht-ausgef\u00fcllten Kreis kenntlich gemacht.<\/p>\n
<\/p>\n
In der Regel hilft es das File einmal zu sourcen, wodurch die Tracking-Funktion eingef\u00fcgt wird und der Breakpoint startbereit ist.<\/p>\n
Setzt man den Breakpoint per RStudio-Editor ist es nicht notwendig die Funktion zu bearbeiten und zus\u00e4tzlichen Code per Hand einzuf\u00fcgen. Allerdings gibt es bestimmte Situationen in denen diese Breakpoints nicht funktionieren wie beispielsweise komplexere Funktionssyntaxen. Au\u00dferdem wird konditionelles Debugging bisher nicht von RStudio unterst\u00fctzt. Hier schafft die Der Editor-Breakpoint oder Die dritte M\u00f6glichkeit in den Debugging-Modus zu gelangen ist die Einstellung, dass der Debugger jedes Mal automatisch aktiviert wird, wenn ein Fehler auftaucht. Dadurch stoppt die Funktion automatisch und der Debugging-Modus startet direkt von selbst. Diese Funktionalit\u00e4t wird \u00fcber die RStudio Oberfl\u00e4che aktiviert in dem man Debug -> On Error von \u201eError Inspector\u201c zu \u201eBreak in Code\u201c \u00e4ndert.<\/p>\n <\/p>\n Allerdings wird der Debugger per Default nur aktiviert, wenn ein Fehler im eigenen Code auftaucht. Falls man einen Fehler finden m\u00f6chte, welcher ebenfalls Code von Dritten beinhaltet, kann diese Einstellung unter Tools -> Global Options und dem abw\u00e4hlen von \u201eUse debug error handler only when my code contains errors\u201c abge\u00e4ndert werden. Alternativ kann die Option dauerhaft mit Der n\u00e4chste Teil der Reihe \u201eFehlerbehandlung in R\u201c dreht sich um effektives Debugging in R nachdem der Debugger aktiviert wurde. browser()<\/code>-Funktion Abhilfe. Da es sich hierbei um eine tats\u00e4chliche Funktion handelt, muss sie in den Code geschrieben werden, kann aber an so gut wie jeder Stelle hinzugef\u00fcgt werden. Sind sie erstmal aktiv und aufgerufen verhalten sich die Editor-Breakpoins und
browser()<\/code> sehr \u00e4hnlich.<\/p>\n
Stoppen bevor eine Funktion ausgef\u00fchrt wird<\/h3>\n
browser()<\/code> eigenen sich optimal f\u00fcr Funktionen f\u00fcr welche der Source-Code vorliegt. Hat man jedoch nicht das .R File zur Hand kann alternativ eine ganze Funktion mit
debug()<\/code> bzw.
debugonce()<\/code> gedebugged werden. Hierf\u00fcr wird die jeweilige Funktion innerhalb von
debug()<\/code> bzw.
debugonce()<\/code> geschrieben , beispielsweise
debugonce(mean)<\/code> . Dies \u00e4ndert nicht die Funktion an sich, aber es startet den Debugger direkt nach dem Funktionsaufruf, man kann es sich vorstellen als w\u00fcrde man einen Breakpoint direkt zu Beginn der Funktion setzen w\u00fcrde.
debugonce()<\/code> aktiviert den Debug-Modus nur ein einziges Mal f\u00fcr die jeweilige Funktion zum n\u00e4chstm\u00f6glichen Zeitpunkt zu welchem diese aufgerufen wird.
debug()<\/code> hingegen aktiviert jedes Mal den Debugger, wenn die Funktion aufgerufen wird, was schlimmsten Falls in einer endlosen Schleife resultieren kann. Daher ist es in der Regel zu empfehlen
debugonce()<\/code> zu benutzen. Das Gegenst\u00fcck zu
debug()<\/code> ist
undebug()<\/code>, welches benutzt wird wenn man nicht mehr jedes Mal die Funktion bei Aufruf debuggen m\u00f6chte.<\/p>\n
Bei Fehler stoppen<\/h3>\n
options(error = browser())<\/code> \u00fcberschrieben werden. Es kann jedoch schnell st\u00f6rend werden, dass jedes Mal der Debugger aktiviert wird. Daher sollte nicht vergessen werden diese Option wieder mit
options(error = NULL)<\/code> r\u00fcckg\u00e4ngig zu machen sobald das Debugging beendet ist.<\/p>\n