Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调试R中的意外错误--如何找到错误发生的位置?_R_Error Handling_R Faq - Fatal编程技术网

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

调试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

有时R会给我一些错误,比如

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

在没有其他信息的情况下,当我没有编写这样的代码时。有没有一种通用的方法来查找哪个包中的哪个函数会导致错误


由于大多数软件包都是经过压缩的,所以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)