如果出现错误,则不让R退出调试器

如果出现错误,则不让R退出调试器,r,debugging,R,Debugging,当我在调试器中时(例如,从浏览器语句),如果我找到给出错误的代码,R将退出调试器。但我想留在里面。如何自动执行此操作(例如,当我在调试器中时,我不想手动将选项(错误)重置为某个值。您的问题可能是由于对调试级别的误解。例如,如果您执行debug(myfunc);myfunc(…),并且myfunc调用其他函数,则被调用的函数未处于调试模式。如果该函数抛出错误,R将非常正确地退出整个环境。想象一下,如果它没有抛出错误:在非调试模式下会发生什么 一种解决方案是:在调试模式下输入myfunc并且您知道调

当我在调试器中时(例如,从
浏览器
语句),如果我找到给出错误的代码,R将退出调试器。但我想留在里面。如何自动执行此操作(例如,当我在调试器中时,我不想手动将选项(错误)重置为某个值。

您的问题可能是由于对调试级别的误解。例如,如果您执行
debug(myfunc);myfunc(…)
,并且
myfunc
调用其他函数,则被调用的函数未处于调试模式。如果该函数抛出错误,
R
将非常正确地退出整个环境。想象一下,如果它没有抛出错误:在非调试模式下会发生什么

一种解决方案是:在调试模式下输入
myfunc
并且您知道调用的函数抛出错误后,执行
debug(that_func)
,这样您就可以跟踪它的错误路径

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

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

您可以使用
选项(error=recover)
。这将退出调试会话,并立即提供输入一个新会话,变量与出错时相同

比如说,

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

要自动执行此操作,只需输入
选项(error=recover)
调用作为会话的默认值。

这对我来说是新的。根据我的经验,调试器永远不会退出,除非我按
Q
@DavidArenburg。奇怪的是,我认为调试器也在为我运行,但我只是检查了一下,它会像OP描述的那样将我踢出…
R 3.0.2
不,它不应该退出,也不适合我。请给出一个可复制的示例例如。您确定不执行空行吗?“将选项“browserNLdisabled”设置为TRUE将禁用空行作为c的同义词。如果这样做,则将重新提示用户输入,直到输入有效的命令或表达式。”当你运行
func R 3.4.1时会发生什么,我会留在调试器中。这不是我正在经历的行为。一个重复的例子:
myfun@Heisenberg我不理解你的评论。调试器退出是因为它完成了
myfun
的每一行。这不是OP所说的。我不认为这是真的在调试器退出时,因为它超出了行数。如果有更多行数,我的调试器仍会退出。这种行为在RStudio和shell R中都会发生。GIF证明:@Heisenberg它看起来像RStudio错误。请尝试更新您的R/RStudio版本,或者尝试在纯R(而不是RStudio)中运行它这是宣传的!它确实与许多用户关于调试器不应首先退出的建议相冲突。您知道“预期行为”是什么吗?如果我查看
debug
browser
的帮助页面,我看不到在浏览过程中发出错误信号时会发生什么。因此没有任何问题“预期行为”。当然,正常的R行为是退出到顶层,但是
选项(错误=…)
设置(如我给出的设置)可以改变这一点。在RStudio中,有一个菜单选项用于
Debug | On error
;它在我的系统上似乎不起作用,但我没有更新RStudio或R版本。
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]>