我发现data.table
的逻辑与以下两个操作不一致:
操作1:
df1<-data.table(a=c(1,2))
list1<-list(c(1,2), 1)
df1[,b:=list1]
#> df1
# a b
#1: 1 1,2
#2: 2 1
操作2:(data.table将单例列表视为我提供了一个向量)
df2<-data.table(a=c(1))
list2<-list(c(1,2))
df2[, b:=list2]
#Warning message:
#In `[.data.table`(df2, , `:=`(b, list2)) :
# Supplied 2 items to be assigned to 1 items of column 'b' (1 unused)
#> df2
a b
#1: 1 1
我希望在第二种情况下的输出是:
# a b
#1: 1 1,2
我可以统一两种情况:
df1[, b:=list(list1)]
df2[, b:=list(list2)]
这是最好的解决方案吗?有没有选择data.table来嵌套一个单例列表?在我使用b:=list(list1)
的第一种情况下,是否没有性能方面的额外操作?
答案 0 :(得分:1)
从https://stackoverflow.com/a/54797914/2490497复制我的答案
我无法提出重复的建议,因为“此问题的答案没有被接受或接受
“。
这是一个很好的问题,涉及关于:=
运算符的设计决策。
对于使用:=
作为运算符的简单调用,例如col := val
,我们决定将val
自动包装到列表中。做出此决定是为了使用户更方便地分配单个列。
使用函数调用表单时,":="(col = val)
不再将val
包装到列表中。它已经是扩展形式。 :=
充当list
的别名,但会就地更新 。您始终可以通过将:=
更改为list
(或.
)(如.(col = val)
)来检查更新的列。
即使使用:=
作为运算符,您仍必须提供RHS作为正在创建2列以上的列,c("col1","col2") := list(val1, val2)
的列表。