【问题标题】:Why does ".." work to pass column names in a character vector variable?为什么“..”可以在字符向量变量中传递列名?
【发布时间】:2018-01-04 22:40:11
【问题描述】:

以下代码确实有效,但我在data.table 帮助和小插图中找不到有关“..”(点点)运算符的任何文档:

library(data.table)
cols <- c("mpg", "gear")
DT <- as.data.table(mtcars)
DT[ , ..cols]

输出是:

     mpg gear
 1: 21.0    4
 2: 21.0    4
 3: 22.8    4
 4: 21.4    3
 5: 18.7    3
...

为什么会这样,有相关文档吗?

PS:通常我会使用mget 等...

编辑 1: 这不是保留名称 .....1..2 等的普通 R 功能,这些名称用于引用从调用传递下来的参数功能(见?Reserved)。我的示例使用的不是数字,而是两个点后的字符。

编辑 2:这不是重复的,正如 Rich Scriven 的示例所示:

> mtcars[, ..cols]
Error in `[.data.frame`(mtcars, , ..cols) : object '..cols' not found

【问题讨论】:

标签: r data.table


【解决方案1】:

这是 data.table v1.10.2 中新增的实验性功能。在NEW FEATURES section of the data.table news for changes in v1.10.2中有解释。

上面写着(直接引用):

j 是一个以.. 为前缀的符号时,它将在调用范围内查找,其值被视为列名或数字。

myCols = c("colA","colB")
DT[, myCols, with=FALSE]
DT[, ..myCols]              # same

当您看到.. 前缀时,认为一级就像所有操作系统中的目录.. 表示父目录。将来,.. 前缀可以用于在DT[...] 内任何地方出现的所有符号。它旨在成为一种方便的方法来保护您的代码不被意外拾取列名。类似于x.i. 前缀(类似于SQL 表别名)已经可以用于消除xi 中存在的相同列名的歧义。如果您在调用范围中有许多希望在表达式中安全使用的变量,则符号前缀而不是..() 函数 将更容易在内部优化并且更方便。此功能于 2012 年首次提出,并期待已久,#633。这是实验性的。

注意: This answer by Arun 引导我了解此信息。

【讨论】:

猜你喜欢
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 2020-04-28
  • 2018-06-21
相关资源
最近更新 更多