R 的 R5
R 宣告與使用類別有三種方式: S3、S4、與 R5。這裡的 R5 就是所謂 reference classes。之前,S3 與 S4 概念上的重點事實在類別是為配合泛函而存在的。因為 R 本身是一種函式語言(functional programming language),所以這樣的設計出發點是很自然的。 在 R 中,所謂 Reference classes(RC) 可能更貼近資訊專業背景所熟悉的 OO 類別了。
RC 不同於 S3 與 S4 ,在於 RC 中的方法是在類別中宣告的,而不是由泛函作為代理的。所以 RC 更接近一般所熟悉的 OO 語言如 Java 或 C++ 等。另外,類別的實例的語法也有相對應的調整。
RC 使用 setRefClass 來宣告定義類別:
setRefClass(class, fields=,contains,methods=,where=,...)
class: 定義類別名稱
fields: 定義類別的屬性
contains: 定義所繼承的類別
methods: 定義類別方法
where: 定義在哪個 environment 儲存空間
例如: 用 setRefClass 定義一個 Reference class 類別,
# 定義一個 TimeSeries 類別的產生器 TimeSeriesGen
TimeSeries <-setRefClass("TimeSeries",
# 定義類別屬性
fields=list(series="numeric",start="Date",end="Date",freq="integer"),
# 定義類別方法
methods = list(
# If the class has a method defined for
# this method will be called once the reference object has been created.
initialize = function(series,start,end,freq) {
# Fields may be modified in a method by using the non-local assignment operator,
series <<- 0
start <<- as.Date("19710101","%Y%m%d")
end <<- as.Date("19710101","%Y%m%d")
freq <<- 12
},
# 加上另一個 TimeSeries
addTimeSeries = function(x_ts) {
# Fields may be modified in a method by using the non-local assignment operator,
series <<- series + x_ts$series
}
)
)
# 使用 TimeSeriesGen 產生 TimeSeries 類別物件
# 當有定義 initialize 函式時,呼加 new 不用傳遞參數
# 當沒定義 initialize 函式時,呼加 new 傳遞參數
y_ts <- TimeSeries$new()
上述,y_ts 與實例的 TimeSeries 物件就是屬於 reference 的關係。例如:
y1_ts = y_ts
y_ts$freq = 10
因為 y1_ts 與 y_ts reference 到相同的物件,所以 y1_ts$freq 也變作 10 了! 這也就是 reference class 的精神。之前,在 R 要做 reference 是不容易的,要用 environment。有 RC 方便多了。
RC 不同於 S3 與 S4 ,在於 RC 中的方法是在類別中宣告的,而不是由泛函作為代理的。所以 RC 更接近一般所熟悉的 OO 語言如 Java 或 C++ 等。另外,類別的實例的語法也有相對應的調整。
RC 使用 setRefClass 來宣告定義類別:
setRefClass(class, fields=,contains,methods=,where=,...)
class: 定義類別名稱
fields: 定義類別的屬性
contains: 定義所繼承的類別
methods: 定義類別方法
where: 定義在哪個 environment 儲存空間
例如: 用 setRefClass 定義一個 Reference class 類別,
# 定義一個 TimeSeries 類別的產生器 TimeSeriesGen
TimeSeries <-setRefClass("TimeSeries",
# 定義類別屬性
fields=list(series="numeric",start="Date",end="Date",freq="integer"),
# 定義類別方法
methods = list(
# If the class has a method defined for
initialize
,# this method will be called once the reference object has been created.
initialize = function(series,start,end,freq) {
# Fields may be modified in a method by using the non-local assignment operator,
<<-
series <<- 0
start <<- as.Date("19710101","%Y%m%d")
end <<- as.Date("19710101","%Y%m%d")
freq <<- 12
},
# 加上另一個 TimeSeries
addTimeSeries = function(x_ts) {
# Fields may be modified in a method by using the non-local assignment operator,
<<-
series <<- series + x_ts$series
}
)
)
# 使用 TimeSeriesGen 產生 TimeSeries 類別物件
# 當有定義 initialize 函式時,呼加 new 不用傳遞參數
# 當沒定義 initialize 函式時,呼加 new 傳遞參數
y_ts <- TimeSeries$new()
上述,y_ts 與實例的 TimeSeries 物件就是屬於 reference 的關係。例如:
y1_ts = y_ts
y_ts$freq = 10
因為 y1_ts 與 y_ts reference 到相同的物件,所以 y1_ts$freq 也變作 10 了! 這也就是 reference class 的精神。之前,在 R 要做 reference 是不容易的,要用 environment。有 RC 方便多了。
留言
張貼留言