试图理解 R 结构:函数名称中的点表示什么?

Trying to understand R structure: what does a dot in function names signify?

我正在尝试学习如何使用 R。我可以用它来做一些基本的事情,比如读取数据和 运行 t 检验。但是,我很难理解 R 的结构方式(我的 java 背景非常平庸)。

我不明白的是函数的class化方式。

例如在is.na(someVector)中,is是class吗?或者对于 read.csvcsvread class 的方法吗?

我需要一种比简单地随机记忆更简单的方法来学习这些函数。我喜欢事物属于其他事物的想法。在我看来,这似乎为语言提供了树状结构,使学习更有效率。

谢谢

抱歉,如果这是一个明显的问题,我真的很困惑,并且已经 reading/watching 相当多的教程。

您的困惑是完全可以理解的,因为 R 混合了使用 (1) . 作为通用单词分隔符的两种约定(如 is.na()which.min()update.formula(), data.frame() ...) 和 (2) . 作为 S3 方法的指标,method.class(即 foo.bar() 将是 "foo"具有 class 属性 "bar" 的对象的方法)。这使得像 summary.data.frame() 这样的函数(即具有 class data.frame 的对象的 summary 方法)特别令人困惑。

正如@thelatemail 上面指出的那样,还有一些其他函数集为各种不同的选项重复相同的前缀(如 read.table()read.delim()read.fwf() ...),但这些完全是约定俗成的,没有在正式语言定义中的任何地方指定。

dotfuns <- apropos("[a-z]\.[a-z]")
dotstart <- gsub("\.[a-zA-Z]+","",dotfuns)
head(dotstart)
tt <- table(dotstart)
head(rev(sort(tt)),10)
##  as   is  print  Sys  file summary dev format all sys 
## 118   51     32   18    17      16  16     15  14  13 

(其中有些实际上是 S3 泛型,有些不是。例如,Sys.*()dev.*()file.*() 不是。)

历史上 _ 被用作赋值运算符 <- 的快捷方式(在 = 可用作同义词之前),因此它不能用作单词分隔符。我不知道为什么没有采用驼峰命名法。

令人困惑的是,methods("is") returns is.na() 等等,但它实际上只是在搜索名称以 "is." 开头的函数;它警告说 "function 'is' appears not to be generic"

Rasmus Bååth's presentation on naming conventions 内容丰富且有趣(如果有点令人沮丧)。

额外积分:是否有任何点分隔的 S3 方法名称,即 x.y.z 形式的函数名称表示 x.y 方法的情况对于具有 class 属性的对象 z ?

answer(来自 Hadley Wickham 的评论):as.data.frame.data.frame() 获胜。 as.data.frame 是一个 S3 泛型( 不像 ,比如 as.numeric),as.data.frame.data.frame 是它对 data.frame 对象的方法。它的目的(来自?as.data.frame):

If a data frame is supplied, all classes preceding ‘"data.frame"’ are stripped, and the row names are changed if that argument is supplied.