16

有时 R 会抛出错误,例如

if (ncol(x) != 2) { 中的错误:参数长度为零

当我没有编写这样的代码时,没有其他信息。有没有一种通用的方法来查找哪个包中的哪个函数导致错误?

由于大多数软件包都是压缩的,因此 grep 并非易事/usr/lib/R/library

4

2 回答 2

21

您可以使用它traceback()来定位最后一个错误发生的位置。通常它会将您指向您在函数中进行的调用。然后我通常会browser()在那个时候再次运行该函数,看看出了什么问题。

例如,这里有两个函数:

f2 <- function(x)
{
  if (x==1) "foo"
}

f <- function(x)
{
  f2(x)
}

请注意,f2()假设参数为 length 1。我们可以滥用f

> f(NULL)
Error in if (x == 1) "foo" : argument is of length zero

现在我们可以使用它traceback()来定位问题所在:

> traceback()
2: f2(x) at #3
1: f(NULL)

数字表示我们在嵌套函数中的深度。因此,我们看到f调用f2并在 line 处给出错误3。很清楚。我们现在可以在调用之前重新分配放置f以检查它的输入。只是让你停止执行一个函数并在它的环境中查看。类似于但您不必执行每一行,直到您知道出现问题为止。browserf2browser()debugdebugonce

于 2012-11-19T14:39:59.680 回答
18

只是为了添加@SachaEpskamp 已经建议的内容,设置options(error=recover)并且options(show.error.locations=TRUE)在调试不熟悉的代码时非常有用。第一个导致 R 在出错时启动调试会话,让您可以选择在调用堆栈中的任何位置调用浏览器,直到出现该错误。第二个选项将告诉 R 在错误中包含源代码行号。

于 2012-11-19T14:51:09.367 回答