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