R语言 类
类和对象是面向对象编程的基本概念,围绕着现实生活中的实体。R语言中的所有东西都是一个对象。一个 对象 只是一个数据结构,它有一些方法和属性。 类 只是这些对象的一个蓝图或草图。它代表了一种类型的所有对象所共有的属性或方法的集合。
与其他大多数编程语言不同,R有一个三类系统。它们是S3、S4和参考类。
S3类
S3是最简单但也是最流行的OOP系统,它缺乏正式的定义和结构。这种类型的对象只需添加一个属性就可以创建。下面是一个例子,可以让事情变得更清楚。
例子
# create a list with required components
movieList <- list(name = "Iron man", leadActor = "Robert Downey Jr")
# give a name to your class
class(movieList) <- "movie"
movieList
输出
$name
[1] "Iron man"
$leadActor
[1] "Robert Downey Jr"
在S3系统中,方法不属于类。它们属于通用函数。这意味着我们不能在这里创建我们自己的方法,就像我们在其他编程语言如C++或Java中所做的那样。但我们可以定义一个泛型方法(例如打印)应用于我们的对象时的作用。
print(movieList)
输出
$name
[1] "Iron man"
$leadActor
[1] "Robert Downey Jr"
例子。创建一个用户定义的打印函数
# now let us write our method
print.movie <- function(obj)
{
cat("The name of the movie is", objname,".\n")
cat(objleadActor, "is the lead actor.\n")
}
输出
The name of the movie is Iron man .
Robert Downey Jr is the lead actor.
S4类
像C++、Java等其他语言的程序员可能会发现S3与他们对类的正常想法有很大的不同,因为它缺乏类应该提供的结构。S4比S3稍有改进,因为它的对象有一个合适的定义,并且给它的对象提供了一个合适的结构。
例子
library(methods)
# definition of S4 class
setClass("movies", slots=list(name="character", leadActor = "character"))
# creating an object using new() by passing class name and slot values
movieList <- new("movies", name="Iron man", leadActor = "Robert Downey Jr")
movieList
输出
An object of class "movies"
Slot "name":
[1] "Iron man"
Slot "leadActor":
[1] "Robert Downey Jr"
如上例所示, setClass() 被用来定义一个类, new() 被用来创建对象。
S4中方法的概念与S3类似,即它们属于通用函数。下面的例子展示了如何创建一个方法。
movieList
输出
An object of class "movies"
Slot "name":
[1] "Iron man"
Slot "leadActor":
[1] "Robert Downey Jr"
例子
# using setMethod to set a method
setMethod("show", "movies",
function(object)
{
cat("The name of the movie is ", object@name, ".\n")
cat(object@leadActor, "is the lead actor.\n")
}
)
movieList
输出
[1] "show"
The name of the movie is Iron man .
Robert Downey Jr is the lead actor.
参考类
参考类是对S4类的一种改进。这里的方法属于类。这些与其他语言的面向对象的类非常相似。
定义一个参考类与定义S4类相似。我们使用 setRefClass() 而不是 setClass() ,使用 “字段 “而不是 “槽”。
例子
library(methods)
# setRefClass returns a generator
movies <- setRefClass("movies", fields = list(name = "character",
leadActor = "character", rating = "numeric"))
#now we can use the generator to create objects
movieList <- movies(name = "Iron Man",
leadActor = "Robert downey Jr", rating = 7)
movieList
输出
Reference class object of class "movies"
Field "name":
[1] "Iron Man"
Field "leadActor":
[1] "Robert downey Jr"
Field "rating":
[1] 7
现在让我们通过一个例子来看看如何给我们的类添加一些方法。
例子
library(methods)
movies <- setRefClass("movies", fields = list(name = "character",
leadActor = "character", rating = "numeric"), methods = list(
increment_rating = function()
{
rating <<- rating + 1
},
decrement_rating = function()
{
rating <<- rating - 1
}
))
movieList <- movies(name = "Iron Man",
leadActor = "Robert downey Jr", rating = 7)
# print the value of rating
movieListrating
# increment and then print the rating
movieListincrement_rating()
movieListrating
# decrement and print the rating
movieListdecrement_rating()
movieList$rating
输出
[1] 7
[1] 8
[1] 7