2009-09-11 6 views
16

Disons que je viens d'appeler une fonction, f, et qu'une erreur s'est produite quelque part dans la fonction. Je veux juste être en mesure de vérifier les valeurs de différentes variables juste avant que l'erreur ne se produise. Supposons que mon instinct me dit que c'est un petit bug, donc je suis trop paresseux pour utiliser debug(f) et trop paresseux pour insérer browser() dans la partie de la fonction où je pense que les choses vont mal. Et je suis trop paresseux pour commencer à mettre print() instructions.Obtention de l'état des variables après qu'une erreur se soit produite dans R

Voici un exemple:

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

appel f(x,y) nous obtenons l'erreur suivante:

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

Dans cet exemple, je veux saisir l'état de l'environnement juste avant lm() est appelé; De cette façon, je peux appeler x et y et voir que leurs longueurs sont différentes. (Cet exemple est peut-être trop simple, mais j'espère que l'idée en sortira.)

Répondre

26

Comme indiqué here, il y a un moyen facile de le faire, et je pense que cette astuce a le potentiel de changer des vies pour le mieux.

Tout d'abord, appelez ceci:

options(error=recover) 

Maintenant, quand nous appelons f(x,y) nous aurons la possibilité de choisir un environnement pour récupérer. Ici, je sélectionne l'option 1, qui ouvre un débogueur et me permet de jouer avec des variables juste avant que lm() ne soit appelée.

> 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

Le lien est maintenant mort. J'adorerais lire ça! Soupir – Ameya

3

Vous pouvez aussi utiliser la fonction debug():

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

répond probablement la question mieux. Cependant, je voulais mentionner un autre outil de débogage pratique, traceback(). L'appeler juste après qu'une erreur s'est produite est souvent suffisant pour localiser le bogue.

Questions connexes