S4クラス

S4 クラスの定義

R で S4 クラスを定義するには setClass 関数を利用する。クラス名、スロットの型、スロットの初期値の順で setClass 関数に代入する。次は frasia という S4 クラスを定義する例である。

setClass (
  # クラス名
  "frasia",
  # スロットの型指定
  representation (
    data = "data.frame",    # データフレーム型
    isDEG = "logical",      # ブーリアン型 
    factors = "numeric",    # 数値あるいは数字からなるベクトル(行列や配列は不可)
    method = "character",   # 文字あるいは文字からなるベクトル
    values = "list"         # リスト型
  ),
  # スロットの初期化
  prototype = list(
    data = data.frame(NULL),
    method = "CML",
    values = list(
               p.value = NULL,
               q.value = NULL
             )
  )
)

S4 クラスのスロット

クラスを生成するコンストラクタ関数は new である。クラスで定義した各スロットは @ を利用して、値の代入や参照を行う。スロットに値を代入する際に、setClass で定義した型と異なる型を代入するとエラーが発生する。

# クラスを生成する
frasia <- new("frasia")

# クラスを生成するとともにスロットの値を変更する
frasia <- new("frasia", factors=c(1,1,1,1))


# 値の参照
frasia@factors
## [1] 1 1 1 1

# 値の代入や変更
frasia@method <- c("CML", "NCL") 
frasia@method
## [1] "CML" "NCL"

# 定義と異なる型を代入した場合
frasia@method <- c(1, 2, 3)
## Error in checkSlotAssignment(object, name, value) : 
##   assignment of an object of class “numeric” is not valid for slot "method" in an object of class “frasia”; is(value, "character") is not TRUE

# クラスのスロット一覧を表示させたい時は str 関数を利用する
str(frasia)
## Formal class 'frasia' [package ".GlobalEnv"] with 5 slots
##   ..@ data        :'data.frame':	0 obs. of  0 variables
##   ..@ isDEG       : logi(0) 
##   ..@ norm.factors: num [1:4] 1 1 1 1
##   ..@ method      : chr [1:2] "CML" "NCL"
##   ..@ values      :List of 2
##   .. ..$ p.value: NULL
##   .. ..$ q.value: NULL