调试R中的意外错误--如何找到错误发生的位置?
有时R会给我一些错误,比如 if(ncol(x)!=2){:参数长度为零时出错 在没有其他信息的情况下,当我没有编写这样的代码时。有没有一种通用的方法来查找哪个包中的哪个函数会导致错误调试R中的意外错误--如何找到错误发生的位置?,r,error-handling,r-faq,R,Error Handling,R Faq,有时R会给我一些错误,比如 if(ncol(x)!=2){:参数长度为零时出错 在没有其他信息的情况下,当我没有编写这样的代码时。有没有一种通用的方法来查找哪个包中的哪个函数会导致错误 由于大多数软件包都是经过压缩的,所以grep/usr/lib/R/library并不是一件小事。您可以使用traceback()查找上次错误发生的位置。通常它会指向您在函数中进行的调用。然后我通常会将browser()放入此时,再次运行该函数,看看哪里出了问题 例如,这里有两个功能: f2 <- funct
由于大多数软件包都是经过压缩的,所以grep
/usr/lib/R/library
并不是一件小事。您可以使用traceback()
查找上次错误发生的位置。通常它会指向您在函数中进行的调用。然后我通常会将browser()放入
此时,再次运行该函数,看看哪里出了问题
例如,这里有两个功能:
f2 <- function(x)
{
if (x==1) "foo"
}
f <- function(x)
{
f2(x)
}
现在,我们可以使用traceback()
查找出了什么问题:
> traceback()
2: f2(x) at #3
1: f(NULL)
这个数字表示我们在嵌套函数中的深度。因此我们看到
f
调用f2
,这在第3行给出了一个错误。非常清楚。我们可以将f
重新分配给f
,此时将browser
放在f2
调用之前,以检查其输入。browser()
只允许您停止执行函数并查看其环境。与debug
和debugonce
类似,只是您不必执行每一行,直到知道出现问题为止。只需添加@SachaEpskamp已经建议的内容,设置选项(error=recover)
和选项(show.error.locations=TRUE)
在调试不熟悉的代码时非常有用。第一个选项会导致R在出现错误时启动调试会话,使您可以选择在调用堆栈中的任何点调用浏览器,直到出现错误为止。第二个选项会告诉R在错误中包含源行号。我发现调试最简单的方法是单步执行逐行检查代码。如果您的错误来自您编写的函数,您可以使用debugonce(function\u name)
对其进行调试。这将在函数范围内为您提供一个迷你R会话。这就是我一直在做的,但我觉得我在一些可以自动化的事情上花费了太多时间。此外,如果您设置选项(warn=2)
然后在出现警告时也会发生同样的情况,如果您最终将因子错误地转换为数字(导致NA
,这通常不是您想要的,请将我的选项设置为选项(错误=恢复)、选项(显示.错误.位置=真)和选项(警告=2),但希望将这些选项重置为其原始状态。我将如何执行此操作?o挑剔:这不是f2
假设参数的长度>0,而是if
语句。
> traceback()
2: f2(x) at #3
1: f(NULL)