【发布时间】:2020-10-25 15:29:30
【问题描述】:
检查这个玩具代码:
> x <- data.table(a = 1:2)
> foo <- function(z) { z[, b:=3:4] }
> y <- foo(x)
> x[]
a b
1: 1 3
2: 2 4
似乎 data.table 是通过引用传递的。这是故意的吗?这有记录吗?我确实阅读了文档,但找不到有关此行为的提及。
我不是询问 R 的文档化引用语义(在 :=、set*** 和其他一些)。我在问是否应该将 data.table 完整对象作为函数参数通过引用传递。
编辑:按照@Oliver 的回答,这里有一些更奇怪的例子。
> dt<- data.table(a=1:2)
> attr(dt, ".internal.selfref")
<pointer: 0x564776a93e88>
> address(dt)
[1] "0x5647bc0f6c50"
>
> ff<-function(x) { x[, b:=3:4]; print(address(x)); print(attr(dt, ".internal.selfref")) }
> ff(dt)
[1] "0x5647bc0f6c50"
<pointer: 0x564776a93e88>
所以不仅.internal.selfref 与调用者的dt 副本相同,地址也是如此。它确实是同一个对象。 (我认为)。
data.frames 并非完全如此:
> df<- data.frame(a=1:2)
> address(df)
[1] "0x5647b39d21e8"
> ff<-function(x) { print(address(x)); x$b=3:4; print(address(x)) }
>
> ff(df)
[1] "0x5647b39d21e8"
[1] "0x5647ae24de78"
也许根本问题是常规 data.table 操作不会触发 R 的 copy-on-modify 语义?
【问题讨论】:
-
@Roland 谢谢 - 但这个小插图(以及我能找到的所有其他文档)没有将 data.table 语义作为函数参数讨论
-
再读一遍。它确实准确地描述了您在问题中表现出的行为。
-
@Roland 你说得对,那里提到过,我错过了。没有真正解释,但明确提及。
标签: r data.table