3

如何更改以下行为,使对象 b 和 c 中的插槽名称指向同一个对象 a?

A<-setClass(Class = "A",
            slot = c(name = "character"
            )
)
B<-setClass(Class = "B",
            slot=c(name = "A"
         )
)


a<-A(name="abc")
b<-B(name=a)
c<-B(name=a)

b@name@name="ABC"
b@name@name==c@name@name
4

1 回答 1

5

S4 类具有标准的 R 写时复制语义,这意味着更新对象没有副作用。对于您想要的语义类型,请使用参考类,如上所述?ReferenceClasses

NameRef <- setRefClass("NameRef", fields=c(name="character"))
A <- setClass("A", slots=c(nameRef="NameRef"))

接着

> a = b = A(nameRef=NameRef(name="abc"))
> a@nameRef$name = "ABC"
> a@nameRef$name == b@nameRef$name
[1] TRUE

引用行为会让您的 R 用户感到惊讶,无论它在其他编程环境中多么熟悉,因此请谨慎使用。

于 2013-09-05T11:44:41.673 回答