如果我将一个普通对象分配给变量foo
,然后分配给foo <- bar
,那么foo
和bar
将是两个独立的对象。然后,如果我最终修改bar
,foo
将不会被修改——反之亦然。
然而,这与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
这种行为特定于foo
和bar
的类,可能与它们是连接有关,它们可以重复,但最终可能仍然连接到同一个文件。