以下代码确实有效,但我在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
这是data.tablev1.10.2 中添加的一个新的实验性功能。 在 data.table 新闻的新功能部分对 v1.10.2 中的更改进行了解释。
它写道(直接引用(:
当
j
是以..
为前缀的符号时,它将在调用作用域中查找,其值被视为列名或数字。myCols = c("colA","colB") DT[, myCols, with=FALSE] DT[, ..myCols] # same
当您看到
..
前缀时,请考虑一级,就像所有操作系统中的目录..
一样,即父目录。将来,可以使..
前缀适用于DT[...]
内任何位置的所有符号。它旨在成为保护代码不意外选取列名的便捷方法。类似于x.
和i.
前缀(类似于 SQL 表别名(已经可用于消除x
和i
中存在的相同列名的歧义。符号前缀而不是..()
函数将更容易在内部进行优化,并且如果您希望在表达式中安全地使用调用范围中的许多变量,则更方便。此功能于 2012 年首次提出,并一直希望 #633。这是实验性的。
注意:阿伦的这个回答让我想到了这些信息。