为什么“..”可以在字符向量变量中传递列名?

时间:2017-07-28 19:00:53

标签: r data.table

以下代码确实有效但我在..帮助和插图中找不到关于“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

1 个答案:

答案 0 :(得分:7)

这是 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
     

当您看到..前缀认为 one-level-up 时,就像所有操作系统中的目录..一样,意味着父目录。将来可以使..前缀适用于DT[...]内任意位置的所有符号。它旨在成为保护代码不会意外获取列名的便捷方法。与x.i.前缀(类似于SQL表别名)的方式类似,可以用于消除xi中存在的相同列名的歧义。如果您希望在表达式中安全地使用调用范围中的许多变量,那么符号前缀而不是..() 函数将更容易在内部进行优化并且更方便。此功能最初是在2012年提出的,并且一直希望#633。这是实验性的。

注意: This answer by Arun让我了解了这些信息。