R--S4 Class

S4Class

泛型函數(shù)

#需要新的方式表示數(shù)據(jù)腾节,或者需要新函數(shù)根據(jù)不同參數(shù)類型做出不同反應(yīng)
#R的OOP是基于泛型函數(shù)的
#創(chuàng)建泛型函數(shù)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()函數(shù)查看對(duì)象所屬的類,每個(gè)對(duì)象都屬于0或1或多個(gè)類
#使用attr()函數(shù)給a指定類屬性忘嫉,attr(x,"dim")維度屬性
a <- 1:10
attr(a,"class") <- "foo" 
#a就相當(dāng)于foo類的一個(gè)對(duì)象
whoAmI(a)
b <- 2:10
attr(b,"class") <- c("baz","bam","bar")
whoAmI(b)
#使用methods()函數(shù)來找到給定泛型函數(shù)的所有實(shí)現(xiàn)方法
methods(whoAmI)

#若實(shí)例屬于多個(gè)在泛型函數(shù)中定義的類,按第一個(gè)類處理
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)
#泛型函數(shù)將不同的方法聚集到一起案腺,
#由R根據(jù)函數(shù)的對(duì)象類型來決定選擇執(zhí)行那個(gè)方法```

#類

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

Class為字符串庆冕,表示類的名稱

representation為建立成員變量與其明確的類型

numeric,character,logical

prototype為接口提供默認(rèn)的數(shù)據(jù)對(duì)象

contains該類所擴(kuò)展的類,所有擴(kuò)展的類的新實(shí)例都會(huì)繼承其所有父類的接口

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()為此類創(chuàng)建一個(gè)實(shí)例,第一個(gè)參數(shù)是類的字符串

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

使用@操作符訪問成員變量救湖,寫入或者讀取

x@a <- "xyz"

或者使用slot()函數(shù)

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

虛類

#虛類是不會(huì)用來生成實(shí)例的類
#它們用來將擁有不同的representation的類(它們不能互相繼承,如foo和bar)
#連接起來愧杯,通過虛類為這些不同的representation提供相似的功能
#建立一個(gè)虛類,用其他類來擴(kuò)展它
#一個(gè)樹狀圖的表示
setClass("dendNode")
setClass("dnode",representation(left="dendNode",right="dendNode",
                                height="numeric"),contains = "dendNode")
setClass("tnode",representation(height="numeric",value="numeric",
                                label="character"),contains = "dendNode")```

#初始化和原型

控制類的實(shí)例生成對(duì)象的成員變量的初始值

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

或者是給該類指定一個(gè)Initialize方法鞋既,用該方法為類的實(shí)例賦值

帶‘initialize’標(biāo)記方法傳入?yún)?shù)為.Object

并且在initialize方法中返回該對(duì)象

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

泛型函數(shù)與方法

#泛型函數(shù)實(shí)際上是一個(gè)分派機(jī)制,根據(jù)不同的輸入?yún)?shù)決定什么樣的方法被執(zhí)行
#方法是特殊的函數(shù)耍铜,根據(jù)特定的輸入對(duì)象執(zhí)行需要執(zhí)行的任務(wù)
whatIs <- function(object) data.class(object)
whatIs(1:10)
whatIs1 <- function(object) cat("類:",data.class(object),"\n長度:",
                                length(object),"\n")
whatIs1(1:10)
#對(duì)于函數(shù)與矩陣單獨(dú)建立處理函數(shù)
whatIs1.function <- function(object){
  cat("類:",data.class(object),"\n")
}
#如果whatIs1函數(shù)定義為UseMethod()就可以真正的形成不用指定類的泛型函數(shù)
whatIs1.function(whatIs)
whatIs1.matrix <- function(object){
  cat("類:",data.class(object),"\n",nrow(object),"行",ncol(object),"列\(zhòng)n")
}
A <- matrix(1:6,nrow=3)
whatIs1.matrix(A)```

#定義方法

使用統(tǒng)一的函數(shù)名來處理邑闺,根據(jù)輸入?yún)?shù)的類型決定使用哪個(gè)函數(shù)

S4類中使用setMethod()

第一個(gè)參數(shù)設(shè)定定義給定類的泛型函數(shù)名

第二個(gè)參數(shù)是類的名稱,稱為簽名,第三個(gè)就是要處理的函數(shù)

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

告訴setMethod對(duì)什么泛型函數(shù)指定方法棕兼,執(zhí)行該方法對(duì)應(yīng)的參數(shù)類型陡舅,執(zhí)行的方法

whatIs(A)
whatIs(whatIs)```

訪問子函數(shù)

#@來訪問接口,實(shí)際中使用子函數(shù)訪問接口伴挚,成員變量
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")#泛型函數(shù)
  #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)
}
#定義一個(gè)泛型函數(shù)的給定類的方法
setMethod("a","foo",function(object) object@abc)
b <- new("foo",abc=10)
a(b)```
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末靶衍,一起剝皮案震驚了整個(gè)濱河市灾炭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颅眶,老刑警劉巖蜈出,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涛酗,居然都是意外死亡铡原,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門商叹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來燕刻,“玉大人,你說我怎么就攤上這事剖笙÷严矗” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵弥咪,是天一觀的道長忌怎。 經(jīng)常有香客問我,道長酪夷,這世上最難降的妖魔是什么榴啸? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮晚岭,結(jié)果婚禮上鸥印,老公的妹妹穿的比我還像新娘。我一直安慰自己坦报,他們只是感情好库说,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著片择,像睡著了一般潜的。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上字管,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天啰挪,我揣著相機(jī)與錄音,去河邊找鬼嘲叔。 笑死亡呵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的硫戈。 我是一名探鬼主播锰什,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了汁胆?” 一聲冷哼從身側(cè)響起梭姓,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嫩码,沒想到半個(gè)月后誉尖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谢谦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年释牺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片回挽。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡没咙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出千劈,到底是詐尸還是另有隱情祭刚,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布墙牌,位于F島的核電站涡驮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏喜滨。R本人自食惡果不足惜捉捅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一胧谈、第九天 我趴在偏房一處隱蔽的房頂上張望猴仑。 院中可真熱鬧,春花似錦诽里、人聲如沸辜膝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厂抖。三九已至茎毁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間忱辅,已是汗流浹背七蜘。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耕蝉,地道東北人崔梗。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像垒在,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,523評(píng)論 1 51
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,817評(píng)論 1 10
  • 重新系統(tǒng)學(xué)習(xí)下C++场躯;但是還是少了好多知識(shí)點(diǎn)谈为;socket;unix踢关;stl伞鲫;boost等; C++ 教程 | 菜...
    kakukeme閱讀 19,939評(píng)論 0 50
  • 剛開始參加時(shí)候签舞,擔(dān)心自己沒時(shí)間去讀書秕脓,怕自己做不好,一轉(zhuǎn)眼21.天結(jié)束了儒搭。每天的一問堅(jiān)持去完成吠架,還偶爾參加社群...
    流年七里香農(nóng)莊閱讀 266評(píng)論 0 0
  • 今天是二十一天寫作訓(xùn)練營第六期畢業(yè)典禮的日子,我的內(nèi)心涌起一陣力量搂鲫。 首先傍药,我是汗顏的。聽了優(yōu)秀學(xué)員的分享魂仍,驚覺離...
    千目_閱讀 221評(píng)論 0 0