Sie können traceback()
verwenden, um zu lokalisieren, wo der letzte Fehler aufgetreten ist. In der Regel wird es Sie auf einen Anruf hinweisen, den Sie in Ihrer Funktion tätigen. Dann setze ich normalerweise browser()
an diesem Punkt, führen Sie die Funktion erneut aus und sehen Sie, was falsch läuft.
Zum Beispiel sind hier zwei Funktionen:
f2 <- function(x)
{
if (x==1) "foo"
}
f <- function(x)
{
f2(x)
}
Beachten Sie, dass f2()
ein Argument der Länge 1
annimmt. Wir können f
mißbrauchen:
> f(NULL)
Error in if (x == 1) "foo" : argument is of length zero
Jetzt sind wir traceback()
verwenden können, um zu lokalisieren, was schief gelaufen ist:
> traceback()
2: f2(x) at #3
1: f(NULL)
Die Zahl bedeutet, wie tief wir in den verschachtelten Funktionen sind. So sehen wir, dass f
ruft f2
und das gibt einen Fehler bei der Leitung 3
. Ziemlich klar. Wir könnten f
mit browser
neu zuweisen, die gerade vor dem f2
Anruf jetzt gesetzt wird, um seinen Eingang zu überprüfen. browser()
ermöglicht Ihnen einfach, die Ausführung einer Funktion zu stoppen und sich in ihrer Umgebung umzusehen. Ähnlich wie debug
und debugonce
mit der Ausnahme, dass Sie nicht jede Zeile bis zu dem Punkt ausführen müssen, von dem Sie wissen, dass etwas schief geht.
Ich finde den einfachsten Weg zu debuggen ist, Schritt für Schritt durch den Code zu gehen. Wenn Ihr Fehler von einer Funktion kommt, die Sie geschrieben haben, können Sie ihn mit 'debugonce (Funktionsname)' debuggen. Dadurch erhalten Sie eine Mini-R-Sitzung im Rahmen der Funktion. – Justin
Das habe ich gemacht, aber ich habe das Gefühl, dass ich zu viel Zeit mit etwas verbringe, das automatisiert werden könnte. – Tim