2

代入演算子なしで呼び出すことができる R の初期化後の置換メソッドをいくつか用意したいと思います。

たとえば、次のようになります。

setNode(o)のようなものを呼び出さなくても、オブジェクト o のスロットを呼び出して置換できるようにしたいと考えていますsetnode(o) <- c("foo", "bar")。私がこれをしたい理由select.listは、メソッドのユーザーが割り当ての詳細を認識しなくても、これらに対話性があること (つまり) が必要だからです。

これは可能ですか?

4

1 に答える 1

2

私はあなたのユースケースを本当に理解していませんが...次のような構文

o <- setNode(o, c("foo", "bar"))

ゆがみを経験しない場合は、のoスロット値を置き換えるのではなく、 Rの通常のコピーオンチェンジルールに従って、のコピーを作成しoます。交換方法

node(o) <- c("foo", "bar")

その場で更新oします。設定は使用に暗黙的であるため、私はnodeではなくを使用します。たとえば、オブジェクトの構造に関連することを何もしなければならsetNodeないということは何もありません。node<-

setClass("Node", representation(n="integer", value="character"),
         prototype=prototype(n=0L))
setGeneric("node<-", function(x, ..., value) standardGeneric("node<-"))
setReplaceMethod("node", "Node", function(x, ..., value) {
    x@n <- x@n + 1L
    x@value <- toupper(value)
    x
})

その後

> o <- new("Node")
> o
An object of class "Node"
Slot "n":
[1] 0

Slot "value":
character(0)

> node(o) <- c("foo", "bar")
> o
An object of class "Node"
Slot "n":
[1] 1

Slot "value":
[1] "FOO" "BAR"

これがあなたの「双方向性が欲しい」という願望とどのように関連しているかはわかりません。次のように、より呼び出しに似た構文を持つコードを記述できます。

> do.call("node<-", list(x=o, value=c("foo", "bar")))
An object of class "Node"
Slot "n":
[1] 2

Slot "value":
[1] "FOO" "BAR"

しかし、これは。と何も変わりませんnode(o) <- ...

setOldClass提供されたインターフェースではなく、クラスのコンテンツに適切な場合は、参照クラスを選択します(これらは、S4の上に構築されているため、S4-ismsがここに適用されます)。たとえば、データベース接続は、参照クラスに適している場合があります。これは、対話しているディスク上にエンティティが1つしかないためです。ほとんどの場合、参照クラスを使用すると、変更時のコピーのセマンティクスを期待しているRユーザーを混乱させることになります。

于 2012-01-30T19:54:09.310 に答える