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

Xu *_*ang 13 debugging r

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

use*_*330 5

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

例如,

options(error = recover)
myfun <- function(x) x + "a" ; debug(myfun) ; myfun(2)
Run Code Online (Sandbox Code Playgroud)

这导致了以下交互行:

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]> 
Run Code Online (Sandbox Code Playgroud)

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


Car*_*oft 1

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

一种解决方案是:进入myfunc调试模式后,并且您知道调用的函数会引发错误,然后执行该函数,debug(that_func)以便您可以跟踪其错误路径。

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

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