在v1.8.3之前的R {data.table}中使用`:=`时如何抑制输出?

时间:2012-07-06 09:31:21

标签: r data.table

在通过引用分配新列之后,有没有办法阻止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)])

但这正在击败:=(旨在避免副本)的目的。

2 个答案:

答案 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设置为0eval   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]