你能否启用R函数来评估自己的形式值?

时间:2014-07-11 06:55:54

标签: r dynamic arguments scoping lexical-scope

在R语言中,假设我有一个函数ff(jj,kk,mm)。我希望调用函数(或调用人在交互式会话中)能够在调用时使jj和kk以任意方式取决于mm。

具体而言,假设:

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之前,即在jjkk之后,才会抛出此错误 评估成功。因此,他们将在第二次进行不同的范围评估 规则。我知道这是R标准范围。我问,我可以写 以这样一种方式运作,它让我可以用一个简单的数字或一个函数 其他形式论证,只要这些论点已经或可以在之前进行评估 需要mm

请注意,我不是在问我是否应该这样做。我会坚决地假装对那些有礼貌的人有礼貌 提出对后一个问题的看法。

我也不会问我是否可以预先计算jj并预先计算出预先消化的数字。我知道 这是一个看似合理的答案,但由于我已经简化了原因,它不起作用 问题。

1 个答案:

答案 0 :(得分:5)

目前,您的功能ff()不起作用,因为supplied arguments are evaluated in the context of the calling environmentjjkk的有利位置都不可见。

要评估在函数自己的评估框架的上下文中提供给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