有时 R 会抛出错误,例如
if (ncol(x) != 2) { 中的错误:参数长度为零
当我没有编写这样的代码时,没有其他信息。有没有一种通用的方法来查找哪个包中的哪个函数导致错误?
由于大多数软件包都是压缩的,因此 grep 并非易事/usr/lib/R/library
。
有时 R 会抛出错误,例如
if (ncol(x) != 2) { 中的错误:参数长度为零
当我没有编写这样的代码时,没有其他信息。有没有一种通用的方法来查找哪个包中的哪个函数导致错误?
由于大多数软件包都是压缩的,因此 grep 并非易事/usr/lib/R/library
。
您可以使用它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
以检查它的输入。只是让你停止执行一个函数并在它的环境中查看。类似于但您不必执行每一行,直到您知道出现问题为止。browser
f2
browser()
debug
debugonce
只是为了添加@SachaEpskamp 已经建议的内容,设置options(error=recover)
并且options(show.error.locations=TRUE)
在调试不熟悉的代码时非常有用。第一个导致 R 在出错时启动调试会话,让您可以选择在调用堆栈中的任何位置调用浏览器,直到出现该错误。第二个选项将告诉 R 在错误中包含源代码行号。