web-dev-qa-db-ja.com

Rのクラス:S3対S4

Rでクラスを作成したいのですが、S3またはS4クラスを使用する必要がありますか?

私はそれらについて多くの異なることを読みましたが、他のものよりも優れたものがありますか?

52
RockScience

S3は最初の引数でのみディスパッチできますが、S4は複数の引数でディスパッチできます。クラス_"bar"_のオブジェクトまたはクラス_"bar"_のオブジェクトを指定した場合に異なることを行う関数fooのメソッドを記述できるようにしたい場合and_"foobar"_、またはクラス_"barfoo"_および_"foobar"_のオブジェクトを指定すると、S4はそのような複雑さを処理するはるかに優れた方法を提供します。

S3は非常にシンプルで簡単に実装できますが、実際のオブジェクト指向システムではありません。その単純さは、クラスに属するオブジェクトに正しいコンポーネント/スロットなどを強制することを犠牲にします。S3ではclass(obj) <- "lm"のようなことができ、メソッドのディスパッチは_"lm"_クラスのメソッドを使用しますobjが渡されたとき、objが実際にクラス_"lm"_のオブジェクトであるという保証はありません。

S3は実装、文書化が簡単であり、プログラマー側の余分な知識が少なくて済みます。

どちらを使用するかは、あなたが決定できるものにすぎません。たとえば、Doug Bates(2003)は、新しいプロジェクトではS3ではなくS4を使用すると述べています。私はまだS3メソッド以外のものを使用する必要がありませんでした。

それで、私は座って、それらのクラスで操作したいクラスとメソッドの種類について考えます。必要な機能について考えてみてください。これはおそらく、どちらかのシステムを指しているでしょう。

ダグラス・ベイツ。 パッケージをS4に変換する 。 Rニュース、3(1):6-8、2003年6月

60
Gavin Simpson

参照クラス についてはどうですか?それはS3ではなく、S4の上に構文上の砂糖と考える人もいますが、多くの砂糖です。

簡単な例として、数か月前にここで尋ねた質問に this answer をチェックしてください。

そのようなクラスのためにRdファイルを書く方法をまだ見つけなければなりません。

7
mariotomo