gpt4 book ai didi

r - 了解 data.table 无效 .selfref 警告

转载 作者:行者123 更新时间:2023-12-05 01:03:37 26 4
gpt4 key购买 nike

我试图找出我使用下面的代码得到的 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但并没有真正解释它为什么起作用(而 := 不起作用)并且作为一个初学者 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

最佳答案

我刚刚运行了你的代码,我看到了问题所在。 data.table过度分配列指针向量(用于稍后通过引用有效地添加列)并且当操作(很可能是无意中)删除过度分配时会发生此警告。

让我试着用 slide 45 来解释过度分配来自马特的 useR 2014介绍。顶部的(蓝色和黄色)框对应列指针的向量,箭头显示每个指针指向的数据。

左图以图形方式描绘了如何向 cbind 添加(或 data.frame)一列作品。 cbind对列进行基本上会产生(深或浅)副本,从而为列指针(以黄色显示)和数据(现在又多了一个列)的向量产生一个新位置。

右图为data.table方式,其中有超过 3 个蓝色框开始,由于过度分配而 data.table创建。并通过使用 := ,甚至没有制作浅拷贝。之前存在的列指针向量保持原样,下一个未使用的过度分配框用于分配新列。

这是关于差异以及此处过度分配的含义。

现在警告告诉你,无论你做什么操作都删除了这个过度分配——这意味着多余的蓝色框不见了!所以,我们不能再通过引用添加列,直到我们过度分配 再次 (这是不必要的,应该避免,但既然它已经消失了,我们会做下一个最好的事情)。

我的猜测是您的 dplyr语法以某种方式消除了这种过度分配,当您使用 := 时,该过度分配会在下一步中被捕获。和 data.table在通过引用添加新列之前再次过度分配(这将导致浅拷贝)。

如果我这样做了 data.table道路:

DT <- DT[, list(m=mean(bb)), by=list(dd,aa)]
DT[, ee := 3]

它工作得很好。

我没时间看 dplyr现在验证或找出这是做什么的。

更新:已建议必要的更改作为拉取请求 here .

关于r - 了解 data.table 无效 .selfref 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24471276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com