函数名中的点可以表示以下任意一种:
- 什么都没有
- S3方法中方法和类之间的分隔符
- 隐藏函数名
Possible meanings
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包中,他使用约定在函数名中使用前导点.这是一种机制,用于try 并确保在解析变量名时,值解析为用户变量,而不是内部函数变量.
Complications
这种不同用途的混搭会导致非常混乱的情况,因为这些不同的用途可能会在同一个函数名中混淆.
例如,要将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
:
> 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>