日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

R开发(part12)--基于RC的面向对象编程

發布時間:2023/12/19 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的面向对象编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。