R言語のS 4類
2463 ワード
S 3クラスの最大の利点は便利であるが、S 3クラスを使用するのは安全ではない.例えば、不正な修正であっても、S 3クラスを任意に変更することができます.S 3クラスについては、R言語のS 3クラスと汎用関数を参照することができる.S 4類の方が安全です.
S 4クラス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変数に値を付けていません.初期化時に値を付けることができます.
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に値を割り当てることもできます.
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()を使用する.