-2

do.call("...",...)Rの標準関数のように、参照クラスのオブジェクトの関数を文字列で呼び出す簡単な方法はありますか?

4

1 に答える 1

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インスタンスから独立しているように見えますが、実際にはインスタンスの環境で定義されています。

> 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))
于 2013-09-12T16:38:32.953 に答える