假设我刚刚调用了一个函数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
,看看他们的长度是不同的。 (这个例子可能过于简单,但我希望它可以解决这个问题。)
答案 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()
。发生错误后立即调用此功能通常足以查明错误。