停止从R中的子函数执行父函数

停止从R中的子函数执行父函数,r,function,break,R,Function,Break,我正在使用R中的stop功能来制定一些故障排除措施。例如,当数据输入错误时抛出错误。我想要一个通用函数,我可以调用它来进行检查,然后我可以调用父代码的几个不同点。我可以抛出一个错误,但是,我注意到父函数在抛出错误后继续执行,只有我的“error函数”才会停止执行。当发生stop错误时,是否有方法使R停止全局执行 多谢各位 我的问题的一个编码示例: StopCode <- function() { try(if(TRUE) stop("This try/if statement sho

我正在使用R中的
stop
功能来制定一些故障排除措施。例如,当数据输入错误时抛出错误。我想要一个通用函数,我可以调用它来进行检查,然后我可以调用父代码的几个不同点。我可以抛出一个错误,但是,我注意到父函数在抛出错误后继续执行,只有我的“error函数”才会停止执行。当发生
stop
错误时,是否有方法使R停止全局执行

多谢各位

我的问题的一个编码示例:

StopCode <- function() {

  try(if(TRUE) stop("This try/if statement should stop the code from executing."))

}

StopCode() # This function should stop the code!

print("I should not see this statement if the try/if statement stopped the code in the way I desired.")

理想的结果应该是StopCode函数完全停止代码,而不仅仅是函数的执行。当您编写此代码时,它会停止函数,发出警告,然后继续运行打印函数。我希望不会发生这种情况,并且函数中的停止会全局终止执行。

基本上,您希望为您选择的某个函数设置选项(error=)。我将在此处粘贴文档?选项:

error:
either a function or an expression governing the handling of non-catastrophic
errors such as those generated by stop as well as by signals and internally
detected errors. If the option is a function, a call to that function, with
no arguments, is generated as the expression. The default value is NULL: see
stop for the behaviour in that case. The functions dump.frames and recover
provide alternatives that allow post-mortem debugging. Note that these need 
to specified as e.g. options(error = utils::recover) in startup files such
as ‘.Rprofile’.

默认情况下,
stop
完全执行您希望它执行的操作:它会中断每个正在运行的函数,直到达到顶层。如果脚本以非交互方式运行,它会停止脚本

但是,在您发布的代码中,通过
try
捕获错误,明确告诉R不要停止执行调用函数。不清楚您为什么在这里使用
try
,因为它的唯一目的是防止您似乎想要的行为

解决方法就是从代码中删除
try
。或者,您可能希望捕获错误,处理它,然后重新抛出它:

result = try(‹some operation that may fail›)
if (inherits(result, 'try-error')) {
    ‹handle error›
    # Re-throw error:
    stop(attr(result, 'condition'))
}

你能举个例子吗?当函数作为脚本的一部分遇到错误时,我遇到过这种行为,其中顶层不是函数,但决不是函数本身。我的理解是stop应该将您返回到顶级浏览器,停止调用堆栈中所有函数的执行。您好,感谢您的回复!我添加了一个示例,说明我正在做什么,以及我没有得到的功能。我希望函数全局停止执行,而不仅仅是在函数内部。如果不希望调用方继续执行,请不要将调用包装在
中,请尝试
!你明确告诉R不要停止(否则这将是默认行为)。啊,你应该意识到这一点!非常感谢。默认选项已经为OP的期望行为做了正确的事情,更改它不会有帮助。当然,不一定,例如选项(error=function(…)browser()。这样,在收集一些用户输入之前,您不会点击下一行。此外,我正在推断OP想要做什么。或者,如果您想更激进一些:options(error=function(…)quit(save='no')。对,我的意思是:R已经做了正确的事情,OP不应该更改选项来实现他们想要的,他们应该改为修复代码。
result = try(‹some operation that may fail›)
if (inherits(result, 'try-error')) {
    ‹handle error›
    # Re-throw error:
    stop(attr(result, 'condition'))
}