R开发(part12)--基于RC的面向对象编程
學習筆記,僅供參考,有錯必糾
參考自:《R的極客理想》-- 張丹
文章目錄
- R開發
- 基于RC的面向對象編程
- 創建RC類和對象
- 對象賦值
- 定義對象的方法
- RC對象內置方法和內置屬性
- RC類的輔助函數
R開發
基于RC的面向對象編程
RC是Reference classes的簡稱,又被稱為R5,RC不同于原來的S3和S4對象系統,RC對象系統的方法是在類中自定的,而不是泛型函數。RC對象的行為更類似于其他的編程語言,實例化對象的語法也有所改變。但由于RC對象系統還是依賴于S4對象系統,我們可以簡單地理解為RC是對S4的更進一步的面向對象封裝。
創建RC類和對象
- setRefClass函數
RC對象系統以類為基本類型,有專門的類的定義函數setRefClass和實例化對象的生成方法。
語法:
setRefClass(Class, fields = , contains = , methods =,where =, inheritPackage =, ...)參數列表:
| Class | 定義類名 |
| fields | 定義屬性和屬性類型 |
| contains | 定義父類,繼承關系 |
| methods | 定義類中的方法 |
| where | 定義存儲空間 |
- 創建RC類和實例
創建一個RC類:
#定義一個RC類 User <- setRefClass("User", fields = list(name = "character"))實例化一個RC對象:
#實例化一個User對象u1 u1 <- User$new(name = "u1") u1 #輸出start Reference class object of class "User" Field "name": [1] "u1" #輸出endclass(User) #輸出start [1] "refObjectGenerator" attr(,"package") [1] "methods" #輸出endis.object(User) #TRUE otype(User) #"RC" class(u1) #輸出start [1] "User" attr(,"package") [1] ".GlobalEnv" #輸出endis.object(u1) #TRUE otype(u1) #"RC"- 創建一個有繼承關系的RC
#創建RC類User User <- setRefClass("User", fields = list(name = "character"))#創建User的子類Member Member<-setRefClass("Member", contains = "User", fields = list(manage = "User")) #實例化User manager <- User$new(name = "manager") #實例化一個Member對象 menber <- Member$new(name = "menber", manage = manager)#查看member對象 menber #輸出start Reference class object of class "Member" Field "name": [1] "menber" Field "manage": Reference class object of class "User" Field "name": [1] "manager" #輸出end#查看member對象的name屬性 menber$name #"menber" #檢查對象的屬性類型 otype(menber$name) #"base" otype(menber$manage) #"RC"
- RC對象的默認值
RC的類有一個指定構造器方法$initialize(),這個構造器方法在實例化對象時,會自動被運行一次,通過這個構造方法可以設置屬性的默認值。
#定義一個RC類, 并設置默認值 User <- setRefClass("User", fields = list(name = "character", level = "numeric"),methods = list(initialize = function(name, level) {print("User::initialize自動執行")name <<- "Huang"level <<- 12}))#實例化對象 u1 <- User$new() #"User::initialize自動執行" #查看對象u1,屬性被增加了默認值 u1 #輸出start Reference class object of class "User" Field "name": [1] "Huang" Field "level": [1] 12 #輸出end對象賦值
#定義User類 User <- setRefClass("User", fields = list(name = "character", age = "numeric",gender = "factor")) #定義一個factor類型 genderFactor <- factor(c("F", "M")) #實例化u1 u1<-User$new(name = "u1", age = 30, gender = genderFactor[1]) #查看age屬性值 u1$age #30 u1$gender #輸出start [1] F Levels: F M #輸出end
給u1的age屬性賦值:
u1$age <- 10 u1$age #10把u1對象賦值給u2對象:
#把u1賦值給u2對象 u2 <- u1 #查看u2的age屬性 u2$age #10 #重新賦值 u1$age <- 20 #查看u1, u2的age屬性 u1$age #20 u2$age #20由于把u1賦值給u2的時候,傳遞的是u1的實例化對象的引用,而不是值本身,這一點與其他語言中對象賦值是一樣的。
如果想進行賦值而不是引用傳遞,可以用下面的方法實現:
#調用u1的內置方法copy,賦值給u3 u3 <- u1$copy() #查看u3的age屬性 u3$age #20 #重新賦值 u1$age <- 30 #查看u1的age屬性,發生改變 u1$age #30 #查看u3的age屬性,沒有改變 u3$age #20定義對象的方法
在RC對象系統中,方法可以定義在類的內部,通過實例化的對象完成方法調用。
User <- setRefClass("User", fields = list(name = "character", favorite = "vector"),methods = list(addFavorite = function(x) {favorite <<- c(favorite, x)},delFavorite = function(x) {favorite <<- favorite[-which(favorite == x)]},setFavorite = function(x) {favorite <<- x}))#實例化對象 u1 <- User$new(name = "u1", favorite = c("movie", "football")) u1$favorite #"movie" "football" #刪除一個興趣 u1$delFavorite("football") #增加一個興趣 u1$addFavorite("reading") u1$favorite #"movie" "reading" #重新設置興趣列表 u1$setFavorite(c("game", "reading")) u1$favorite #"game" "reading"
RC對象內置方法和內置屬性
對于RC的實例化對象,除了我們自己定義的方法,還有幾個內置的方法,屬性復制賦值時使用的copy方法,就是其中之一。
- 內置方法
| initialize | 類的初始化函數,用于設置屬性的默認值,只能在類定義的方法中使用 |
| callSuper | 調用父類的同名方法,只能在類定義的方法中使用 |
| copy | 復制實例化對象的所有屬性 |
| initFields | 給對象的屬性賦值 |
| field | 查看屬性或給屬性賦值 |
| getClass | 查看對象的類定義 |
| getRefClass | 同getClass |
| show | 查看當前對象 |
| export | 查看屬性值,以類為作用域 |
| import | 把一個對象的屬性值賦值給另一個對象 |
| trace | 跟蹤對象中方法調用,用于程序debug |
| untrace | 取消跟蹤 |
| usingMethods | 用于實現方法調用,只能在類定義的方法中使用 |
- 內置屬性
RC對象實例化后,有兩個內置屬性。
| .self | 實例化對象自身 |
| .refClassDef | 類的定義類型 |
RC類的輔助函數
當我們定義好一個RC的類時,有一些輔助函數可以幫助我們查看類的屬性和方法,用于創建實例化的對象的$new()函數,也屬于這類輔助函數.
- 輔助函數
| new | 實例化對象 |
| help | 查詢類中方法的調用 |
| methods | 列出類中定義的所有方法 |
| fields | 列出類中定義的所有屬性 |
| lock | 給屬性加鎖,實例化對象的屬性只允許賦值一次,即賦值變量,不可修改 |
| trace | 跟蹤方法 |
| accessors | 給屬性生成get/set方法 |
總結
以上是生活随笔為你收集整理的R开发(part12)--基于RC的面向对象编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R开发(part11)--基于S4的面向
- 下一篇: 日普冰箱是哪个国家的(goo国語辞書)