试图理解 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.csv
,csv
是 read
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.
我正在尝试学习如何使用 R。我可以用它来做一些基本的事情,比如读取数据和 运行 t 检验。但是,我很难理解 R 的结构方式(我的 java 背景非常平庸)。
我不明白的是函数的class化方式。
例如在is.na(someVector)
中,is
是class吗?或者对于 read.csv
,csv
是 read
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.