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 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 方便多了。 





留言

這個網誌中的熱門文章

標準差與 Wald 統計量

可能性比檢定(Likelihood ratio test)

Wold Decomposition Theorem