2017-08-09 2 views
0

Ich versuche, ein Skript zu schreiben, das den Prozess der Erstellung eines sauberen Korpus aus einem Vektor oder Datenrahmen für Text Mining und NLP vereinfacht. Mein Skript erzeugt jedoch einen Fehler, wenn ich es ausführe. Mein Skript ist wie folgt:Wie Traceback und Debug zu verwenden, um gebrochenen R-Code zu beheben?

quick_clean <- function(data, Vector = TRUE, removeNumbers = TRUE, removePunctuation = TRUE, 
        stop.words = NULL, ...) { 
    if(Vector == TRUE) { 
    source <- VectorSource(data) 
    } else { 
    source <- DataframeSource(data) 
    } 
    corp <- VCorpus(source) 
    corp <- tm_map(corp, stripWhitespace) 

    if(removePunctuation == TRUE) { 
    corp <- tm_map(corp, removePunctuation) 
    } 
    if(removeNumbers == TRUE) { 
    corp <- tm_map(corp, removeNumbers) 
    } 
    if(is.null(stop.words)) { 
    return(corp) 
    } else { 
    corp <- tm_map(corp, removeWords, c(stopwords("en"), stop.words)) 
    } 
    corp 
} 

Wenn ich es laufen, bekomme ich folgende Fehlermeldung:

ich die Zurückverfolgungs lief, aber ich bin nicht wirklich sicher, wie diese Informationen zu nutzen:

7. get(as.character(FUN), mode = "function", envir = envir) 
6. match.fun(FUN) 
5. lapply(X, FUN, ...) 
4. tm_parLapply(content(x), FUN, ...) 
3. tm_map.VCorpus(corp, removePunctuation) 
2. tm_map(corp, removePunctuation) 
1. quick_clean(swift_vec) 

ich lief auch Debug und bekam die folgende ... wieder, ich bin nicht sicher, wie diese Informationen zu nutzen:

Error in get(as.character(FUN), mode = "function", envir = envir) : 
    object 'FUN' of mode 'function' was not found 
Called from: get(as.character(FUN), mode = "function", envir = envir) 
Browse[1]> 

Was mache ich hier falsch?

+0

Es könnte sein, weil Sie den Namen 'source' als Variable verwenden. Es ist ein Problem, weil "source" auch ein Funktionsname in R ist. Ändern Sie das zu etwas anderem. –

Antwort

0

Lassen Sie uns die traceback Stapel von unten untersuchen:

  1. Ihr Fehler ist in quick_clean
  2. es auf der corp <- tm_map(corp, removePunctuation) Linie ist, zum Glück nur Sie eine haben
  3. innerhalb tm_map die Funktion selbst die Methode ruft tm_map.VCorpus, da Ihr Corp-Objekt der Klasse Vcorpus angehört und tm_map ein Wrapper für verschiedene Methoden ist
  4. Diese Funktion selbst ruftaufetc ...

Von der Zeit, die Sie eine zuverlässige Funktion in traceback trafen es in der Regel nicht so nützlich, viel weiter zu gehen, bedeutet dies, dass der Eingang Sie zu den Funktionen gaben nicht gut ist.

Wir haben gelernt, dass Sie ein Vcorpus Objekt als einen ersten Parameter angegeben haben, also scheint dieser in Ordnung zu sein, obwohl wir später überprüfen können, ob sein Format nicht problematisch ist.

Aber lassen Sie uns die anderen Parameter überprüfen, removePunctuation, die doc (?tm_map) sagt, dass es eine Funktion erfordert, wenn Sie debug verwenden, debugonce oder browser (sie sehen). Sie werden sehen, dass ihr boolescher Wert zu der Zeit ist, zu der Sie die Linie ausführen.

Und sie sind boolesch, weil Sie Ihre Funktionsparameter genau wie diese Funktionen benannt haben.

Also benennen Sie Ihre Funktionsparameter und hoffentlich wird es gut laufen :).

hier, wie Sie browser verwenden:

diese Funktion definieren (vor Ort die zusätzliche Linie)

quick_clean <- function(data, Vector = TRUE, removeNumbers = TRUE, removePunctuation = TRUE, 
        stop.words = NULL, ...) { 
    if(Vector == TRUE) { 
    source <- VectorSource(data) 
    } else { 
    source <- DataframeSource(data) 
    } 
    corp <- VCorpus(source) 
    corp <- tm_map(corp, stripWhitespace) 

    if(removePunctuation == TRUE) { 
    browser() # <----------------------------------------- here ! 
    corp <- tm_map(corp, removePunctuation) 
    } 
    if(removeNumbers == TRUE) { 
    corp <- tm_map(corp, removeNumbers) 
    } 
    if(is.null(stop.words)) { 
    return(corp) 
    } else { 
    corp <- tm_map(corp, removeWords, c(stopwords("en"), stop.words)) 
    } 
    corp 
} 

die Zeile ausführen, die den Fehler ausgelöst Typ class(corp) zu bestätigen, was wir bereits wissen typ class(removePunctuation) Hoppla, es ist ein Boolean. Geben Sie Q oder den Escape-Schlüssel ein, um den Browser zu verlassen.

debug ist wie browser, aber beginnt in der ersten Zeile der Funktion.

+0

Vielen Dank für Ihre Antwort Ich habe meine Parameter geändert, z. 'removePunctuation' ist jetzt' remove.Punctuation', sagt aber immer noch, dass es ein Problem mit dieser Codezeile gibt. Jedoch, dies, denke ich, hat mein Verständnis wirklich nach vorne gebracht, indem ich Argumentnamen niemals so machen sollte wie Funktionsnamen. Wenn Sie jetzt sagen, dass Sie "die Zeile ausführen, die den Fehler ausgelöst hat", meinen Sie nur diese Zeile mit der 'browse()' Funktion dort oder führen Sie das gesamte Skript aus? –

+0

Stellen Sie sicher, dass keine Ihrer Variablennamen Namen von Funktionen sind, und wählen Sie Namen, die nicht verwirrend sind, wie zum Beispiel 'rem_punct_bool', tun Sie es für' removeNumbers', 'source',' stop.words', dann können Sie es immer noch nicht Identifizieren Sie den Fehler, fügen Sie Ihre neue Funktion und die Rückverfolgung als Bearbeitung am Ende Ihres Posts ein –

Verwandte Themen