高级编程--面向对象的编程(泛型函数)
高级编程--面向对象的编程
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)给对象分配类,对象x、y和z被定义,而且一个类被分配到对象x和y上。
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)
本文来自博客园,作者:zhang-X,转载请注明原文链接:https://www.cnblogs.com/YY-zhang/p/15154246.html