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