6 两种class: s3和s4
https://www.youtube.com/watch?v=YGlse2aW5Ao
6.1 s3
<- list(name = "John", age = 21, GPA = 3.5) # one list
s3 class(s3) <- "student" # s3 is now an object of class student
s3
## $name
## [1] "John"
##
## $age
## [1] 21
##
## $GPA
## [1] 3.5
##
## attr(,"class")
## [1] "student"
另一种方法
.2 <- list(name = "John", age = 21, GPA = 3.5)
s3attr(s3.2, "class") <- "student"
.2$name # 访问就是用普通的$ s3
## [1] "John"
基本就是要先把元素塞进一个list,然后用一次class函数。如果要快速建某class的object只能自定义一个函数
<- function(n, a, g) {
anmelden <- list(name = n, age = a, GPA = g)
value class(value) <- "student"
return(value)
}
<- anmelden("hammerfly", 27, 3)
hammerfly hammerfly
## $name
## [1] "hammerfly"
##
## $age
## [1] 27
##
## $GPA
## [1] 3
##
## attr(,"class")
## [1] "student"
有了class就可以建造函数快速套到object上
<- function(miao) {
grade cat("your grade is", miao$GPA)
}
grade(s3)
## your grade is 3.5
6.2 s4
s4得先定义class。注意必须得同时加slots,否则new时会出错。
setClass("student", slots = list(name = "character", age = "numeric", GPA = "numeric"))
setClass("student", slots = c(name = "character", age = "numeric", GPA = "numeric")) # 不用list用向量也是一样
<- new("student")
s4 s4
## An object of class "student"
## Slot "name":
## character(0)
##
## Slot "age":
## numeric(0)
##
## Slot "GPA":
## numeric(0)
<- new("student", name = "John", age = 21, GPA = 3.5)
s4 s4
## An object of class "student"
## Slot "name":
## [1] "John"
##
## Slot "age":
## [1] 21
##
## Slot "GPA":
## [1] 3.5
判断对象是不是s4
isS4(s4)
## [1] TRUE
isS4(s3)
## [1] FALSE
用@
访问s4里的元素
@age s4
## [1] 21
@age <- 50
s4 s4
## An object of class "student"
## Slot "name":
## [1] "John"
##
## Slot "age":
## [1] 50
##
## Slot "GPA":
## [1] 3.5
或者用slot
,虽然我不明所以但似乎更推荐
slot(s4, "name")
## [1] "John"