R:退出调用函数

时间:2016-12-04 23:33:09

标签: r

在R中,有没有办法退出调用函数并返回一个值?像return()这样的东西,但来自父函数?

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

child <- function(){
  returnFromParent("a message returned by parent()")
}

似乎stop()正在做类似的事情。我想要做的是为stop()写一个小替代,返回stop()写给stderr的消息。

G5W 的建议之后更新:我有大量的检查,如果测试失败,每个检查都会产生stop(),但如果之前的检查失败,则无法评估后续条件,所以函数必须在失败之后退出。为了“正确”做到这一点,我必须构建一个巨大的if else构造,我想避免它。

3 个答案:

答案 0 :(得分: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()

感谢您的所有建议。

答案 1 :(得分:2)

免责声明:这听起来是一个XY问题,将停止消息打印到stdout几乎没有值,如果是交互式则不应该是问题,如果在脚本中只是使用通常的重定向{{ 1}}将stderr消息写入stdout,或者使用2 > &1作为this question中的答案。

现在,如果我在我做了类似下面的事情之后正确理解了你的内容,以避免过多的代码重构。

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

sink

现在将系统配置为向您的函数发送错误(错误处理程序)并禁止显示错误消息:

my_stop <- function() {
 e <- geterrmessage()
 print(e)
}

现在让我们测试一下:

options(error = my_stop)
options(show.error.messages=FALSE)

输出:

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

f2 <- function() {
  stop("This is a child error message")
}

答案 2 :(得分:1)

对于父函数,请列出测试。然后遍历测试,并在第一次失败的测试时返回您的消息。第一次失败后,将不会执行后续测试。

示例代码:

test1 <- function(){criteria <- T; return(ifelse(criteria,T,F))} 

test2 <- function(){criteria <- F; return(ifelse(criteria,T,F))} 

test3 <- function(){criteria <- T; return(ifelse(criteria,T,F))} 

parent <- function() {
  tests <- c('test1', 'test2', 'test3')
  for (i in 1:length(tests)) {
    passed <- do.call(tests[i],args = list())
    #print(passed)
    if (!passed){ 
      return(paste("Testing failed on test ", i, ".", sep=''))
    }
  }
  return('Congrats! All tests passed!')
}

parent()