在data.table
对象的列中对某些值进行子集设置时,该列的属性将保留下来,如下例所示。
library(data.table)
set.seed(1L)
dt1 <- data.table(a=runif(5L))
setattr(dt1$a, "foo", "bar")
dt1[1:2, a:=runif(.N)]
dt1[1:2, a]
## [1] 0.8983897 0.9446753
## attr(,"foo")
## [1] "bar"
但是,如果重新定义整个列,则会丢失属性。
dt1[, a:=runif(.N)]
dt1[1:2, a]
## [1] 0.6607978 0.6291140
我猜这种现象是由于这样的事实:当对一列的某些值进行子集化时,一个人仅通过引用来更新那些元素,而当对整个列进行子集化时,一个人实际上并没有更新该列的某些元素,而是替换整列(仍通过引用)。
我知道,当人们想更改列的类而不必删除它并重新分配它时,这种行为是很好的(例如,即使dt1[, a:=as.integer(a)]
先前是类{{ 1}}),但是我想知道是否有一种方法可以解决这个问题,甚至在替换所有值时也可以强制该列保留其原始属性(显然包括其类)。
谢谢!