假设我刚刚调用了一个函数 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()。发生错误后立即调用此功能通常足以查明错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top