gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:02:31 25 4
gpt4 key购买 nike

有没有办法防止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

即表格在分配后打印到屏幕上。有没有办法在分配新列 z 后阻止 data.table 显示新表?我知道我可以通过说来阻止这种行为
DT <- copy(DT[,z:=1:nrow(DT)])

但这违背了 := 的目的(旨在避免复制)。

最佳答案

<-.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)]

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

来自马修·道尔的更多信息:

另请参阅常见问题解答 2.21 和 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.


马修·道尔的第二次更新:

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

关于r - 在 v1.8.3 之前,在 R {data.table} 中使用 `:=` 时如何抑制输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11359553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com