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