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

Tim*_*Tim 15 error-handling r r-faq

有时R会抛出我的错误

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

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

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

Sac*_*amp 20

您可以使用它traceback()来查找上次发生错误的位置.通常它会指向您在函数中进行的调用.然后我通常会browser()在那时再次运行该功能,看看出了什么问题.

例如,这里有两个功能:

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

f <- function(x)
{
  f2(x)
}
Run Code Online (Sandbox Code Playgroud)

请注意,f2()假设一个长度参数1.我们可以滥用f:

> f(NULL)
Error in if (x == 1) "foo" : argument is of length zero
Run Code Online (Sandbox Code Playgroud)

现在我们可以traceback()用来找出出错的地方:

> traceback()
2: f2(x) at #3
1: f(NULL)
Run Code Online (Sandbox Code Playgroud)

数字表示我们在嵌套函数中的深度.所以我们看到那些f调用f2并且在线上给出了错误3.很清楚.我们现在可以在电话会议之前重新分配f,以检查它的输入.只是允许你停止执行一个函数并环顾它的环境.类似于,除了你不必执行每一行,直到你知道出错了.browserf2browser()debugdebugonce


Mat*_*rde 18

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

  • 另外,如果你设置`options(warn = 2)`那么在警告时也会出现相同的情况,如果你最终错误地将因子转换为数字(引起'NA`,这通常不是你想要的),这将非常有用 (2认同)
  • `o &lt;-options(error = recover,show.error.locations = TRUE,warn = 2);#do stuff; do.call(options,o)#reset`如果此答案对您有帮助,请随时投票。 (2认同)