函数名中的点(.)可以表示以下任意一种含义:
- 什么也不表示
- 在S3方法中,用于分隔方法和类
- 隐藏函数名
可能的含义
1. 什么也不表示
data.frame
函数名中的点并没有将 data
和 frame
分开,除了视觉上的区分。
2. 在 S3 方法中分离方法和类
plot
是一个通用的 S3 方法的例子。因此,plot.lm
和 plot.glm
是在调用 plot(lm(...))
或 plot(glm(...))
时使用的底层函数定义。
3. 隐藏内部函数
在编写包时,有时在函数名中使用前导点是有用的,因为这些函数在一定程度上被隐藏在一般视图之外。有时使用这些函数是为了纯粹作为包内部使用的。
在这种情况下,“有些隐藏”只是意味着该变量(或函数)通常不会在使用 ls()
列出对象时显示。要强制 ls
显示这些变量,请使用 ls(all.names=TRUE)
。通过在变量的首字母中使用点号,可以改变变量本身的范围。例如:
x <- 3
.x <- 4
ls()
[1] "x"
ls(all.names=TRUE)
[1] ".x" "x"
x
[1] 3
.x
[1] 4
4. 其他可能的原因
在Hadley的plyr包中,他使用了在函数名前加点号的约定。这是一种机制来尝试确保解析变量名时,值会解析为用户变量而不是内部函数变量。
复杂情况
这些不同用途的混合可能会导致非常混乱的情况,因为这些不同的用途可以混在同一个函数名中。
例如,要将data.frame
转换为列表,您使用as.list(..)
。
as.list(iris)
在这种情况下,as.list
是一个S3通用方法,并且您正在将data.frame
传递给它。因此,将调用S3函数as.list.data.frame
:
> as.list.data.frame
function (x, ...)
{
x <- unclass(x)
attr(x, "row.names") <- NULL
x
}
<environment: namespace:base>
如果想要查看一些真正精彩的内容,可以加载 data.table
包,并查看函数 as.data.table.data.frame
:
> library(data.table)
> methods(as.data.table)
[1] as.data.table.data.frame* as.data.table.data.table* as.data.table.matrix*
Non-visible functions are asterisked
> data.table:::as.data.table.data.frame
function (x, keep.rownames = FALSE)
{
if (keep.rownames)
return(data.table(rn = rownames(x), x, keep.rownames = FALSE))
attr(x, "row.names") = .set_row_names(nrow(x))
class(x) = c("data.table", "data.frame")
x
}
<environment: namespace:data.table>
is.na
,as.data.frame
,...)并不常见,但我喜欢这样做。 - Tomaspurrr
包(purrr.tidyverse.org)现在添加了另一层含义,例如~ .x+1
==function(x) x+1
。 - isomorphismes