歡迎關(guān)注天山情報(bào)。我們是一個(gè)專注于商業(yè)智能BI、人工智能AI和大數(shù)據(jù)分析與挖掘的垂直社區(qū)。學(xué)習(xí)、問答、求職一站搞定!對商業(yè)智能BI、大數(shù)據(jù)分析與挖掘、機(jī)器學(xué)習(xí)、python、R等數(shù)據(jù)領(lǐng)域感興趣的同學(xué)加微信:tstoutiao,邀請你加入數(shù)據(jù)愛好者交流群,數(shù)據(jù)愛好者都在這里。
Alexa的個(gè)人博客http://fens.me世界排名70k。
前言
對于R語言的面向?qū)ο缶幊?,與其他編程語言不同,R語言提供了三種類型的底層對象,一種是S3類型,一種是S4類型,一種是RC類型。
S3物體簡單、動態(tài),沒有明顯的結(jié)構(gòu)特征。S4對象是結(jié)構(gòu)化的和強(qiáng)大的;RC對象是2.12版之后使用的一種新類型,用于解決S3和S4的困難對象。
本文將從S3對象開始,介紹用R語言進(jìn)行面向?qū)ο缶幊痰募?xì)節(jié)。
目錄
S3物體游戲攻略
創(chuàng)建S3對象
泛型函數(shù)和方法調(diào)用
參見S3對象的功能
S3對象繼承
S3物體的缺點(diǎn)
S3物體的使用
1.S3物體游戲攻略
在R語言中,基于S3對象的面向?qū)ο缶幊淌且环N基于泛型函數(shù)的實(shí)現(xiàn)方法。泛型函數(shù)是一個(gè)特殊的函數(shù),它根據(jù)傳入對象的類型來決定調(diào)用哪個(gè)特定的方法?;赟3對象的面向?qū)ο缶幊滩煌谄渌Z言的面向?qū)ο缶幊?,它是動態(tài)函數(shù)調(diào)用的模擬實(shí)現(xiàn)。S3對象在R的早期開發(fā)包中被廣泛使用。
關(guān)于面向?qū)ο蟮慕榻B,請參考文章:
r語言面向?qū)ο缶幊?/p>
2.創(chuàng)建S3對象
本文的系統(tǒng)環(huán)境
Linux: Ubuntu服務(wù)器12 . 04 . 2 LTS 64位
R: 3.0.1 x86_64-pc-linux-gnu
注意:pryr只支持Linux系統(tǒng)環(huán)境
為了方便我們檢查對象的類型,pryr包作為一個(gè)輔助工具被引入。
1#裝載pryr包
2 >圖書館(pryr)
從變量創(chuàng)建S3對象
1 >x<。-1
2 >attr(x,' class')<。-" foo "
三
4 >x
5[1] 1
6attr(,“類”)
7[1]“foo”
八
9 >類別(x)
10[1]“foo”
11
12#使用pryr包的type函數(shù)檢查x的類型
13 >otype(x)
14[1]“S3”
S3對象是由結(jié)構(gòu)()函數(shù)創(chuàng)建的
1 >y <。-結(jié)構(gòu)(2,class = "foo ")
2
3 >y
4[1] 2
5attr(,“類”)
6[1]“foo”
七
8 >等級(y)
9[1]“foo”
10
11 >ot type(y)
12[1]“S3”
創(chuàng)建多類型S3對象
S3對象沒有明確的結(jié)構(gòu)關(guān)系,S3對象可以有多種類型。S3對象的類屬性可以是向量,包括多種類型。
1 >x<。-1
2 >attr(x,' class')<。- c("foo "," bar ")
3 >類別(x)
4[1]“foo”“bar”
5 >otype(x)
6[1]“S3”
3.泛型函數(shù)和方法調(diào)用
對于S3對象的使用,UseMethod()函數(shù)通常用于定義泛型函數(shù)的名稱,不同的方法調(diào)用是通過傳入?yún)?shù)的類屬性來確定的。
定義教師的一般職能
+使用UseMethod()定義教師通用函數(shù)
+以老師. xxx的語法格式定義老師對象的行為
+其中老師。默認(rèn)為默認(rèn)行為
1#使用UseMethod()定義教師通用函數(shù)
2 >教師<。-函數(shù)(x,...)使用方法(“教師”)
三
4#使用pryr包中的ftype()函數(shù)檢查教師的類型
5 >ftype(教師)
6[1]“S3”“通用”
七
8#定義教師內(nèi)部職能
9 >教師講座& lt-函數(shù)(x)打印(“講座”)
10 >教師作業(yè)& lt-函數(shù)(x)打印(“賦值”)
11 >教師。糾正& lt-函數(shù)(x)打印(“批改作業(yè)”)
12 >教師. default & lt;-function(x) print("你不是老師")
調(diào)用方法時(shí),通過傳入?yún)?shù)的類屬性來確定不同的方法調(diào)用。
定義一個(gè)變量A,將A的class屬性設(shè)置為講座
將變量a傳遞給教師泛型函數(shù)
函數(shù)教師的行為。講座()被稱為
1 >a<。-"老師"
2
3#設(shè)置教師變量的行為
4 >attr(a,' class') <。-"演講"
五
6#執(zhí)行老師的行為
7 >教師(a)
8[1]“講座”
當(dāng)然也可以直接調(diào)用老師定義的行為,如果這樣做,面向?qū)ο蠓庋b的意義就失效了。
1 >教師講座()
2[1]“講座”
三
4 >老師講課
5[1]“講座”
六
7 >教師()
8[1]“你不是老師”
4.看看S3物體的功能
當(dāng)我們使用S3對象進(jìn)行面向?qū)ο蠓庋b時(shí),我們可以使用methods()函數(shù)來查看S3對象中定義的內(nèi)部行為函數(shù)。
1#查看教師對象
2 >教師
3函數(shù)(x,...)使用方法(“教師”)
四
5#查看教師對象的內(nèi)部功能
6 >方法(教師)
老師。作業(yè)老師。批改老師。默認(rèn)老師。講座
通過方法()的generic.function參數(shù)匹配泛型函數(shù)名。
1 >方法(generic.function=predict)
2 [1] predict.ar* predict。Arima* predict.arima0*
預(yù)測,預(yù)測。HoltWinters* predict.lm
4 [7]預(yù)測.黃土*預(yù)測. mlm預(yù)測. nls*
5[10]predict . poly predict . PPR * predict . prcomp *
6[13]predict . princomp * predict . smooth . spline * predict . smooth . spline . fit *
7[16]預(yù)測。結(jié)構(gòu)*
八
9不可見的函數(shù)標(biāo)有星號
將類的名稱與方法()的類參數(shù)相匹配。
1 >方法(class=lm)
2[1]add 1 . lm * alias . lm * ANOVA . lm case . names . lm *
3[5]confint . lm * cooks . distance . lm * deviance . lm * dfbeta . lm *
4[9]dfbetas . lm * drop 1 . lm * dummy . coef . lm * effects . lm *
5[13]Extract AIc . lm * family . lm * formula . lm * hat values . lm
6[17]impact . lm * kappa . lm labels . lm * loglik . lm *
7[21]model . frame . lm model . matrix . lm nobs . lm * plot . lm
8[25]predict . lm print . lm proj . lm * QR . lm *
9[29]殘差. lm r standard . lm r student . lm simulate . lm *
10[33]summary . lm variable . names . lm * vcov . lm *
11
12個(gè)不可見的函數(shù)標(biāo)有星號
使用getAnywhere()函數(shù)查看所有函數(shù)。
1#查看老師講課功能
2 >getAnywhere(教師.講座)
找到了3個(gè)匹配“教師.講座”的單個(gè)對象
4它在以下地方被發(fā)現(xiàn)
5 .GlobalEnv
6注冊S3法為教師
7有價(jià)值
八
9功能(x)打印(“講座”)
10
11#檢查不可見函數(shù)predict.ppr
12 >predict.ppr
13錯(cuò)誤:找不到對象“predict.ppr”
14 >存在(“預(yù)測. ppr”)
15[1]假
16
17# getAnywhere()函數(shù)查找predict.ppr
18 >getAnywhere("predict.ppr ")
19A找到匹配“predict.ppr”的單個(gè)對象
20在以下地方發(fā)現(xiàn)
21個(gè)注冊S3方法,用于根據(jù)名稱空間統(tǒng)計(jì)數(shù)據(jù)進(jìn)行預(yù)測
22命名空間:stats
23有價(jià)值
24
25函數(shù)(對象,新數(shù)據(jù),...)
26{
27 if(缺失(newdata))
28返回(安裝(物體))
29 if(!is.null(object$terms)) {
30 newdata <。- as.data.frame(newdata)
31 rn <。-row . name(new data)
32條款& lt- delete.response(object$terms)
33 m <。- model.frame(Terms,newdata,na.action = na .省略,
34 xlev = object$xlevels)
35 if(!is . null(cl & lt;- attr(術(shù)語,“數(shù)據(jù)類”))
36 .checkMFClasses(cl,m)
37 keep & lt- match(row.names(m),rn)
38 x <。- model.matrix(Terms,m,contrasts.arg = object$contrasts)
39 }
40 else {
41 x <。- as.matrix(newdata)
42 keep & lt- seq_len(nrow(x))
43 rn <。- dimnames(x)[[1L]]
44 }
45 if (ncol(x)!= object$p)
46停止(“x”中的列數(shù)錯(cuò)誤)
47 res <。-矩陣(NA,長度(keep),對象$q,dimnames = list(rn,
48 object$ynames))
49 res[keep,]& lt;-矩陣(。Fortran(C_pppred,as.integer(nrow(x)),
50 as.double(x),as.double(object$smod),y = double(nrow(x) *
51 object$q),double(2 * object $ smod[4L])$ y,ncol = object$q)
52滴(res)
53}
54<。字節(jié)碼:0x 0000000000 df 6 c2d 0 > 0。
55<。環(huán)境:名稱空間:stats>。
還可以使用getS3method()函數(shù)查看不可見的函數(shù)
1# getS3method()函數(shù)查找predict.ppr
2 >gets 3方法(“預(yù)測”、“ppr”)
3函數(shù)(對象,新數(shù)據(jù),...)
4{
5 if(缺失(newdata))
6返回(安裝(物體))
7 if(!is.null(object$terms)) {
8 newdata <。- as.data.frame(newdata)
9 rn <。-row . name(new data)
10項(xiàng)條款& lt- delete.response(object$terms)
11 m <。- model.frame(Terms,newdata,na.action = na .省略,
12 xlev = object$xlevels)
13 if(!is . null(cl & lt;- attr(術(shù)語,“數(shù)據(jù)類”))
14 .checkMFClasses(cl,m)
15保留& lt- match(row.names(m),rn)
16 x <。- model.matrix(Terms,m,contrasts.arg = object$contrasts)
17 }
18 else {
19 x <。- as.matrix(newdata)
20保留& lt- seq_len(nrow(x))
21 rn <。- dimnames(x)[[1L]]
22 }
23 if (ncol(x)!= object$p)
24停止(“x”中的列數(shù)錯(cuò)誤)
25 res <。-矩陣(NA,長度(keep),對象$q,dimnames = list(rn,
26 object$ynames))
27 res[keep,]& lt;-矩陣(。Fortran(C_pppred,as.integer(nrow(x)),
28 as.double(x),as.double(object$smod),y = double(nrow(x) *
29 object$q),double(2 * object $ smod[4L])$ y,ncol = object$q)
30滴(res)
31}
32<。字節(jié)碼:0x 0000000000 df 6 c2d 0 > 0。
33<。環(huán)境:名稱空間:stats>。
5.5的繼承關(guān)系。S3物體
S3對象有一個(gè)非常簡單的繼承模式,這是通過NextMethod()函數(shù)實(shí)現(xiàn)的。
定義節(jié)點(diǎn)通用函數(shù)
1 >節(jié)點(diǎn)<。-函數(shù)(x) UseMethod("node ",x)
2 >node.default & lt-函數(shù)(x)“默認(rèn)節(jié)點(diǎn)”
三
4#父親功能
5 >node .父親節(jié)& lt-函數(shù)(x) c(“父親”)
六
7#子函數(shù)通過NextMethod()函數(shù)指向父函數(shù)
8 >node.son & lt-函數(shù)(x) c("son ",NextMethod())
九
10#定義n1
11 >n1 <。-結(jié)構(gòu)(1,class = c("父親"))
12#在node函數(shù)中傳遞n1,執(zhí)行node .父親()函數(shù)
13 >節(jié)點(diǎn)(n1)
14[1]“父親”
15
16#定義n2并將class屬性設(shè)置為2
17 >n2 <。-結(jié)構(gòu)(1,class = c("兒子","父親"))
18#將n2傳遞給node函數(shù),并執(zhí)行node.son()函數(shù)和node .父親()函數(shù)
19 >節(jié)點(diǎn)(n2)
20[1]“兒子”“父親”
通過將n2個(gè)參數(shù)傳遞給node()函數(shù),首先執(zhí)行node.son(),然后通過NextMethod()函數(shù)連續(xù)執(zhí)行node .父親節(jié)()函數(shù)。其實(shí)就是模擬一個(gè)子函數(shù)調(diào)用一個(gè)父函數(shù)的過程,在面向?qū)ο缶幊讨袑?shí)現(xiàn)繼承。
6.6的缺點(diǎn)。S3物體
從上面對S3對象的介紹來看,S3對象不是一個(gè)完整的面向?qū)ο蟮膶?shí)現(xiàn),而是一個(gè)由泛型函數(shù)模擬的面向?qū)ο蟮膶?shí)現(xiàn)。
S3易于使用,但在實(shí)際的面向?qū)ο缶幊踢^程中,當(dāng)對象關(guān)系具有一定的復(fù)雜性時(shí),S3對象所表達(dá)的含義就會變得不清晰。
S3封裝的內(nèi)部函數(shù)可以繞過泛型函數(shù)的檢查直接調(diào)用。
S3參數(shù)的類屬性可以任意設(shè)置,無需預(yù)處理檢查。
S3參數(shù)只能通過調(diào)用class屬性來調(diào)用,其他屬性不會被class()函數(shù)執(zhí)行。
當(dāng)S3參數(shù)的類屬性有多個(gè)值時(shí),將根據(jù)程序賦值順序調(diào)用第一個(gè)合法函數(shù)。
因此,S3只能是一個(gè)簡單的面向?qū)ο蟮腞語言實(shí)現(xiàn)。
7.使用7。S3物體
S3對象系統(tǒng)在R語言的早期發(fā)展中被廣泛使用。在基礎(chǔ)包中,有許多S3對象。
基本包裝的S3物件
1#均值函數(shù)
2 >意思是
3函數(shù)(x,...)
4使用方法(“平均值”)
五
六
7 >ftype(平均值)
8[1]“S3”“通用”
九
10# t功能
11 >ft type(t)
12[1]“S3”“通用”
13
14#繪圖功能
15 >ftype(繪圖)
16[1]“S3”“通用”
一個(gè)定制的S3物件
1#定義數(shù)字變量a
2 >a <。- 1
3#變量a的類是數(shù)字的
4 >a類
5[1]“數(shù)字”
六
7#定義通用函數(shù)f1
8 >f1 <。-函數(shù)(x) {
9+ a <。- 2
10+ UseMethod("f1 ")
11+ }
12
13#定義f1的內(nèi)部功能
14 >f1.numeric & lt-函數(shù)(x) a
15
16#將變量a傳遞給f1()
17 >f1(a)
18[1] 2
19
20#將數(shù)字99傳遞給f1()
21 >f1(99)
22[1] 2
23
24#定義f1的內(nèi)部功能
25 >f1.character & lt-函數(shù)(x)粘貼(“char”,x)
26
27#將字符a傳遞給f1()
28 >f1(“a”)
29[1]“char a”
這樣,我們對S3對象系統(tǒng)有了全面的了解,開始了R語言的面向?qū)ο缶幊讨贰?/p>
美好的過去:
r語言信用記分卡:探索性數(shù)據(jù)分析
t檢驗(yàn)是統(tǒng)計(jì)學(xué)中的一種檢驗(yàn)方法,是基于r
完成R語言中文社區(qū)2018年年終文章(作者)
R語言中文社區(qū)2018年年終文章(類型文章)
微信官方賬號可以在后臺回復(fù)關(guān)鍵詞學(xué)習(xí)
關(guān)于爬行動物和爬行動物三大案例的回復(fù)?;貜?fù)Python 1小時(shí)破冰入門?;貜?fù)數(shù)據(jù)挖掘R語言錄入和數(shù)據(jù)挖掘?;貜?fù)人工智能三個(gè)月?;貜?fù)數(shù)據(jù)分析師的成長路徑?;貜?fù)機(jī)器學(xué)習(xí)。機(jī)器學(xué)習(xí)的商業(yè)應(yīng)用。回復(fù)數(shù)據(jù)科學(xué)。數(shù)據(jù)科學(xué)實(shí)際上是對普通算法的回復(fù)。常見的數(shù)據(jù)挖掘算法
1.《parameterclass R語言基于S3的面向?qū)ο缶幊獭吩曰ヂ?lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《parameterclass R語言基于S3的面向?qū)ο缶幊獭穬H供讀者參考,本網(wǎng)站未對該內(nèi)容進(jìn)行證實(shí),對其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請保留本站內(nèi)容來源地址,http://f99ss.com/junshi/1229543.html