我正在试图找出data.table' invalid .selfref'我使用下面的代码得到的错误。
library(data.table)
library(dplyr)
DT <- data.table(aa=1:100, bb=rnorm(n=100), dd=gl(2,100))
DT <- DT %.% group_by(dd, aa) %.% summarize(m=mean(bb))
DT <- DT[, ee := 3]
最后一行抛出错误。这里有建议将最后一行写为DT$ee <- 3
,但并未真正解释其工作原理(以及:=
没有&t; t)并且是初学者data.table用户也不会感觉像是正确的data.table成语。
它与那里的dplyr线有关,显然会改变DT数据表。但当我将该行(及其后续行)更改为DDT <- DT %.% group_by() ...
时,我仍然会从DT[, ee := 3]
行获得selfref错误。
一直在检查各种来源,但所有信息都没有真正降下来,所以我仍然感到困惑。
R version 3.1.0 (2014-04-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=Dutch_Netherlands.1252 LC_CTYPE=Dutch_Netherlands.1252
[3] LC_MONETARY=Dutch_Netherlands.1252 LC_NUMERIC=C
[5] LC_TIME=Dutch_Netherlands.1252
attached base packages:
[1] graphics grDevices utils datasets stats methods base
other attached packages:
[1] dplyr_0.2 data.table_1.9.2 ggplot2_1.0.0
loaded via a namespace (and not attached):
[1] assertthat_0.1 colorspace_1.2-4 digest_0.6.4 grid_3.1.0
[5] gtable_0.1.2 MASS_7.3-31 munsell_0.4.2 parallel_3.1.0
[9] plyr_1.8.1 proto_0.3-10 Rcpp_0.11.2 reshape2_1.4
[13] scales_0.2.4 stringr_0.6.2 tools_3.1.0
答案 0 :(得分:4)
我刚刚运行了你的代码,我看到了问题。 data.table
过度分配列指针的向量(以便稍后通过引用有效地添加列),并且当一个操作(很可能无意中)删除了过度分配时会发生此警告。
让我尝试使用Matt的slide 45演示文稿中的useR 2014来解释过度分配。顶部的(蓝色和黄色)框对应于列指针的向量,箭头表示每个指针指向的数据。
左图显示了如何向cbind
添加(或data.frame
)列的工作原理。 cbind
列基本上会导致(深或浅)副本,从而导致列指针向量(以黄色显示)和数据(现在又有一列)的新位置。
右图显示data.table
方式,由于在创建data.table
时过度分配,因此开始时有超过3个蓝框。通过使用:=
,甚至没有浅拷贝。在停留之前存在的列指针向量以及下一个未使用的超分配框用于分配新列。
这是关于差异以及 over-allocation 的含义。
现在警告告诉您,无论您执行的操作是否已删除此过度分配 - 意味着额外蓝色框已消失!所以,我们不能再通过引用添加列,直到我们过度分配 再次(这是不必要的,应该避免,但因为它已经消失了,我们做的是什么下一个最好的事情)。
我的猜测是你的dplyr
语法以某种方式消除了这种过度分配,当你使用:=
和data.table
再次过度分配之前,下一步将被捕获按引用列(这将导致浅拷贝)。
如果我以data.table
方式执行此操作:
DT <- DT[, list(m=mean(bb)), by=list(dd,aa)]
DT[, ee := 3]
它运作得很好。
我没时间调查 dplyr
来验证或了解这是做什么的。