调试R中的意外错误 - 如何找到错误发生的位置?

时间:2012-11-19 14:26:37

标签: r error-handling r-faq

有时R会抛出我的错误,例如

  

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

时出错

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

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

2 个答案:

答案 0 :(得分:19)

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

例如,这里有两个函数:

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

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

请注意,f2()假定参数长度为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并在行3处发出错误。很清楚。我们可以在f来电之前browser重新分配f2以检查其输入。 browser()只允许您停止执行函数并在其环境中查看。与debugdebugonce类似,不同之处在于您不必执行每一行,直到您知道出现问题为止。

答案 1 :(得分:17)

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