在v1.8.3之前的R {data.table}中使用`:=`时如何抑制输出? [英] how to suppress output when using `:=` in R {data.table}, prior to v1.8.3?

查看:138
本文介绍了在v1.8.3之前的R {data.table}中使用`:=`时如何抑制输出?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有办法防止 data.table 在通过引用分配新列后打印新的data.table?我收集的标准行为是

  library(data.table)
example(data.table)
DT
#xyv
#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)]

#xyvz
#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
# c 1 7 7
#8:c 3 8 8
#9:c 6 9 9

ie表格在分配后打印到屏幕。有没有办法停止data.table在分配新列z后显示新表?我知道我可以通过

  DT < -  copy(DT [,z:= 1:nrow )])

但是这违反了:= < - 。data。 .table 不创建副本,可以使用< -



创建一个data.table对象:

  library(data.table)
di< - data.table iris)

创建新列:

  di < -  di [,z:= 1:nrow(di)] 
di

#Sepal.Length Sepal.Width Petal.Length花瓣宽度种类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
#前10行150打印。






这也值得记住,R只打印



<$ p

p> di [,z:= 1:nrow(di)]






Matthew Dowle的进一步信息:



另请参阅常见问题2.21和2.22:


> 2.21为什么 DT [i,col:= value] 返回整个 DT ?我希望没有可见的值(与 < - )一致,或者包含更新了多少行的消息或返回值。显然数据确实是通过引用更新的。



复合语法可以工作;例如 DT [i,done:= TRUE] [,sum(done)] 。在每个查询基础上或全局使用选项(datatable.verbose = TRUE)时,会返回详细信息行数。



2.22确定,但是不能返回 DT [i,col:= value] 的返回值,




  • 我们尝试过,但是R内部为 [
    的值 [ 0
    FunTab的eval列(参见src / main / names.c)意味着力
    R_Visible 开(参见R-Internals第1.6节)。因此,当我们尝试
    invisible()或将 R_Visible 设置为 / code>直接我们自己, eval
    src / main / eval.c将会重新启动。

  • 习惯了这种行为后,你可能会更喜欢它(我们有)。毕竟,我们使用< - 分配次数,然后立即查看数据来检查它是否确定?

  • 可以将:= 转换为也会返回数据的 j 在一个查询中的混合更新和选择。要检测 j 是否只更新(然后不正确地执行)可能会造成混淆。







Matthew Dowle的第二个更新



现在发现一个解决方案和v1.8.3不再打印结果,当使用:= 。我们将更新常见问题2.21和2.22。


Is there a way to prevent data.table to print the new data.table after assigning a new column by reference? I gather standard behaviour is

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

i.e. the table is printed to screen after assignment. is there a way to stop data.table from showing the new table after assigning the new column z? I know I can stop this behaviour by saying

DT <- copy(DT[,z:=1:nrow(DT)])

but that is defeating the purpose of := (which is designed to avoid copies).

解决方案

Since <-.data.table doesn't make a copy, you can use <-:

Create a data.table object:

library(data.table)
di <- data.table(iris)

Create a new column:

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. 


It is also worth remembering that R only prints the value of an object in interactive mode.

So, in batch mode, you can simply use:

di[, z:=1:nrow(di)]

This will not produce any output when run as a script in batch mode.


Further info from Matthew Dowle:

Also see FAQ 2.21 and 2.22 :

2.21 Why does DT[i,col:=value] return the whole of DT? I expected either no visible value (consistent with <-), or a message or return value containing how many rows were updated. It isn't obvious that the data has indeed been updated by reference.

So that compound syntax can work; e.g., DT[i,done:=TRUE][,sum(done)]. The number of rows updated is returned when verbosity is on, either on a per query basis or globally using options(datatable.verbose=TRUE).

2.22 Ok, but can't the return value of DT[i,col:=value] be returned invisibly, then?

  • We tried to but R internally forces visibility on for [. The value of FunTab's eval column (see src/main/names.c) for [ is 0 meaning force R_Visible on (see R-Internals section 1.6). Therefore, when we tried invisible() or setting R_Visible to 0 directly ourselves, eval in src/main/eval.c would force it on again.
  • After getting used to this behaviour, you might grow to prefer it (we have). After all, how many times do we subassign using <- and then immediately look at the data to check it's ok?
  • We can mix := into a j which also returns data; a mixed update and select in one query. To detect whether j solely updates (and then behave dierently) could be confusing.


Second update from Matthew Dowle:

We have now found a solution and v1.8.3 no longer prints the result when := is used. We will update FAQ 2.21 and 2.22.

这篇关于在v1.8.3之前的R {data.table}中使用`:=`时如何抑制输出?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆