R 的 S4
R 的類別建構有三種方式: S3、S4、與 RC。S3 的重點想法前面已經大致說明。本篇談談關於 S4 。S4 將類別的宣告與類別的實例(instance)建構分開,以 SetClass 函式來宣告類別的結構(包含繼承關係);以 new 函式來建構類別的實例。 例如:
# 宣告 S4 類別 TimeSeries
setClass("TimeSeries",slots=list(series="numeric",start="Date",end="Date",freq="numeric"))
# 宣告 S4 CTimeSeries 繼承 TimeSeries 的子類別,包含相關的兩個 time series
setClass("CTimeSeries",slots=list( y_ts="TimeSeries"),contains="TimeSeries")
# 建構一個 TimeSeries 實例
y <- new("TimeSeries",
series=c(23,34,25,27,31,32,34,36,32,25,21,24),
start=as.Date("20171201","%Y%m%d"),end=as.Date("20181201","%Y%m%d"),
freq=12)
# 建構 CTimeSeries 實例
x <- new("CTimeSeries",
series=c(345,324,295,322,392,435,394,461,432,312,331,351),
start=as.Date("20171201","%Y%m%d"),end=as.Date("20181201","%Y%m%d"),
freq=12,y_ts=y )
# 宣告 S4 類別 TimeSeries
setClass("TimeSeries",slots=list(series="numeric",start="Date",end="Date",freq="numeric"))
# 宣告 S4 CTimeSeries 繼承 TimeSeries 的子類別,包含相關的兩個 time series
setClass("CTimeSeries",slots=list( y_ts="TimeSeries"),contains="TimeSeries")
# 建構一個 TimeSeries 實例
y <- new("TimeSeries",
series=c(23,34,25,27,31,32,34,36,32,25,21,24),
start=as.Date("20171201","%Y%m%d"),end=as.Date("20181201","%Y%m%d"),
freq=12)
# 建構 CTimeSeries 實例
x <- new("CTimeSeries",
series=c(345,324,295,322,392,435,394,461,432,312,331,351),
start=as.Date("20171201","%Y%m%d"),end=as.Date("20181201","%Y%m%d"),
freq=12,y_ts=y )
S4 關於泛型函數(簡稱泛函)也承接得上述的精神將方法宣告與實作分開,以 setGeneric 來宣告泛函,通過 setMethod 來對不同類別進行實作。例如:
# 宣告預測的泛函
setGeneric("forecast",function(object) standardGeneric("forecast"))
# 實作對 CTimeSeries 的 forecast 函式
setMethod("forecast",signature(object="CTimeSeries"), function(object) lm(object@y_ts@series~object@series))
# 呼叫 forecast
forecast(x)
S4 對於類別宣告與定義顯得更有結構,也乾淨清楚。與 S3 都是有趣的設計。
留言
張貼留言