子集数据表时分配功能

时间:2019-05-28 15:56:04

标签: r data.table subset

有人无法执行以下操作有特定原因吗?

v <- data.table( A = 1:2, B = vector("list", 2) )
#    A B
# 1: 1  
# 2: 2  

v[ A == 1, B := list( identity ) ]
# RHS of assignment is not NULL, not an an atomic vector (see ?is.atomic) and not a list column.

请注意,B 一个列表列。另一方面,可能会发生以下情况(尽管会发出警告):

v[ A == 1, B := list(2) ]

2 个答案:

答案 0 :(得分:1)

我们可以将函数包装在list中,因为它是函数

v[A == 1,  B := list(list(identity))]
v
#   A          B
#1: 1 <function>
#2: 2           

答案 1 :(得分:1)

分配给列表列时,data.table中的经验法则是“您总是比预期多需要list()

v[ A == 1, B := list(list(identity)) ]

做您想要的。您的示例使用整数值的原因是,在这种情况下,data.table自动将2强制转换为list(2)(但如您所述,带有警告)。