题
假设我刚刚调用了一个函数 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()
之前获取环境状态;这样我就可以调用 x
和 y
,看看它们的长度是不同的。 (这个例子可能过于简单,但我希望它可以解决这个问题。)
解决方案
正如这里指出的那样,这很简单这样做的方式,我认为这个技巧有可能改善生活。
首先,请致电:
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
其他提示
您也可以使用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
<代码>选项(误差=恢复)代码>
可能最好地回答这个问题。但是,我想提一下另一个方便的调试工具, traceback()
。发生错误后立即调用此功能通常足以查明错误。
不隶属于 StackOverflow