在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
构造,我想避免它。
答案 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()