由于<-.data.table
不制作副本,您可以使用<-
:
创建一个 data.table 对象:
library(data.table)
di <- data.table(iris)
创建一个新列:
di <- di[, z:=1:nrow(di)]
di
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species z
# [1,] 5.1 3.5 1.4 0.2 setosa 1
# [2,] 4.9 3.0 1.4 0.2 setosa 2
# [3,] 4.7 3.2 1.3 0.2 setosa 3
# [4,] 4.6 3.1 1.5 0.2 setosa 4
# [5,] 5.0 3.6 1.4 0.2 setosa 5
# [6,] 5.4 3.9 1.7 0.4 setosa 6
# [7,] 4.6 3.4 1.4 0.3 setosa 7
# [8,] 5.0 3.4 1.5 0.2 setosa 8
# [9,] 4.4 2.9 1.4 0.2 setosa 9
# [10,] 4.9 3.1 1.5 0.1 setosa 10
# First 10 rows of 150 printed.
还值得记住的是,R 仅在交互模式下打印对象的值。
因此,在批处理模式下,您可以简单地使用:
di[, z:=1:nrow(di)]
在批处理模式下作为脚本运行时,这不会产生任何输出。
来自 Matthew Dowle 的更多信息:
另请参阅常见问题解答 2.21 和 2.22:
2.21 为什么要DT[i,col:=value]
返回整个的DT
?我希望没有可见值(与 一致<-
),或者包含更新了多少行的消息或返回值。数据确实已通过引用进行更新并不明显。
这样复合语法就可以工作了;例如,DT[i,done:=TRUE][,sum(done)]
。当详细程度打开时,将返回更新的行数,无论是基于每个查询还是全局使用options(datatable.verbose=TRUE)
.
2.22 好的,但是不能DT[i,col:=value]
无形地返回返回值,那么呢?
- 我们试图但 R 在内部强制可见性 for
[
。FunTab 的 eval 列(参见 src/main/names.c)的[
值0
表示强制
R_Visible
开启(参见 R-Internals 第 1.6 节)。因此,当我们尝试
invisible()
或直接设置R_Visible
为0
自己时,eval
在 src/main/eval.c 中会再次强制它打开。
- 在习惯了这种行为之后,你可能会变得更喜欢它(我们有)。毕竟,我们使用子分配多少次
<-
,然后立即查看数据以检查它是否正常?
- 我们可以混合
:=
成一个j
也返回数据的;混合更新并在一个查询中选择。检测是否j
单独更新(然后行为不同)可能会令人困惑。
Matthew Dowle 的第二次更新:
我们现在找到了解决方案,v1.8.3 在使用时不再打印结果:=
。我们将更新常见问题解答 2.21 和 2.22。