在R中发生错误后获取变量的状态

时间:2009-09-11 18:32:32

标签: debugging r

假设我刚刚调用了一个函数f,并且函数中某处出现了错误。我只是希望能够在错误发生之前检查出不同变量的值。

假设我的直觉告诉我这是一个小错误,所以我懒得使用debug(f)并且懒得将browser()插入函数中我认为出错的部分。而且我懒得开始加入print()陈述。

以下是一个例子:

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

调用f(x,y)我们收到以下错误:

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

在这个例子中,我想在调用lm()之前获取环境状态;这样,我可以致电xy,看看他们的长度是不同的。 (这个例子可能过于简单,但我希望它可以解决这个问题。)

3 个答案:

答案 0 :(得分:26)

正如here指出的那样,有一种简单的方法可以做到这一点,我认为这种技巧有可能改善生活。

首先,请致电:

options(error=recover)

现在,当我们致电f(x,y)时,我们可以选择要恢复的环境。在这里,我选择了选项1,它打开了一个调试器,让我在调用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

答案 1 :(得分:3)

您也可以使用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

答案 2 :(得分:3)

options(error=recover)

可能最好地回答这个问题。但是,我想提一下另一个方便的调试工具traceback()。发生错误后立即调用此功能通常足以查明错误。