我无法理解如何使用嵌套函数调用和参数评估。
这是一个简单的例子。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)
因此,添加x
到参数列表中的解决方案lowerfunction
通常不适用。
所以问题是eval
应该myfun
从一个环境(包命名空间,或者在这种情况下从环境lowerfunction
)获取的定义,并在其他环境中评估参数,myfun
即在环境中topfunction
。