Einige Debugger ermöglichen das dynamische Hinzufügen von Haltepunkten im Debugger. Ist diese Funktionalität in R möglich? Ein Beispiel:Trace/Breakpoint hinzufügen, während sie bereits im Browser von R vorhanden sind
quux <- function(..)
{ # line 1
"line 2"
"line 3"
"line 4"
"line 5"
"line 6"
}
trace("quux", tracer = browser, at = 3)
# [1] "quux"
quux()
# Tracing quux() step 3
# Called from: eval(expr, envir, enclos)
# Browse[1]>
# debug: [1] "line 3"
Beim Debuggen glaube ich, ich möchte im Code voraus springen. Stellen Sie sich vor, die Funktion hat ein paar hundert Zeilen Code, und ich würde es vorziehen, sie nicht zu durchlaufen.
Ich würde gerne in der Lage sein, dies zu tun, und von der aktuellen Zeile zur nächsten interessanten Zeile springen, aber leider geht es einfach aus der Funktion.
# Browse[2]>
trace("quux", tracer = browser, at = 5)
# [1] "quux"
# Browse[2]>
c
# [1] "line 6"
# # (out of the debugger)
Der trace
Anruf, während nur im Debugger den Haltepunkt auf die ursprüngliche (global) Funktion, wie gezeigt hinzugefügt, wenn ich die Funktion sofort wieder anrufen:
quux()
# Tracing quux() step 5
# Called from: eval(expr, envir, enclos)
# Browse[1]>
# debug: [1] "line 5"
Ich habe versucht, beide auf einmal einstellen (at=c(3,5)
) im Browser, aber das setzt nur die Zeilen, wenn ich den Debugger verlasse und die Funktion erneut aufruft.
Ich vermute, das hat mit der Funktion zu tun, an die trace
den Haltepunkt anbringt. Ein Blick in trace
(und .TraceWithMethods
), ich denke, ich muss where
einstellen, aber ich kann nicht herausfinden, wie man es bekommt, um einen neuen Haltepunkt/Trace auf der In-Debugging-Funktion zu setzen.
(Das größere Bild ist, dass ich eine Funktion, die sich mit einem Kafka-geführten Datenstrom beschäftigt. Meine beiden Optionen sind derzeit (a) starten Sie die Funktion mit der geeigneteren Ablaufverfolgung, aber das erfordert mich zu tun Bereinigen und starten Sie den Datenstrom ebenfalls neu oder (b) gehen Sie zeilenweise im Debugger, langwierig, wenn es viele hundert Zeilen Code gibt.)
Ich vermute, dass dies nicht direkt möglich ist, da die Ablaufverfolgung/Debugging-Mechanismen neue Funktionen mit aktiviertem Debuggen erstellen. Was Sie möglicherweise tun können, ist, wenn die Zeile, zu der Sie springen möchten, selbst ein Funktionsaufruf ist, dann debuggen Sie diese Funktion. z.B. In '{line1; line2; line3; my_fun(); line4}' können Sie 'debug (my_fun)' gefolgt von 'c' an der Browse-Eingabeaufforderung ausführen und direkt zum Inhalt' my_fun' springen. – BrodieG
Danke, das ist was ich vermute. Ihr Vorschlag funktioniert, wenn am nächsten Haltepunkt eine Funktion vorhanden ist. Danke, @ BrodieG. – r2evans