R言語のS 4類

2463 ワード

S 3クラスの最大の利点は便利であるが、S 3クラスを使用するのは安全ではない.例えば、不正な修正であっても、S 3クラスを任意に変更することができます.S 3クラスについては、R言語のS 3クラスと汎用関数を参照することができる.S 4類の方が安全です.
S 4クラスmyboxを定義し、オブジェクトを初期化するには、次のようにします.
setClass('mybox',
    slots = list(long = 'numeric', width = 'numeric', height = 'numeric', name = 'character')
)
myBox <- new('mybox')
myBox

An object of class "mybox"Slot "long": numeric(0)
Slot "width": numeric(0)
Slot "height": numeric(0)
Slot "name": character(0)
 
オブジェクトmyBoxには、スロット変数として翻訳できる一連のslot変数があります.そのタイプは私たちが設定したタイプです.上記の初期化コードでは、slot変数に値を付けていません.初期化時に値を付けることができます.
myBox <- new('mybox', long = 3, width = 4, height = 5, name = 'box1')
myBox

An object of class "mybox"Slot "long": [1] 3
Slot "width": [1] 4
Slot "height": [1] 5
Slot "name": [1] "box1"
ここでmyBoxオブジェクトのslot変数が割り当てられていることを示します.次の2つの方法でslot変数を得ることができます.
slot(myBox, 'long')
myBox@long

もちろん、slotに値を割り当てることもできます.
myBox@long <- 100
 
 

为了显示S4类是安全的,我们故意输入错误:

myBox@longg <- 100

エラーが表示されます.
Error in checkAtAssignment(「mybox」,「longg」,「numeric」):「longg」is not a slot in class「mybox」注意、S 3クラスではこのような状況は何のヒントもありません.
 
クラスmyboxのために箱の体積を計算する方法volumeを決めることができます.volumeという関数は以前存在しなかったので、まずこの関数自体を汎用関数として定義し、myboxクラスを設定する方法が必要です.
setGeneric('volume',
    function(object) {
        standardGeneric('volume')
    }
)


setMethod('volume', 'mybox', 
    function(object) {
        return(object@long * object@width * object@height)
    }
)

箱の体積を計算できます
volume(myBox)

[1] 60
 
S 3類とS 4類の違いをまとめることができます.
1.S 3クラスを定義する場合、明示的な定義プロセスがなく、S 4クラスを定義する場合、関数setClassを呼び出す必要がある.
2.S 3オブジェクトを初期化する場合、リストを1つ作成してclass属性を設定するだけで、S 4オブジェクトを初期化する場合は関数newを使用する必要がある.
3.抽出変数の符号が異なり、S 3は@であり、S 4は$である.
4.汎用関数を適用する場合、S 3はf.classnameを定義する必要があり、S 4はsetMethod関数を使用する必要がある.
5.汎用関数を宣言する場合、S 3はUseMethod()を使用し、S 4はsetGeneric()を使用する.