如果我在 R 函数中包含 stop() 以在给定特定条件下终止该函数,则 RStudio 的错误处理行为似乎与内置错误处理不同。
使用 stop 终止函数会使 RStudio 进入调试模式,而由(例如不向函数提供输入)生成的错误则不会。
我想编写该函数,以便无论 RStudio 中的调试设置如何,两种情况下的行为都是相同的。
这是一个将质量从克转换为盎司的示例函数。
如果输入是负质量,我想终止该函数,并显示一条消息,表明您只能使用正质量。
mass_convert <- function(mass) {
if (mass < 0) {
stop ("Please input positive mass")
}
mass * 0.03527396
}
在工具栏中的 RStudio 设置中:调试|错误时 | 设置为“破解代码”。
如果我运行以下命令:
mass_convert(-1)
我收到了预期的错误消息
Error in mass_convert(-1) : Please input positive mass Called from: mass_convert(-1)
但 RStudio 进入调试模式。
如果我改为跑步:
mass_convert()
我仍然收到错误消息:
Error in mass_convert() : argument "mass" is missing, with no default
但是这次 RStudio 没有进入调试模式。
我有两个问题:
两种不同行为背后的原因是什么?
如何获得 if 语句以与未给出输入类似的方式终止函数,同时将调试的 RStudio 设置保留为“中断代码”。 IE。我希望函数在给定负质量时终止,但不需要进入调试模式,因为消息描述了问题所在。
一种选择可能是使用 warning() 代替,并将函数求值放在“else”语句之后:
mass_convert <- function(mass) {
if (mass < 0) {
warning ("Please input positive mass")
} else mass * 0.03527396
}
但感觉应该有一种方法可以用 error() 来代替。 或者,我是否以错误的方式使用错误?
RStudio 的内置调试器会忽略某些类型的错误,显然包括这一错误。您可以在 Posit 的 Rstudio 中的调试指南中阅读相关内容,其中解释了这一点:
为了防止在任何地方发生任何错误时调用调试器,如果堆栈中看起来没有您自己的代码,则 RStudio 不会调用调试器。如果您发现这排除了您想要捕获的错误,请转至 Tools -> Global Options 并取消选中“仅当我的代码包含错误时才使用调试错误处理程序”。
但是,取消选中该框不足以中断示例中的错误。为了实现这一目标,我必须遵循他们随后的建议:
如果您确实想在每次错误时调用调试器,那么这就能完成工作:
options(error = browser)
但这让我进入了一个无法离开的调试环境,因为我显然是在“顶层”(即不在函数内)进行调试。所以也不要这样做。
关于你的第二个问题,我建议不要用你自己的错误消息“覆盖”这个非常低级的错误。已经有一个系统可以在函数缺少所需参数时抛出错误,并且为一个函数重新设计它会导致代码难以预测。