先看文字理解,图在最后
1、结构
R的基本数据结构是向量(vector),向量又有两种:atomic vector 和 list(后面简称vector为向量,atomic vector为基础向量,list为列表)。
两者的区别在于,基础向量仅能容纳数据类型一致的数据,而列表可以容纳不同种类数据。
基础数据类型仅有Logical、Interger、Double、Character四种。
structure()是构建向量的根本函数,是很多函数背后的操作(与此文主干无关)
2、属性
所有向量都有属性(attribute),可以看作他们的相关信息(metadata)。
属性可以随意设定,设定特定的属性可以使用提前封装的方法或后来人写的R包。
比如比较常见的的属性如:1)dim;2)names;3)class
通过属性dim可以管理数据的结构;通过属性names可以命名;
属性class上设定了很多与函数调用(generic function)相关的方法,所以也就发展出了S3 面向对象编程(Object-Oriented programming)。相较于其他语言,较为粗糙,所以后面有了S4,将一切都封装起来了。
面向对象编程简单地说就是,针对不同的对象采取特定的操作。举例:print是个通用的函数,但是针对不同的类(如vector和factor)会选择不同的子函数来操作(print.vector或print.factor)
3、S3
通过“class”这个属性,并且设定附加的其他属性,R建立了基本的面向对象的操作。举例如下:
x <- factor(c("a", "b", "b", "a"))
typeof(x) # 对于基础向量,返回的就是数据类型
#> [1] "integer"
attributes(x) #获取属性,这列的levels属性就是factor类的附加属性之一,说白了就是在该类中有意义
#> $levels
#> [1] "a" "b"
#>
#> $class
#> [1] "factor"
factor、POSIXct、Date是基于基础向量的S3类
4、列表
再专门讲一下列表是为了,记住list和atomic vector才是R最基础的数据结构。
data.frame、tibble是基于list的S3类
看一下代码加深理解
l1 <- list(1:3, "a", c(TRUE, FALSE, TRUE), c(2.3, 5.9))
df<-data.frame(n=1:3,l=c("a","b","c"))
typeof(l1)
#>[1] "list"
typeof(df)
#>[1] "list"
attributes(l1)
#>NULL
attributes(df)
#>$names
#>[1] "n" "l"
#>
#>$class
#>[1] "data.frame"
#>
#>$row.names
#>[1] 1 2 3
5、NULL
在向量以外,R还有个类型就是NULL
c<-c()
d<-NULL
typeof(c)
#>"NULL"
typeof(d)
#>"NULL"
6、小结
向量包括属性和数据;
S3其实就是向量的属性得以利用而发生的延伸;
书中还对面向对象的基础”继承“及”方法分配“,以及”tibble和data.frame的区别“进行了简单的介绍
7、S4
All functions related to S4 live in the methods package.
S4明天写