gpt4 book ai didi

r - 推送返回父函数

转载 作者:行者123 更新时间:2023-12-05 08:33:13 25 4
gpt4 key购买 nike

有没有办法强制父函数返回一个输出?假设我有一个“做某事”的功能,并且在每个功能的开头都想“检查某事”。如果检查失败,我想返回“其他东西”。

在我下面的示例中,“做某事”是对数,“检查某事”意味着检查变量是否为非负数,而“其他事情”是负无穷大。

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

一种解决方案是,如果检查发现问题,则从检查函数返回“其他内容”,否则返回 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() 中,但是有没有办法将所有功能都包含在其中?


在实际问题中,checking function 做的不止一个比较,而是在多个function中使用,所以有必要单独设置。返回 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
}
}

最佳答案

因为答案实际上并没有回答这里的问题是如何做你问的。

returnFromParent <- function() {
call <- rlang::expr(return())
rlang::eval_bare(call, env = parent.frame())
}

foo <- function(){
returnFromParent()
print("you should not see this")
}

foo()

我发现唯一的方法是使用 rlang。

关于r - 推送返回父函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42858804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com