如果出错,请不要退出调试器

时间:2014-05-14 08:24:49

标签: r debugging

当我在调试器中时(来自前面的browser语句),如果我找到了给出错误的代码,则R退出调试器。但我想留在它里面。我该如何自动执行此操作(例如,当我在调试器中时,我不想手动记住将选项(错误)重置为某些内容。

2 个答案:

答案 0 :(得分:5)

您可以使用options(error = recover)。这将退出调试会话并立即提供输入一个新的变量,其中包含错误发生时的变量。

例如,

options(error = recover)
myfun <- function(x) x + "a" ; debug(myfun) ; myfun(2)

这导致以下互动线:

debugging in: myfun(2)
debug: x + "a"
Browse[2]> n
Error in x + "a" (from #1) : non-numeric argument to binary operator

Enter a frame number, or 0 to exit   

1: myfun(2)

Selection: 1
Browse[3]> ls()
[1] "x"
Browse[3]> print(x)
[1] 2
Browse[3]> 

要自动执行此操作,只需将options(error=recover)调用作为会话的默认设置。

答案 1 :(得分:1)

您的问题可能是由于对调试级别的误解造成的。例如,如果执行debug(myfunc); myfunc(...)myfunc调用其他函数,则调用模式下被调用函数。如果该函数抛出错误,R就会完全退出整个环境。想象一下,如果它没有:在非调试模式下会发生什么?

一个解决方案是:在调试模式下输入myfunc后,您知道调用函数会抛出错误,执行debug(that_func)以便您可以按照其错误路径进行操作。

另一种解决方法是在调试提示符下手动输入违规函数调用(而不是按RETURN使调试器运行代码的下一行)。通过这种方式,您将收到错误消息,但由于它是用户调用的,而不是实际执行正在调试运行的代码行,因此调试器不会退出。

如果不清楚,请随时发表评论。