函数名称中的点可以表示以下任何一项:
- 一点都没有
- 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.其他可能的原因
在哈德利的 皮尔包中,他使用约定在函数名称中使用前导点。这是一种尝试确保在解析变量名时将值解析为用户变量而不是内部函数变量的机制。
并发症
不同用途的混合使用会导致非常混乱的情况,因为这些不同用途都可能混入同一函数名称中。
例如,要将a转换为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
...)中使用点也不常见,但我喜欢它。