Frage

Lassen Sie uns sagen, ich habe nur eine Funktion, f genannt, und ein Fehler aufgetreten ist irgendwo in der Funktion. Ich möchte nur in der Lage sein, die Werte von verschiedenen Variablen zu prüfen, kurz bevor der Fehler auftrat.

Nehmen wir an mir mein Bauchgefühl sagt, es ist ein kleiner Fehler, so dass ich bin zu faul debug(f) zu verwenden und zu faul browser() in den Teil der Funktion einzufügen, wo ich Dinge denken falsch gehen. Und ich bin viel zu faul setzt in print() Aussagen zu starten.

Hier ist ein Beispiel:

x <- 1:5
y <- x + rnorm(length(x),0,1)
f <- function(x,y) {
  y <- c(y,1)
  lm(y~x)
}

Beim f(x,y) wir die folgende Fehlermeldung erhalten:

Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) : 
  variable lengths differ (found for 'x')

In diesem Beispiel möchte ich den Zustand der Umwelt greifen kurz vor lm() genannt wird; auf diese Weise ich x und y und sehen, dass ihre Längen sind unterschiedlich aufrufen können. (Dieses Beispiel kann auch einfach sein, aber ich hoffe, dass es auf die Idee kommt herüber.)

War es hilfreich?

Lösung

Wie bereits ausgeführt hier , gibt es eine einfache Art und Weise, dies zu tun, und ich denke, dieser Trick das Potenzial hat, das Leben zum besseren zu verändern.

Zuerst nennen dies:

options(error=recover)

Wenn wir jetzt f(x,y) nennen wir eine Option haben, eine Umgebung zu wählen, sich zu erholen. Hier wähle ich die Option 1, die einen Debugger öffnet und mich mit Variablen spielen, um lässt kurz vor lm() aufgerufen wird.

> f(x,y)
Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) : 
  variable lengths differ (found for 'x')

Enter a frame number, or 0 to exit   

1: f(x, y)
2: lm(y ~ x)
3: eval(mf, parent.frame())
4: eval(expr, envir, enclos)
5: model.frame(formula = y ~ x, drop.unused.levels = TRUE)
6: model.frame.default(formula = y ~ x, drop.unused.levels = TRUE)

Selection: 1
Called from: eval(expr, envir, enclos)
Browse[1]> x
[1] 1 2 3 4 5
Browse[1]> y
[1] 1.6591197 0.5939368 4.3371049 4.4754027 5.9862130 1.0000000

Andere Tipps

Sie können auch einfach die debug () Funktion:

> debug(f)
> f(x,y)
debugging in: f(x, y)
debug: {
    y <- c(y, 1)
    lm(y ~ x)
}
Browse[1]> 
debug: y <- c(y, 1)
Browse[1]> x
[1] 1 2 3 4 5
Browse[1]> y
[1] 2.146553 2.610003 2.869081 2.758753 4.433881

options(error=recover)

Wahrscheinlich beantwortet die Frage am besten. Allerdings wollte ich ein anderes handliches Debugging-Tool, traceback() erwähnen. Der Aufruf dieses Recht, nachdem ein Fehler aufgetreten ist, ist oft genug, um den Fehler zu lokalisieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top