为什么这两个错误会导致 RStudio 中不同的错误处理行为?

问题描述 投票:0回答:1

如果我在 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 没有进入调试模式。


我有两个问题:

  1. 两种不同行为背后的原因是什么?

  2. 如何获得 if 语句以与未给出输入类似的方式终止函数,同时将调试的 RStudio 设置保留为“中断代码”。 IE。我希望函数在给定负质量时终止,但不需要进入调试模式,因为消息描述了问题所在。

一种选择可能是使用 warning() 代替,并将函数求值放在“else”语句之后:

mass_convert <- function(mass) {
  if (mass < 0) {
    warning ("Please input positive mass")
  } else  mass * 0.03527396
}

但感觉应该有一种方法可以用 error() 来代替。 或者,我是否以错误的方式使用错误?

r function debugging rstudio
1个回答
0
投票

RStudio 的内置调试器会忽略某些类型的错误,显然包括这一错误。您可以在 Posit 的 Rstudio 中的调试指南中阅读相关内容,其中解释了这一点:

为了防止在任何地方发生任何错误时调用调试器,如果堆栈中看起来没有您自己的代码,则 RStudio 不会调用调试器。如果您发现这排除了您想要捕获的错误,请转至 Tools -> Global Options 并取消选中“仅当我的代码包含错误时才使用调试错误处理程序”

但是,取消选中该框不足以中断示例中的错误。为了实现这一目标,我必须遵循他们随后的建议:

如果您确实想在每次错误时调用调试器,那么这就能完成工作:

options(error = browser)

但这让我进入了一个无法离开的调试环境,因为我显然是在“顶层”(即不在函数内)进行调试。所以也不要这样做。

关于你的第二个问题,我建议不要用你自己的错误消息“覆盖”这个非常低级的错误。已经有一个系统可以在函数缺少所需参数时抛出错误,并且为一个函数重新设计它会导致代码难以预测。

© www.soinside.com 2019 - 2024. All rights reserved.