私はあなたのユースケースを本当に理解していませんが...次のような構文
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ユーザーを混乱させることになります。