R在抛出错误时不可见地返回对象和正常错误

R在抛出错误时不可见地返回对象和正常错误,r,error-handling,R,Error Handling,我有一个可能抛出错误的函数。当抛出错误时,我希望显示错误消息,就像错误实际发生一样,并进一步以不可见的方式返回一个对象 我看了一下,它使用和callinghandlers并将错误消息记录在某个地方。这很接近,但我不想将消息记录为文本,然后打印文本消息,函数应该显示错误消息,就好像它会在出现错误时退出一样 功能工作流如下所示: foo <- function(x){ y <- x + 1 if(y == 2) { stop("oops")

我有一个可能抛出错误的函数。当抛出错误时,我希望显示错误消息,就像错误实际发生一样,并进一步以不可见的方式返回一个对象

我看了一下,它使用
和callinghandlers
并将错误消息记录在某个地方。这很接近,但我不想将消息记录为文本,然后打印文本消息,函数应该显示错误消息,就好像它会在出现错误时退出一样

功能工作流如下所示:

foo <- function(x){

  y <- x + 1
  
    if(y == 2) {
    stop("oops")
    # also return y invisibly when error is thrown,
  }
  
  z <- y + 1
  z
  
}

foo
func以下是我对问题的最终解答。基本上,它是基于r2evans的回答和user20650的评论

正如r2evans所示,我们可以使用
simpleError
创建错误,并在属性中附加一个对象。这种方法的最大优点是它返回了一个我们可以编程的真实错误。如果我们只显示错误消息,然后以不可见的方式返回向量,
tryCatch
不会将其识别为错误。缺点是在控制台中打印时,
simpleError
对于交互式用户来说并不像是正常错误。它将显示类似于
的内容。但是,消息不会像正常错误那样以红色打印

这里user20650的评论显示了一个很好的解决方法。我们可以先用
message(conditionMessage(e))
打印消息,然后以不可见的方式返回
simpleError


foo对我来说,“抛出错误”意味着函数在无法继续的前提下故意放弃控制。然后返回一个值与此相反。您是否可能希望记录一个错误,然后返回一些内容,但您提到的调用处理程序的
,听起来可能不是您所需要的。我担心我所想的是不可能的。在这种情况下,是否可以以接近真实错误消息的方式显示记录的错误消息?您可以发出(stern?
警告,该警告类似于错误显示。由于控件未断开,您可以发出警告,然后返回。很抱歉,由于不可见的原因,删除了我的早期评论。。。如果(y==2){tryCatch(stop(“oops”),error=function(.)message(conditionMessage(.))return(invisible(y))},那么做
就足够了吗。虽然仍然不完全正确的错误message@user20650:再次感谢您的光临!我将它与r2evans的答案结合起来,一旦结合起来,这就完全解决了我的问题。因此,对于我的函数
foo
,我们会让它返回
simpleError:qux>
,然后我们可以创建一个自定义函数,使用
.Last.value
检查该错误。这是一个很好的方法。再次感谢您建议
simpleError
。我唯一遇到的问题是
simpleError
的“非标准”错误消息,它看起来与常规错误不同。我现在将您的方法与@user20650的方法结合使用(正如他在对我的问题的评论中提到的)。我在下面发布了最终答案。虽然您可以选择任何可行的方法,但我不明白您所说的“非标准”错误消息是什么意思:我们使用
simpleError
生成一个结构,添加一个属性,然后
stop
。该错误消息看起来与没有属性的
stop(“quux”)
完全相同。可能我认为太复杂了。我单独使用
stop
进行了尝试,没有依赖user20650的解决方法,但我无法获得与下面的答案相同的结果。如果您能演示如何使用
stop
执行此操作,我很乐意接受这个答案。这三个目标是:(i)foo(1)像常规错误一样返回红色的错误消息,(ii)我们可以从错误中提取属性holding
y
,(iii)foo(1)
的结果应该是class
error
或类似的。如果你的解决方案有效,坚持下去,我不会屈从于分数。这是一个有趣的问题。