R--S4 Class

S4Class

泛型函数

#需要新的方式表示数据,或者需要新函数根据不同参数类型做出不同反应
#R的OOP是基于泛型函数的
#创建泛型函数UseMethod()
whoAmI <- function(x,...) UseMethod("whoAmI")
whoAmI.foo <- function(x) print("I am a foo")
whoAmI.bar <- function(x) print("I am a bar")
whoAmI.default <- function(x) print("I don't know who I am")
#用class()函数查看对象所属的类,每个对象都属于0或1或多个类
#使用attr()函数给a指定类属性,attr(x,"dim")维度属性
a <- 1:10
attr(a,"class") <- "foo" 
#a就相当于foo类的一个对象
whoAmI(a)
b <- 2:10
attr(b,"class") <- c("baz","bam","bar")
whoAmI(b)
#使用methods()函数来找到给定泛型函数的所有实现方法
methods(whoAmI)

#若实例属于多个在泛型函数中定义的类,按第一个类处理
meth1 <- function(x) UseMethod("meth1")
meth1.Mom <- function(x) print("Mom's meth1")
meth1.Dad <- function(x) print("Dad's meth1")
meth2 <- function(x) UseMethod("meth2")
meth2.Dad <- function(x) print("Dad's meth2")
a <- 1:10
attr(a,"class") <- c("Mom","Dad")
meth1(a)
meth2(a)
#泛型函数将不同的方法聚集到一起,
#由R根据函数的对象类型来决定选择执行那个方法```

#类

setClass(Class,representation(),prototype = ,contains = )

Class为字符串,表示类的名称

representation为建立成员变量与其明确的类型

numeric,character,logical

prototype为接口提供默认的数据对象

contains该类所扩展的类,所有扩展的类的新实例都会继承其所有父类的接口

setClass("foo",representation(a="character",b="numeric"))
setClass("bar",representation(c="numeric",d="numeric"))

继承foo和bar类

setClass("baz",contains = c("foo","bar"))
getClass("baz")

使用new()为此类创建一个实例,第一个参数是类的字符串

x <- new("baz",a="xxx",b=5,c=3,d=9)

使用@操作符访问成员变量,写入或者读取

x@a <- "xyz"

或者使用slot()函数

slot(x,"a") <- "i love you"```

虚类

#虚类是不会用来生成实例的类
#它们用来将拥有不同的representation的类(它们不能互相继承,如foo和bar)
#连接起来,通过虚类为这些不同的representation提供相似的功能
#建立一个虚类,用其他类来扩展它
#一个树状图的表示
setClass("dendNode")
setClass("dnode",representation(left="dendNode",right="dendNode",
                                height="numeric"),contains = "dendNode")
setClass("tnode",representation(height="numeric",value="numeric",
                                label="character"),contains = "dendNode")```

#初始化和原型

控制类的实例生成对象的成员变量的初始值

setClass("xx",representation(a="numeric",b="character"),
prototype(a=3,b="hi there"))
new("xx")

或者是给该类指定一个Initialize方法,用该方法为类的实例赋值

带‘initialize’标记方法传入参数为.Object

并且在initialize方法中返回该对象

setMethod("initialize","xx",function(.Object,b)
{
.Object@b <- b
.Object@a <- nchar(b)
.Object
})
new("xx",b="yowser")```

泛型函数与方法

#泛型函数实际上是一个分派机制,根据不同的输入参数决定什么样的方法被执行
#方法是特殊的函数,根据特定的输入对象执行需要执行的任务
whatIs <- function(object) data.class(object)
whatIs(1:10)
whatIs1 <- function(object) cat("类:",data.class(object),"\n长度:",
                                length(object),"\n")
whatIs1(1:10)
#对于函数与矩阵单独建立处理函数
whatIs1.function <- function(object){
  cat("类:",data.class(object),"\n")
}
#如果whatIs1函数定义为UseMethod()就可以真正的形成不用指定类的泛型函数
whatIs1.function(whatIs)
whatIs1.matrix <- function(object){
  cat("类:",data.class(object),"\n",nrow(object),"行",ncol(object),"列\n")
}
A <- matrix(1:6,nrow=3)
whatIs1.matrix(A)```

#定义方法

使用统一的函数名来处理,根据输入参数的类型决定使用哪个函数

S4类中使用setMethod()

第一个参数设定定义给定类的泛型函数名

第二个参数是类的名称,称为签名,第三个就是要处理的函数

setMethod("whatIs","function",whatIs.function)
setMethod("whatIs","matrix",whatIs1.matrix)

告诉setMethod对什么泛型函数指定方法,执行该方法对应的参数类型,执行的方法

whatIs(A)
whatIs(whatIs)```

访问子函数

#@来访问接口,实际中使用子函数访问接口,成员变量
setClass("foo",representation(abc="ANY"))
#is there a function named a,and if so,is it a generic(类)?
if(!isGeneric("a")){
  if(is.function("a")) fun <- a
  #dispatches a method from the current function call for the generic function a
  else fun <- function(object) standardGeneric("a")#泛型函数
  #if there is already a non-generic function of this name
  #it will be used to define the generic,and the current function will
  #become the default method for the generic
  setGeneric("a",fun)
}
#定义一个泛型函数的给定类的方法
setMethod("a","foo",function(object) object@abc)
b <- new("foo",abc=10)
a(b)```
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,511评论 1 51
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,783评论 1 10
  • 重新系统学习下C++;但是还是少了好多知识点;socket;unix;stl;boost等; C++ 教程 | 菜...
    kakukeme阅读 19,826评论 0 50
  • 刚开始参加时候,担心自己没时间去读书,怕自己做不好,一转眼21.天结束了。每天的一问坚持去完成,还偶尔参加社群...
    流年七里香农庄阅读 262评论 0 0
  • 今天是二十一天写作训练营第六期毕业典礼的日子,我的内心涌起一阵力量。 首先,我是汗颜的。听了优秀学员的分享,惊觉离...
    千目_阅读 219评论 0 0