data.tabel的引用分配似乎有一个细微的差别:=标准中的=功能形式。
标准形式强制RHS到矢量,功能形式没有。一个细节,但没有记录,因为我相信。
library(data.table)
dt <- data.table(a = c('a','b','c'))
v <- c('A','B','C')
l <- list(v)
all.equal(copy(dt)[, new := v], copy(dt)[, `:=` (new = v)])
# [1] TRUE
all.equal(copy(dt)[, new := l], copy(dt)[, `:=` (new = l)])
# [1] "Datasets have different column modes. First 3: new(character!=list)"
copy(dt)[, new := l][]
# a new
# 1: a A
# 2: b B
# 3: c C
copy(dt)[, `:=` (new = l)][]
# a new
# 1: a A,B,C
# 2: b A,B,C
# 3: c A,B,C
这是我最初问这个问题的主要编辑。
这是关于:=
运营商的设计决策的非常好的问题。
对于使用:=
作为运算符的简单调用,如col := val
,我们决定自动将val
包装到列表中。这个决定是为了让用户更方便地分配单列。
当您使用函数调用表单时,":="(col = val)
我们不再将val
包装到列表中。它已经是扩展形式。 :=
表现为list
的别名,但就地更新。您可以随时通过将:=
更改为list
(或.
)(例如.(col = val)
)来检查更新列的内容。
即使使用:=
作为运算符,您仍然必须提供RHS作为列表,您正在创建2+列c("col1","col2") := list(val1, val2)
。