高级编程--面向对象的编程(泛型函数)

高级编程--面向对象的编程

R是一个基于使用泛型函数的面向对象的编程语言。每个对象有一个类属性,这个类属性决定当对象的副本传递到类似于print()plot()summary()这些泛型函数时运行什么代码。

R有两个分离的面向对象编程的模型。S3模型相对更老、更简单、结构更少。S4模型更新且更复杂。S3方法容易使用并且在R中有最多的应用。我们将主要集中讨论S3模型。

1  泛型函数

R使用对象的类来确定当一个泛型函数被调用时采取什么样的行动。考虑下面的代码:

summary(women)

 

结果分析:summary()函数对women数据框中的每个变量都进行了描述性分析。

fit <- lm(weight ~ height, data=women)

summary(fit)

 

结果分析:summary()函数对该数据框的线性回归模型进行了描述。

summary

 

class(women)

 

class(fit)

 

如果函数summary.data.frame(women)存在,summary(women)函数执行summary.data. frame(women),否则执行summary.default(women)。同样,如果summary.lm(fit)存在,summary(fit)函数执行summary.lm(fit),否则执行summary.default(fit)UseMethod()函数将对象分派给一个泛型函数,前提是该泛型函数有扩展与对象的类匹配。

为了列出可获得的S3泛型函数,可以使用methods()函数:

methods(summary)

 

        ..............

 

(1)一个任意的泛型函数的例子

#1定义泛型函数mymethod()泛型函数被定义为类a和类b的对象。default()函数也被定义了。

mymethod <- function(x, ...) UseMethod("mymethod")

mymethod.a <- function(x) print("Using A")

mymethod.b <- function(x) print("Using B")

#2)给对象分配类,对象xyz被定义,而且一个类被分配到对象xy上。

x <- 1:5

y <- 6:10

z <- 10:15

class(x) <- "a"

 class(y) <- "b"

#3)把泛型函数应用到对象中mymethod()函数被应用到每个对象中,相应的函数得到调用。

mymethod(x)

 

mymethod(y)

 

mymethod(z)

 

#4)把泛型函数应用到包含两个类的对象中,当对象z被分配到两类时,第一类用来决定哪个泛型函数被调用。

class(z) <- c("a", "b")

mymethod(z)

 

#5)泛型函数没有默认为"c"的类,没有mymethod.c()函数,因此下一个类(a)被使用。R从左到右搜索类的列表,寻找第一个可用的泛型函数

class(z) <- c("c", "a", "b")

mymethod(z)

 

posted @ 2021-08-17 21:14  zhang-X  阅读(277)  评论(0)    收藏  举报