2012-11-19 7 views
12

Manchmal R wirft mir Fehler wieWie finde ich einen R-Fehler?

Fehler if (ncol (x) = 2!) {: Argument der Länge Null

ohne zusätzliche Informationen, wenn ich geschrieben habe kein solcher Code. Gibt es eine allgemeine Möglichkeit zu finden, welche Funktion in welchem ​​Paket einen Fehler verursacht?

Da die meisten Pakete komprimiert sind, ist es nicht trivial, /usr/lib/R/library zu grep.

+0

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

+0

Das habe ich gemacht, aber ich habe das Gefühl, dass ich zu viel Zeit mit etwas verbringe, das automatisiert werden könnte. – Tim

Antwort

17

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.

+0

Nitpick: Es ist nicht "f2", wenn das Argument eine Länge> 0 hat, es ist die 'if'-Anweisung. – naught101

16

Nur um hinzuzufügen, was @SachaEpskamp bereits vorgeschlagen hat, kann die Einstellung options(error=recover) und options(show.error.locations=TRUE) beim Debuggen von unbekanntem Code sehr hilfreich sein. Der erste bewirkt, dass R im Fehlerfall eine Debugging-Sitzung startet, wodurch Sie die Möglichkeit erhalten, den Browser an jedem Punkt des Aufruf-Stacks bis zu diesem Fehler aufzurufen. Die zweite Option teilt R mit, die Quellzeilennummer in den Fehler aufzunehmen.

+2

zusätzlich, wenn Sie 'Optionen (warn = 2)' dann das gleiche geschieht nach einer Warnung, die nützlich sein kann, wenn Sie am Ende Faktoren falsch in Zahlen umgewandelt haben (induzieren 'NA', die in der Regel nicht was Sie wollen – richiemorrisroe

+0

Also setze meine Optionen auf Optionen (error = recover), options (show.error.locations = TRUE) und Optionen (warn = 2), aber ich möchte diese Optionen auf ihren ursprünglichen Zustand zurücksetzen Wie würde ich das tun? – stochasticcrap

+1

'o <- Optionen (error = wiederherstellen, show.error.locations = TRUE, warn = 2); # Dinge tun; do.call (Optionen, o) # reset'Fühlen Sie sich frei zu upvote, wenn diese Antwort Ihnen geholfen hat. –

Verwandte Themen