R – S4类
面向对象编程的系统是R中的S4系统。令人困惑的是,R至少支持三个独立的面向对象编程系统S3、S4和S5。它们遵循一个标准的过程来产生对象,并有一个明确的结构。这提高了我们代码的安全性,使我们不会无意中犯下简单的错误。
R编程语言中S4类的定义
在R语言中,成员变量被称为槽。一个类将拥有的名称和槽(连同槽的类别)必须被定义。比如说
setClass("Employee", slots=list(name="character", age="numeric", role="character"))
姓名、年龄和角色是我们建立的雇员类中的三个槽(成员变量)。
在R中创建S4对象
S4对象是用new()函数创建的。
employee1 <- new("Employee", name = "Sanket", age = 21, role = "Software Developer")
通过指定类名Student和new中三个槽的值,我们已经在new()中生成了对象student1。
例子。R中的S4类和对象
# create a class "Employee" with three member variables
setClass("Employee", slots=list(name="character",
age="numeric",
role="character"))
# create an object of class
emp1 <- new("Employee", name = "Sanket",
age = 21,
role = "Software Developer")
# call emp1 object
emp1
输出
An object of class "Employee"
Slot "name":
[1] "Sanket"
Slot "age":
[1] 21
Slot "role":
[1] "Software Developer"
在这里,我们使用setClass()方法建立了一个名为Employee的S4类。然后使用new()方法创建了一个名字为emp1的对象。
new("Employee", name = "Sanket", age = 21, role = "Software Developer")
这里。
- name 接受 “字符 “值,所以我们传递了 “Sanket”。
- age 接受 “数字 “值,所以我们传递了数字值21
- role 接受 “字符 “值,所以,我们通过了 “软件开发人员”。
在R语言中访问S4类槽
在R语言中,我们使用@
操作符来访问槽。比如说。
# access name slot of Employee class
emp1@name
例子。访问S4类插槽
# access name slot of Employee class
emp1@name
# access role slot of Employee
emp1@role
输出
[1] "Sanket"
[1] "Software Developer"
这里。
- Emp1访问雇员信息的姓名槽,输出 “Sanket”。
- Emp1访问雇员信息的角色槽,输出 “软件开发人员”。
在R语言中修改S4类槽
在R语言中,我们可以通过使用@
符号来访问一个槽并改变其值。例如。
# access and assign new value to role slot
emp1@role <- “Web Designer”
# print new slot value
emp1@role
这里,角色槽的值从 “软件开发人员 “改为 “网页设计师”。
例子。修改S4类槽
emp1@name
emp1@role
# access and assign new value to role slot
emp1@role <- "Web Designer"
emp1@role
输出
[1] "Sanket"
[1] "Software Developer"
[1] "Web Designer"
R中的S4泛型函数和方法
与S3类相似,S4类也有属于泛型函数的方法,而不是类本身。使用S4泛型的工作方式与使用S3泛型的工作方式颇为相似。要了解更多关于泛型的信息,请去访问S3泛型。
当我们在创建完类的对象后,只是在交互式模式下输入对象的名字,该对象就会被打印出来。S4的泛型函数显示就是用来做这个的。这个函数在上面的列表中显示。相当于S3 print()函数的S4函数是这个函数。
# call object without show()
emp1
# call object with show()
show(emp1)
输出
An object of class "Employee"
Slot "name":
[1] "Sanket"
Slot "age":
[1] 21
Slot "role":
[1] "Software Developer"
这里,在这两种情况下,输出结果将与上面所示相同。
例子。检查一个函数是否是通用函数
isS4(print)
# Output: [1] FALSE
isS4(show)
# Output: [1] TRUE
这里,isS4()函数被用来确定一个函数是否是S4通用函数。由于该函数对print返回FALSE,对show返回TRUE,如果后者是一个S4通用函数。
在R中编写自己的方法
在R的setMethod()函数的帮助下,我们可以创建自己的方法。例如,我们可以使用下面的代码为display()泛型构建我们的类函数。
# create own method
setMethod("show",
"Employee",
function(object) {
cat(object@name, "\n")
cat(object@age, "years old\n")
cat("Role:", object@role, "\n")
}
)
# call employee1 object
emp1
输出
Sanket
21 years old
Role: Software Developer