在R语言中,假设我有一个函数ff(jj, kk, mm)。我希望调用函数(或在交互式会话中调用人类)能够使mm在调用时以任意方式依赖jj和kk。
为具体化,设:
ff <- function(jj, kk, mm){
xx <- jj + kk
out<- xx/mm
out
}
然后在运行时,我想设置mm <- jj*kk
。例如:
ff(2, 3, (jj*kk))
产生:
Error in ff(2, 3, (jj * kk)) : object 'jj' not found
这个错误不会被抛出,直到mm
被求值,即在jj
和kk
已经被求值之后评估成功。因此,它们将使用不同的作用域进行第二次求值规则。我知道这是r标准作用域。我在问,我能不能写函数,这样我就可以给mm一个简单的数,或者一个函数其他形式论证,前提是这些论证之前已经或可以被评估过需要mm
吗?
请注意,我不是在问我是否应该这样做。我会坚决装出一副很有礼貌的样子请就后一个问题发表意见。
我也不是在问我是否可以预先计算jj并交出简化后的数字。我知道这是一个貌似合理的答案,但它并不成立,原因我已经简化了这个问题。
就目前而言,您的函数ff()
不起作用,因为提供的参数是在调用环境的上下文中进行评估的,从这个有利的角度来看,jj
和kk
都是"可见的"。
要在函数自身的求值框架上下文中计算提供给mm
的语句,使用eval(substitute())
,如下所示:
ff <- function(jj, kk, mm){
mm <- eval(substitute(mm))
xx <- jj + kk
out<- xx/mm
out
}
ff(2, 3, (jj*kk))
## [1] 0.8333333