data.table assigne-by-reference `:=` 的标准形式和函数形式的不同结果
different results for standard form and functional form of data.table assigne-by-reference `:=`
标准中的 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)
。
标准中的 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)
。