您能让R函数在评估时看到其自身形式的值吗?
在R语言中,假设我有一个函数ff(jj,kk,mm)。我希望调用函数(或在交互会话中调用人)能够使mm在调用时以任意方式依赖jj和kk 对于具体性,假设:您能让R函数在评估时看到其自身形式的值吗?,r,dynamic,arguments,scoping,lexical-scope,R,Dynamic,Arguments,Scoping,Lexical Scope,在R语言中,假设我有一个函数ff(jj,kk,mm)。我希望调用函数(或在交互会话中调用人)能够使mm在调用时以任意方式依赖jj和kk 对于具体性,假设: ff <- function(jj, kk, mm){ xx <- jj + kk out<- xx/mm out } 这将产生: Error in ff(2, 3, (jj * kk)) : object 'jj' not found 在计算mm之前,即在计算jj和kk之后,不会抛出此错误 评估成
ff <- function(jj, kk, mm){
xx <- jj + kk
out<- xx/mm
out
}
这将产生:
Error in ff(2, 3, (jj * kk)) : object 'jj' not found
在计算mm
之前,即在计算jj
和kk
之后,不会抛出此错误
评估成功。因此,它们将在不同的范围内进行第二次评估
规则。我知道这是R标准范围界定。我在问,我能写这封信吗
函数的作用是让我给mm一个简单的数字,或者一个
其他形式参数,前提是这些参数之前已经或可以进行评估
mm
是必需的吗
请注意,我不是在问我是否应该这样做。我会坚定地假装对那些
就后一个问题提出意见
我也不是在问我是否可以预先计算jj,并将简化后的数字交给ff。我知道
这是一个似是而非的答案,但它不起作用的原因我已经简化了
问题。就目前情况而言,您的函数
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
ff另外,周围的paren(jj*kk)
也不是必需的-没有它们也可以工作。谢谢Josh!这正是工作。这可能值得提出自己的问题,但我确实有一个后续问题。如果您想引用函数自己的环境,如:LookHere@andrewH--Hi。我现在没有时间解释,但听起来你可能需要类似于look的东西来说明你为什么不应该这样做,它导致:jj=99;kk=101;ff(2,3,(jj*kk))
忽略刚才设置的jj
和kk
的值,因为当它们分别等于2和3时,在函数内部进行计算。这会让任何没有阅读ff
文档的R用户感到惊讶……我不确定我是否了解您。如果我有一个函数,你可能会觉得有用
ff <- function(jj, kk, mm){
mm <- eval(substitute(mm))
xx <- jj + kk
out<- xx/mm
out
}
ff(2, 3, (jj*kk))
## [1] 0.8333333