R:为什么一个S4对象可以有多个变量名



如果我将一个普通对象分配给变量foo,然后分配给foo <- bar,那么foobar将是两个独立的对象。然后,如果我最终修改barfoo将不会被修改——反之亦然。

然而,这与S4对象不同。具体来说,如果我修改了分配给bar的对象,那么该对象(此处:也是foo(的所有分配都将受到影响。这里有一个例子:

foo <- openxlsx::createWorkbook()
openxlsx::addWorksheet(foo, "Sheet 1")
writeData(foo, sheet=1, x="Hi")
openxlsx::readWorkbook(foo)
# > Hi
bar <- foo
writeData(bar, sheet=1, x="Hello")
openxlsx::readWorkbook(foo)
# > Hello

为什么S/R社区认为这种作业实践是有用的,而R语言在作业方面的工作方式却截然不同?

您的断言是错误的---S4对象通常不会表现出这种行为:

> cl <- setClass("test",slots=c(x="integer"))
> z1 <- cl(x=1L)
> z2 <- z1
> identical(z1,z2)
[1] TRUE
> z2@x <- 2L
> identical(z1,z2)
[1] FALSE

这种行为特定于foobar的类,可能与它们是连接有关,它们可以重复,但最终可能仍然连接到同一个文件。

最新更新