r语言 - 为什么".."可以在字符向量变量中传递列名?



以下代码确实有效,但我在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 表别名(已经可用于消除xi中存在的相同列名的歧义。符号前缀而不是..()函数将更容易在内部进行优化,并且如果您希望在表达式中安全地使用调用范围中的许多变量,则更方便。此功能于 2012 年首次提出,并一直希望 #633。这是实验性的。

注意:阿伦的这个回答让我想到了这些信息。

最新更新