在v1.8.3之前的R {data.table}中使用`:=`时如何抑制输出? [英] how to suppress output when using `:=` in R {data.table}, prior to v1.8.3?
问题描述
有没有办法防止 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 ofDT
? 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 usingoptions(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[
is0
meaning forceR_Visible
on (see R-Internals section 1.6). Therefore, when we triedinvisible()
or settingR_Visible
to0
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 aj
which also returns data; a mixed update and select in one query. To detect whetherj
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屋!