2009-09-11 6 views
16

Powiedzmy, że właśnie nazwałem funkcję, f i gdzieś w funkcji wystąpił błąd. Chcę tylko móc sprawdzić wartości różnych zmiennych tuż przed wystąpieniem błędu.Uzyskiwanie stanu zmiennych po wystąpieniu błędu w R

Załóżmy, że moje jelito mówi mi, że to mały błąd, więc jestem zbyt leniwy, aby użyć debug(f) i zbyt leniwy, aby wstawić browser() do części funkcji, w której myślę, że coś idzie źle. I jestem zbyt leniwy, aby zacząć wstawiać oświadczenia print().

Oto przykład:

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

Wywołanie f(x,y) otrzymujemy następujący błąd:

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

W tym przykładzie chcę chwycić stan środowiska tuż przed lm() nazywa; w ten sposób mogę zadzwonić pod numer x i y i zobaczyć, że ich długości są różne. (Ten przykład może być zbyt prosty, ale mam nadzieję, że wpadnie na ten pomysł.)

Odpowiedz

26

Jak wskazano here, jest to prosty sposób na zrobienie tego i myślę, że ta sztuczka może zmienić życie na lepsze.

pierwsze, nazywamy to:

options(error=recover) 

Teraz kiedy nazywamy f(x,y) będziemy mieli możliwość wyboru środowiska w celu odzyskania. Tutaj wybieram opcję 1, która otwiera debugger i pozwala mi bawić się zmiennymi tuż przed wywołaniem lm().

> 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 
+0

Link jest teraz martwy. Chciałbym to przeczytać! Westchnienie – Ameya

3

Można też po prostu użyć debug() Funkcja:

> 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 
3

options(error=recover)

Prawdopodobnie odpowiedź na pytanie najlepiej. Jednak chciałem wspomnieć o innym poręcznym narzędziu do debugowania, traceback(). Powiadomienie o tym bezpośrednio po wystąpieniu błędu jest często wystarczające do zlokalizowania błędu.

Powiązane problemy