2014-02-24 7 views
8

Ich muss eine Funktion Zeile für Zeile ausführen, um zu verstehen, wie es funktioniert. Aber die Funktion ist Teil eines installierten Pakets und ich weiß nicht, wo R die Quelle der installierten Pakete speichert (zB MultiPhen). Ich benutze RStudio 0.98.501 und R 3.0.2 in Ubuntu 12 (64it). Anscheinend wird der Quellcode der installierten Pakete nicht gespeichert, oder? Sorry, wenn es eine naive Frage ist, bin ich neu in R. Wenn die Quellen nicht gespeichert werden, gibt es sowieso ein Paket mit Source neu zu installieren und es zu debuggen (im Grunde einen Haltepunkt).Wie kann man ein installiertes R-Paket in RStudio debuggen (Breakpoint platzieren)?

Danke,

Kayhan

Antwort

10

Blick auf trace. Hier ist ein Beispiel, das an der vierten Anweisung in der Basispaketfunktion var einen Haltepunkt hinzufügt. Hier bitten wir trace die Funktion browser auf der sechsten Anweisung aufzurufen:

> trace(var, browser, at=6) 
Tracing function "var" in package "stats" 
[1] "var" 
> var(1:10) 
Tracing var(1:10) step 6 
Called from: eval(expr, envir, enclos) 
Browse[1]> n 
debug: if (is.data.frame(y)) y <- as.matrix(y) else stopifnot(is.atomic(y)) 
Browse[2]> n 
debug: stopifnot(is.atomic(y)) 
Browse[2]> n 
debug: .Call(C_cov, x, y, na.method, FALSE) 
Browse[2]> n 
[1] 9.166667 

Denken Sie daran, untrace wenn Sie fertig sind. Sie können ziemlich komplexe Sachen mit trace tun, obwohl in den meisten Fällen trace(fun.name, browser) wahrscheinlich genug ist.

Alternativ können Sie einfach das Paket laden und den Namen der Funktion auf der Kommandozeile wie so ein:

> var 
function (x, y = NULL, na.rm = FALSE, use) 
{ 
    if (missing(use)) 
     use <- if (na.rm) 
      "na.or.complete" 
     else "everything" 
    na.method <- pmatch(use, c("all.obs", "complete.obs", "pairwise.complete.obs", 
     "everything", "na.or.complete")) 
    if (is.na(na.method)) 
     stop("invalid 'use' argument") 
    if (is.data.frame(x)) 
     x <- as.matrix(x) 
    else stopifnot(is.atomic(x)) 
    if (is.data.frame(y)) 
     y <- as.matrix(y) 
    else stopifnot(is.atomic(y)) 
    .Call(C_cov, x, y, na.method, FALSE) 
} 
<bytecode: 0x000000000928ad30> 
<environment: namespace:stats> 

Sie dann, dass Ihr Editor kopieren und mit ihm spielen, um in, fügen Sie Ihre browser Aussage und Schritt durch die Ergebnisse.

+0

Danke, es ist sehr mächtig! – kayhan

1
  1. Ich denke, dass, wenn, wenn Sie install.packages('MultiPhen') geben Sie eine binäre Version des Pakets erhalten. Ich denke, dass es keinen Weg gibt, einen Breakpoint und Step-Thru-Code mit dieser Version des Pakets zu setzen.

  2. Alle R-Pakete sind Open Source und die Quelle ist auf der CRAN-Seite für das Paket verfügbar. Zum Beispiel ist this die CRAN-Seite für MultiPhen. Wenn Sie auf den Link neben dem Text "Paketquelle:" klicken, laden Sie die Quelle herunter.

  3. In Bezug auf was zu tun, wenn Sie die Quelle haben: Alle R-Pakete haben die gleiche Verzeichnisstruktur. Was für Ihre Situation wichtig ist, ist, dass sich der gesamte R-Code für das Paket im Verzeichnis "R" befindet.

Ich empfehle das Paket von RStudio deinstallieren und Sourcing den Code in dem Verzeichnis „R“, das Setzen von Breakpoints und Schritt durch Code, wie Sie für richtig halten.

Bitte lassen Sie uns wissen, wenn dies Ihr Problem löst.

+0

Danke, ich habe die Quelle gelesen, aber ich muss sie Zeile für Zeile ausführen, um sie zu verstehen. Wenn also ein Paket deinstalliert wird und sich die Quelle im aktiven Pfad befindet, lädt "library (MultiPhen)" das Paket noch? Sonst wie kann ich es laden? – kayhan

+0

Froh, zu helfen. In Ihrem Fall würde ich den Befehl 'library' komplett vergessen. Ich würde auch aufhören, über MultiPhen als Paket nachzudenken. Eher würde ich es als 5 Dateien betrachten, die ich zufällig auf meinem lokalen Rechner habe. Ich würde diese Dateien in RStudio öffnen, auf "Quelle" für jeden von ihnen klicken und Haltepunkte setzen, wo ich wollte. Im Wesentlichen würde ich diese Dateien behandeln und ich würde jeden Code, den ich selbst geschrieben habe. Nachdem der Code bezogen wurde, würde ich die Funktion, an der ich interessiert war, von der Konsole aus aufrufen. Beantwortet das deine Frage? – Ari

+0

Danke, ja du hast meine Frage beantwortet. Ich glaube, ich habe versucht, was Sie vor ein paar Wochen vorgeschlagen haben, und ich stieß auf ein seltsames Problem mit der Funktionsdefinition, aber vielleicht war ich nicht vorsichtig genug. Ich benutze derzeit Trace() (die andere Antwort) und es funktioniert. Vielen Dank :) – kayhan

Verwandte Themen