如何设置R Studio在代码出错时中断

如何设置R Studio在代码出错时中断,r,debugging,rstudio,R,Debugging,Rstudio,几个月前我使用了R Studio,调试器没有问题,但现在我似乎无法让IDE中断并向我显示发生错误的环境。例如,如果我将代码拆分为工作目录中的两个文件,以及名为realfolder的文件夹 工具.r savedata <- function (data, path){ stopifnot(class(data) == "data.frame") write.csv(data, path) } source("tools.r") a = c(

几个月前我使用了R Studio,调试器没有问题,但现在我似乎无法让IDE中断并向我显示发生错误的环境。例如,如果我将代码拆分为工作目录中的两个文件,以及名为realfolder的文件夹

工具.r
savedata <- function (data, path){
  stopifnot(class(data) == "data.frame")
  write.csv(data, path)
}
source("tools.r")

a = c(1,2,3)
b = c(10,20,30)
d = data.frame(a,b)

savedata(d, './realfolder/d.csv') # call A
savedata(1, './realfolder/d.csv') # call B
savedata(d, './fakefolder/d.csv') # call C
当我将Debug->On Error设置为Break-in Code,然后在source analysis.r中,调用B的线路上发生错误,停止由stopifnot(class(data)=“data.frame”)触发,正如预期的那样。但是,IDE不会在该行暂停,只显示错误消息:

Error in savedata(1, "./realfolder/d.csv") : 
  class(data) == "data.frame" is not TRUE
调用
traceback()
会提供所有相关信息,但我记得在发生错误时可以获取快照,以查看环境中的哪些变量导致了问题

当我将Debug->On Error设置为Error Inspector时,我得到了一个交互式回溯,但没有中断。如果我用调用B注释掉该行,则调用C的打包函数中会出现错误,因为fakefolder不存在。在这种情况下,即使是错误检查器也只显示错误消息

这是正常的行为吗?发生错误时,是否可以在回溯的每个点上获得
browser()
的效果


我使用的是RStudio 1.2.5033版

您是否尝试过将调试->出错->设置为->中断代码


我正在使用RStudio Desktop 1.2.5033,请将此作为脚本的第一行:

options(error = utils::recover)

您使用的是什么版本的RStudio?您说的是“然后运行工具.r”,但可能您的意思是“然后运行”analysis.r,但您没有说明如何运行它。如果您单击“运行”,则只运行高亮显示的行或光标位于其上的行,请使用“源”。@user2554330-您是对的,这是一个错误。我使用的是“源”“在
analysis.r
上,我还使用了RStudio Desktop 1.2.5033,并将调试设置为与您显示的完全相同的方式。我认为这可能是一些用户设置,但我在下面重置桌面状态后重新安装了RStudio。这是一个典型的“不可复制”错误-因为当我在我的RStudio 1.2.5033安装上运行您的两个文件时,它会按预期/定义执行,并在出现错误时“中断代码”。所以,正如你已经做过的那样——很可能重置你的RStudio桌面是最好的方法。无论如何,谢谢@GWD。你能帮我一个小忙,在环境(值和回溯)窗口崩溃时显示你在其中看到的东西吗?当我遵循Data Munger的回答时,它不是很有用,因为它没有显示
savedata
函数中实际调用stop的环境。Hi@rovyko,它应该都在那里,你只需要在Environment选项卡中稍作调整-左上角的下拉列表应该可以让你查看右侧的环境/闭包及其元素/对象。当前(在您的屏幕截图中,
stopifnot
被选中-将其更改为eg
stop
,然后环境选项卡将显示参数等。明白了。我只需向后导航一步。在这种情况下,我必须导航到步骤'5:analysis.r#10:savedata(d,“./fakefolder/d.csv”)`查看参数值。这很有效,但不幸没有Python回溯那么好。谢谢,这至少解决了部分问题。当我在开始和源代码
analysis.r
时,我可以选择在
tools.r#2:stopifnot(class(data)=“data.frame”)停止
。但是,当我停在那里时,在回溯窗口中,我只能从内置函数的环境中进行选择。我实际上无法停在
tools.r第2行
,并在该点检查环境状态,这是调试函数所需的。