在通过引用分配新列之后,有没有办法阻止data.table
打印新的data.table?我收集的标准行为是
library(data.table)
example(data.table)
DT
# x y v
# 1: a 1 42
# 2: a 3 42
# 3: a 6 42
# 4: b 1 11
# 5: b 3 11
# 6: b 6 11
# 7: c 1 7
# 8: c 3 8
# 9: c 6 9
DT[,z:=1:nrow(DT)]
# x y v z
# 1: a 1 42 1
# 2: a 3 42 2
# 3: a 6 42 3
# 4: b 1 11 4
# 5: b 3 11 5
# 6: b 6 11 6
# 7: c 1 7 7
# 8: c 3 8 8
# 9: c 6 9 9
即。分配后,表格将被打印到屏幕上。有没有办法阻止data.table在分配新列z后显示新表?我知道我可以通过说
来阻止这种行为DT <- copy(DT[,z:=1:nrow(DT)])
但这正在击败:=
(旨在避免副本)的目的。
答案 0 :(得分:27)
由于<-.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的更多信息:
另见FAQ 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]
的返回值吗?
- 我们尝试过但内部强制
[
的可见性。的价值 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不再打印结果。我们将更新FAQ 2.21和2.22。
答案 1 :(得分:0)
对于非常长的数据表名称,似乎以下内容在性能上是等效的,并且可以更短(我更喜欢短名称,但有时需要更长的名称才能记住对象真正包含的内容):
invisible(Very.Long.Data.Table[i,col:=value])
比较:
Very.Long.Data.Table<-Very.Long.Data.Table[i,col:=value]