これは、オブジェクトに関する章に基づいて、ここにWeb表現があるHadley Wickham(RStudioのチーフサイエンティスト)による「AdvancedR、2nd edition」(CRC Press、2019)による多数のRオブジェクトシステムの更新された高速要約です。 -指向プログラミング。
2015年の初版には、ここにWeb表現があり、OOに関する対応する章がここにあります。
OOシステムへのアプローチ
Hadleyは、オブジェクト指向プログラミングへの2つの異なるアプローチを区別するために、次のように定義しています。
関数型OOP :メソッド(呼び出し可能なコードピース)はジェネリック関数に属します(Java / C#ジェネリックメソッドと混同しないでください)。メソッドは、グローバルルックアップテーブルに配置されていると考えてください。実行するメソッドは、関数の名前と、その関数に渡される1つ以上の引数のタイプ(またはオブジェクトクラス)に基づいてランタイムシステムによって検出されます(これは「メソッドディスパッチ」と呼ばれます)。構文的には、メソッド呼び出しは通常の関数呼び出しのように見える場合がありますmyfunc(object, arg1, arg2)
。この呼び出しにより、ランタイムはペア( "myfunc"、typeof(object))または場合によっては( "myfunc"、typeof(object)、typeof(arg1)、typeof(arg2))に関連付けられたメソッドを検索します。言語がそれをサポートしている場合。RのS3では、ジェネリック関数のフルネームは(関数名、クラス)のペアを示します。例:mean.Date
は、日付の平均を計算する方法です。methods("mean")
関数名を持つジェネリックメソッドをリストしてみてくださいmean
。機能的OOPアプローチは、たとえばOOのパイオニアであるSmalltalk、Common Lisp Object System、Juliaに見られます。Hadleyは、「Rと比較して、Juliaの実装は完全に開発されており、非常にパフォーマンスが高い」と述べています。
カプセル化されたOOP:メソッドはオブジェクトまたはクラスに属し、メソッド呼び出しは通常のようになりますobject.method(arg1, arg2)
。オブジェクトがデータ(フィールド)と動作(メソッド)の両方をカプセル化するため、これはカプセル化と呼ばれます。メソッドは、オブジェクトまたはオブジェクトのクラスの説明に添付されたルックアップテーブルにあると考えてください。ランタイムは、メソッド名と、場合によっては1つ以上の引数のタイプに基づいてメソッドを検索します。これは、C ++、Java、C#などの「人気のある」オブジェクト指向言語に見られるアプローチです。
どちらの場合も、継承がサポートされている場合(おそらくサポートされている場合)、ランタイムは、呼び出しルックアップキーに一致するものが見つかるまで、クラス階層を上方向にトラバースする可能性があります。
Rオブジェクトがどのシステムに属しているかを確認する方法
library(sloop) # formerly, "pryr"
otype(mtcars)
#> [1] "S3"
Rオブジェクトシステム
S3
- 機能的なOOPアプローチ。
- ハドリーによると最も重要なシステム。
- 最も単純で、最も一般的です。Rが使用した最初のオブジェクト指向システム。
- ベースRが付属し、ベースR全体で使用されます。
- 強制的な保証ではなく、規則に依存します。
- Chambers、John M、およびTrevorJHastieを参照してください。1992年。「Sの統計モデル」。Wadsworth&Brooks / Cole Advanced Books&Software。
- 詳細は「AdvancedR、2ndedition」 はこちら。
S4
- 機能的なOOPアプローチ。
- ハドリーによると、3番目に重要なシステム。
- S3の書き直し。したがって、S3に似ていますが、より正式でより厳密です。プログラムの設計について慎重に考える必要があります。大規模なシステムの構築に適しています(例:Bioconductorプロジェクト)。
- 基本の「メソッド」パッケージに実装されています。
- 参照:Chambers、John M. 1998.「データを使用したプログラミング:S言語のガイド」。スプリンガー。
- 詳細は「AdvancedR、2ndedition」 はこちら。
RC別名「リファレンスクラス」
- カプセル化されたOOPアプローチ。
- ベースRが付属しています。
- S4に基づいています。
- RCオブジェクトは、「可変」でもある特殊なタイプのS4オブジェクトです。つまり、Rの通常のcopy-on-modifyセマンティクスを使用する代わりに、インプレースで変更できます。可変状態は、醜いバグの原因となることを推論するのは難しいですが、特定のアプリケーションでより効率的なコードにつながる可能性があることに注意してください。
R6
- カプセル化されたOOPアプローチ。
- ハドリーによると2番目に重要なシステム。
- R6パッケージに含まれています(でインストール
library(R6)
)
- RCに似ていますが、より軽量ではるかに高速です。S4やメソッドパッケージに依存しません。R環境の上に構築されています。またあります:
- パブリックメソッドとプライベートメソッド
- アクティブなバインディング(アクセスされると実際にメソッドを呼び出すフィールド)
- パッケージ間で機能するクラス継承
- クラスメソッド(クラスに属し、、、を介してインスタンスにアクセスできるコード)
self
とメンバー関数(フィールドに割り当てられているが、メソッドではなく、関数のみ)の両方private
super
- Rの「copy-on-modify」セマンティクスを回避するための標準化された方法を提供します
- パッケージサイト「R6:R用のカプセル化されたオブジェクト指向プログラミング」を参照してください。
- 詳細は「AdvancedR、2ndedition」 はこちら。
その他
R.oo(RCに似ている)、proto(プロトタイプベース、JavaScriptだと思う)、Mutatrなどの他にもあります。ただし、「AdvancedR」は次のように述べています。
広く使用されているR6とは別に、これらのシステムは主に理論的に重要です。それらには長所がありますが、それらを知って理解しているRユーザーはほとんどいないため、他の人があなたのコードを読んで貢献することは困難です。
「AdvancedR、第2版」のトレードオフの章も必ずお読みください。