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

18

假设我刚调用了一个函数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个回答

28

正如此处所指出的(点击此处),有一种简单的方法可以做到这一点,我认为这个诀窍有可能改变人们的生活。

首先,调用以下内容:

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

遗憾的是,这仅适用于交互式R。如果您使用Rscript,则会出现“Error in options(error = recover) : object 'recover' not found”的错误。 - irritable_phd_syndrome

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

3

options(error=recover)

这可能是最好的答案。然而,我还想提到另一个方便的调试工具traceback()。在错误发生后立即调用它通常足以确定错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接