R:退出调用函数

chr*_*ris 7 r

在R中,有没有办法退出调用函数并返回一个值?有点像return(),但来自父功能?

parent <- function(){
  child()
  # stuff afterward should not be executed
} 

child <- function(){
  returnFromParent("a message returned by parent()")
}
Run Code Online (Sandbox Code Playgroud)

似乎stop()正在做那样的事情.我想要做的是写一个小替换stop(),返回stop()写入的消息stderr.

G5W的建议之后更新:我有大量的检查,stop()如果测试失败,每个都会产生一个检查,但是如果之前的检查失败,则无法评估后续条件,因此该函数必须在失败之后退出.为了'正确',我必须建立一个巨大的if else构造,我想避免.

Ten*_*bai 5

免责声明:这听起来是一个 XY 问题,将停止消息打印到 stdout 几乎没有任何价值,如果是交互式的,则不应该成为问题,如果在脚本中仅使用通常的重定向2 > &1将 stderr 消息写入 stdout,或者可能使用sink如回答这个问题

现在,如果我正确理解了您所追求的内容,我将执行以下操作以避免过多的代码重构。

首先定义一个处理错误的函数:

my_stop <- function() {
 e <- geterrmessage()
 print(e)
}
Run Code Online (Sandbox Code Playgroud)

现在配置系统以将错误发送到您的函数(错误处理程序)并抑制错误消息:

options(error = my_stop)
options(show.error.messages=FALSE)
Run Code Online (Sandbox Code Playgroud)

现在我们来测试一下:

f1 <- function() {
  f2()
  print("This should not be seen")
}

f2 <- function() {
  stop("This is a child error message")
}
Run Code Online (Sandbox Code Playgroud)

输出:

> f1()
[1] "Error in f2() : This is a child error message\n"
Run Code Online (Sandbox Code Playgroud)


chr*_*ris 5

得到它了.我想我正在寻找这样的东西:

parent <- function(){
  parent_killing_child()
  print("do not run this")
} 

parent_killing_child <- function(){
  do.call(return, list("my message"), envir = sys.frame(-1))
}

parent()
Run Code Online (Sandbox Code Playgroud)

感谢您的所有建议.