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

Flo*_*ald 28 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
Run Code Online (Sandbox Code Playgroud)

即分配后将表格打印到屏幕上.有没有办法阻止data.table在分配新列z后显示新表?我知道我可以通过说来阻止这种行为

DT <- copy(DT[,z:=1:nrow(DT)])
Run Code Online (Sandbox Code Playgroud)

但这是为了挫败:=(旨在避免复制)的目的.

And*_*rie 29

既然<-.data.table不复制,你可以使用<-:

创建一个data.table对象:

library(data.table)
di <- data.table(iris)
Run Code Online (Sandbox Code Playgroud)

创建一个新列:

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. 
Run Code Online (Sandbox Code Playgroud)

还值得记住的是,R仅以交互模式打印对象的值.

因此,在批处理模式下,您只需使用:

di[, z:=1:nrow(di)]
Run Code Online (Sandbox Code Playgroud)

在批处理模式下作为脚本运行时,这不会产生任何输出.


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]无形地返回返回值,那么?

  • 我们尝试过但是R内部强制可见性[.FunTab的eval列(参见src/main/names.c)的[0意味着强制 R_Visible打开(参见R-Internals第1.6节).因此,当我们试图 invisible()或设置R_Visible0直接自己,eval在的src/main/eval.c将再次迫使它.
  • 在习惯了这种行为之后,你可能会越来越喜欢它(我们有).毕竟,我们使用多少次分配<-,然后立即查看数据以确定它没问题?
  • 我们可以混合:=成一个j也返回数据; 混合更新并在一个查询中选择.检测是否j仅仅更新(然后表现不好)可能会令人困惑.

Matthew Dowle的第二次更新:

我们现在找到了一个解决方案,v1.8.3在:=使用时不再打印结果.我们将更新FAQ 2.21和2.22.

  • +10我没想过尝试`DT <-DT [i,col:= value]`.变量名的重复不是很好,但有效.这让我知道如何让`DT [i,col:= value]`无形地返回:现在提升为[FR#2128](https://r-forge.r-project.org/tracker/index. php?func = detail&aid = 2128&group_id = 240&atid = 978),谢谢! (2认同)
  • 我注意到`:=`在RStudio中使用Knit HTML时产生输出.这是出乎意料的.为什么knitr在没有发送到控制台时在生成的HTML文件中产生输出?在这种情况下有没有办法抑制输出?这是一个新问题吗? (2认同)