我对data.table
的按引用传递属性有一些困惑。一些操作似乎会“破坏”引用,我想确切地了解正在发生的事情。
从另一个data.table
创建data.table
(通过<-
),然后通过:=
更新新表时,原始表也会被改变。根据预期,如下所示:
?data.table::copy
和stackoverflow: pass-by-reference-the-operator-in-the-data-table-package
以下是一个示例:
library(data.table)
DT <- data.table(a=c(1,2), b=c(11,12))
print(DT)
# a b
# [1,] 1 11
# [2,] 2 12
newDT <- DT # reference, not copy
newDT[1, a := 100] # modify new DT
print(DT) # DT is modified too.
# a b
# [1,] 100 11
# [2,] 2 12
然而,如果我在上述<-
赋值和:=
的行之间插入一个非:=
的修改,DT
就不再被修改:
DT = data.table(a=c(1,2), b=c(11,12))
newDT <- DT
newDT$b[2] <- 200 # new operation
newDT[1, a := 100]
print(DT)
# a b
# [1,] 1 11
# [2,] 2 12
看起来 newDT$b[2] <- 200
这行代码会"破坏"引用。我猜这可能会触发某种复制,但我想完全了解R是如何处理这些操作的,以确保不会在我的代码中引入潜在的错误。
如果有人能向我解释一下,我会非常感激。
<-
而不是=
进行基本赋值(例如,Google的https://google.github.io/styleguide/Rguide.xml#assignment)。但这意味着,使用data.table操作将无法像操作数据框一样运作,因此它远非数据框的即插即用替代品。 - cmo