有没有办法强制父函数返回输出?假设我有一个功能“做某事”'并且在每个功能的开头,想要检查一些东西'。如果检查失败,我想返回其他内容'。
在我的下面的例子中'做了一些事情'是对数,检查一些东西'意味着检查变量是否为非负数和“其他内容”。是负无穷大。
weird_log <- function(x) {
check(x)
log(x)
}
check <- function(x) {
if (x <= 0)
eval.parent(parse(text = 'return(-Inf)'))
}
这个例子不起作用
weird_log(10) # 2.302585
weird_log(-10) # NaN
一种解决方案是返回其他内容&#39;如果检查发现问题则来自检查功能,否则NULL
。然后我可以在父函数中写一个if
并完成它。
weird_log <- function(x) {
y <- check(x)
if (!is.null(y)) return(y)
log(x)
}
check <- function(x) {
if (x <= 0) {
-Inf
} else {
NULL
}
}
此解决方案仍然将大多数功能保留在分离的函数check()
中,但有没有办法在其中包含所有功能?
在实际问题中,检查功能不仅仅进行一次比较,而且它用于多个功能,因此必须单独使用它。还有其他的东西&#39;返回check
函数取决于输入失败的条件。
更现实的例子:
weird_log <- function(input) {
y <- check(input)
if (!is.null(y)) return(y)
list(log = log(input$x))
}
check <- function(input) {
if (is.null(input$x)) {
list(error = 'x is missing')
} else if (!is.numeric(input$x)) {
list(error = 'x is not numeric')
} else if (x <= 0) {
list(log = -Inf, warn = 'x is not positive')
} else {
NULL
}
}
答案 0 :(得分:5)
http://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm:
weird_log <- function(x) {
if (check(x)) return(-Inf)
log(x)
}
check <- function(x) {
x <= 0
}
weird_log(10) # 2.302585
weird_log(-10) # -Inf
更常见的是在检查失败时要抛出错误的用例:
weird_log <- function(x) {
check(x)
log(x)
}
check <- function(x) {
if(x <= 0) stop("x <= 0", call. = FALSE)
}
weird_log(10) # 2.302585
weird_log(-10) # Error: x <= 0
答案 1 :(得分:1)
因为答案实际上并不能回答问题,所以这里是如何完成所要求的事情。
returnFromParent <- function() {
call <- rlang::expr(return())
rlang::eval_bare(call, env = parent.frame())
}
foo <- function(){
returnFromParent()
print("you should not see this")
}
foo()
我发现做到这一点的唯一方法是使用rlang。