gpt4 book ai didi

r - 如何在R中的另一个函数内评估函数调用的参数

转载 作者:行者123 更新时间:2023-12-04 14:46:14 25 4
gpt4 key购买 nike

我无法理解如何使用嵌套函数调用和参数评估。

这是一个简单的例子。我有一个顶级函数 topfunction带有一个数字参数。内部 topfunction我调用另一个函数 lowerfunction哪个参数是对 lowerfunction 中定义的函数的调用.

topfunction<-function(x){  
lowerfunction(myfun(first=x[1],second=x[2],third=if(length(x)>2) x[3]))
}

lowerfunction<-function(mycall){

myfun<-function(first,second=0,third=NULL){
print(first)
print(second)
print(third)
}

mc<-match.call(definition = myfun, call = match.call()[[2]])
eval(mc)
}

内部 lowerfunction我用 match.call 捕获函数调用,并尝试评估通话。但作为变量 x仅在 topfunction 的环境中定义,评估失败:
topfunction(x=1:3)
Error in print(first) : object 'x' not found

我知道我可以改变路线
lowerfunction(myfun(first=x[1],second=x[2],third=if(length(x)>2) x[3]))

作为
lowerfunction(substitute(myfun(first=x[1],second=x[2],third=if(length(x)>2) x[3])))

topfunction ,但在我的实际应用中 topfunction由用户构建,因此解决方案应该以某种方式发生在 lowerfunction 中甚至在 myfun等级。但由于他们已经丢失了关于 x的信息。 ,不知道能不能实现?

在实际应用中 topfunction使用 lowerfunction 构建模型并计算其似然性,而 lowerfunction 的参数是一个可以包含函数调用的公式,它将通过 eval 进行评估.这些函数仅在 lowerfunction 中定义.另外, lowerfunction也可以直接调用,即
x<-1:3
lowerfunction(myfun(first=x[1],second=x[2],third=if(length(x)>2) x[3]))
# or
lowerfunction(myfun(first=x1,second=2)

所以解决方案里面加 xlowerfunction 的参数列表一般不适用。

所以问题是 eval应该采用 myfun 的定义从一个环境(包命名空间,或者在这种情况下来自 lowerfunction 的环境),并评估 myfun 的参数在其他环境中,即在 topfunction 的环境中.

最佳答案

这是一个相对简单的问题,但由于您正在进行非常不标准的评估,因此您需要创建一个新的 environment。并确保可以从该环境访问您需要的所有对象。

g <- function(x){  
f1(f2(x[1], x[2], if(length(x) > 2) x[3]))
}

f1 <- function(mycall, parent = parent.frame()) {
# Parent contains x
# New environment that contains f2 and inherits from the parent
env <- new.env(parent = parent)
env$f2 <- function(first, second = 0,third = NULL) {
print(first)
print(second)
print(third)
}

# More idiomatic way of getting unevaluated expression
expr <- substitute(mycall)
eval(expr, env)
}

g(1:3)

我在关于 domain specific languages 的章节中描述了类似的技术。

关于r - 如何在R中的另一个函数内评估函数调用的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18586758/

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