按字符串调用引用类函数

时间:2013-09-12 15:15:11

标签: r reference-class

对于R中的标准函数,是否有一种简单的方法可以通过字符串调用引用类的对象函数,如do.call("...",...)

1 个答案:

答案 0 :(得分:2)

这是一个类和实例

A <- setRefClass("A",
         fields=list(x="numeric"),
         methods=list(value=function() x))
a <- A(x=10)

调用value方法的一种时髦方法是

> a[["value"]]
Class method definition for method value()
function () 
x
<environment: 0x123190d0>

建议我们可以做

> do.call("[[", list(a, "value"))()
[1] 10

这有一些非常奇怪的语义 - do.call返回的函数似乎独立于实例,但实际上是在实例'environment

中定义的
> fun = do.call("[[", list(a, "value"))
> fun
Class method definition for method value()
function () 
x
<environment: 0x1c7064c8>
> a$x=20
> fun()
[1] 20

此外,函数以“懒惰”方式实例化,因此a[["value"]]仅在已通过a$value()调用时才返回函数。正如?setRefClass所讨论的那样,我认为可以在使用

进行对象初始化时强制定义方法
A <- setRefClass("A",
         fields=list(x="numeric"),
         methods=list(
           initialize=function(...) {
               usingMethods("value")
               callSuper(...)
           },
           value=function() x))