标准形式和数据的功能形式的不同结果。参考配置`:=`

时间:2017-05-19 10:02:32

标签: r data.table assign

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

这是我最初问这个问题的主要编辑。

1 个答案:

答案 0 :(得分:2)

这是一个很好的问题,涉及关于:=运算符的设计决策。

对于使用:=作为运算符的简单调用,例如col := val,我们决定将val自动包装到列表中。做出此决定是为了使用户更方便地分配单个列。

使用函数调用表单时,":="(col = val)不再将val包装到列表中。它已经是扩展形式。 :=充当list的别名,但会就地更新 。您始终可以通过将:=更改为list(或.)(如.(col = val))来检查更新的列。

即使使用:=作为运算符,您仍必须提供RHS作为正在创建2列以上的列,c("col1","col2") := list(val1, val2)的列表。