18

我的问题可能听起来很愚蠢,但我注意到了这一点,.并且%经常被使用,R坦率地说,我真的不知道为什么要使用它。

我已经在dplyr(go here for an example) 和data.table(ie .SD) 中看到它,但我确信它也必须在其他地方使用。

因此,我的问题是:

  • 是什么.意思?它是某种R编码最佳实践命名法吗?(即_functionName常用于javascript表示它是私有函数)。如果是,规则是什么?
  • 相同的问题%,在 R 中也经常使用(即%in%,,%>%...)。

我的猜测一直是这样,.并且%是一种快速调用函数的便捷方式,但使用方式data.table.遵循这个逻辑,这让我感到困惑。

4

2 回答 2

28

.在 R 中没有固有/神奇的含义。它只是您可以在符号名称中使用的另一个字符。但是因为它输入起来非常方便,所以它被 R 中的某些函数和约定赋予了特殊的含义。这里只是几个

  • .用于查找 S3 通用方法实现。例如,如果你调用一个泛型函数,比如plot将类的对象lm作为第一个参数,那么它会寻找一个名为的函数plot.lm,如果找到,就调用它。
  • 通常.在公式中表示“所有其他变量”,例如lm(y~., data=dd)将回归ydata.frame 中的所有其他变量dd
  • 库之类dplyr的将其用作特殊变量名来指示当前 data.frame 之类的方法do()。他们可以很容易地选择使用变量X
  • 函数,例如bquote用作.()特殊函数来转义表达式中的变量
  • 以句点开头的变量被认为是“隐藏的”,ls()除非您调用,否则不会显示ls(all.names=TRUE)(类似于 UNIX 文件系统行为)

但是,您也可以只定义一个名为的变量my.awesome.variable<-42,它将像任何其他变量一样工作。

A本身并没有什么特别的意思,但是 R 允许您以使用两个百分号%的形式定义自己的中缀运算符。%<something>%如果你定义

`%myfun%` <- function(a,b) {
    a*3-b*2
}

你可以这样称呼它

5 %myfun% 2
# [1] 11
于 2014-12-19T06:04:47.160 回答
13

MrFlick 的回答不包括.in的用法data.table

In data.table, .本质上)是 的别名,因此任何接受 a 的list*调用也可以传递一个包裹在 中的对象。[.data.tablelist.()

所以以下是等价的:

DT[ , .(x, y)]
DT[ , list(x, y)]

*好吧,不完全是。j 参数中的任何用途,是的;其他地方正在进行中,请参见此处

于 2017-01-27T00:05:24.863 回答