web-dev-qa-db-ja.com

Rで「S3メソッド」とはどういう意味ですか?

私はRが初めてなので、S3のメソッドとオブジェクトが何なのかわかりません。 S3とS4のオブジェクトシステムがあり、可能であればS4ではなくS3を使用することをお勧めします(http://google-styleguide.googlecode.com/svn/trunk/google-r-style.html)。ただし、S3のメソッド/オブジェクトの正確な定義はわかりません。

110
jiggysoo

関連情報のほとんどは、_?S3_または_?UseMethod_を調べることで見つけることができますが、概要は次のとおりです。

S3は、メソッドのディスパッチのスキームを指します。 Rをしばらく使用していると、さまざまな種類のオブジェクトに対してprintpredict、およびsummaryメソッドが存在することに気付くでしょう。

S3では、これは次のように機能します。

  • 関心のあるオブジェクトのクラスを設定します(例:メソッドglmへの呼び出しの戻り値にはクラスglmがあります)
  • メソッドに一般名(例:print)、ドット、クラス名(例:_print.glm_)を提供する
  • これを機能させるには、この一般名(print)の準備が必要ですが、既存のメソッド名に準拠するだけの場合は、これは必要ありません(ヘルプを参照してくださいあなたがそうするならば、以前に言及しました)。

見る人、特に新しく作成されたファンキーなモデルフィッティングパッケージのユーザーの目には、predict(myfit, type="class")と入力する方がpredict.mykindoffit(myfit, type="class")よりもはるかに便利です。

それにはかなり多くのことがありますが、これはあなたが始めるはずです。オブジェクトの属性(クラス)に基づいてメソッドをディスパッチするこの方法には、かなりの短所があります(そして、Cの純粋主義者は恐らく夜に目を覚まし、恐ろしいことになります)。 Rの現在のバージョンでは、新しい方法(S4および参照クラス)が実装されていますが、ほとんどの人はまだ(のみ)S3を使用しています。

79
Nick Sabbe

S3を使い始めるには、median関数のコードを見てください。コマンドプロンプトでmedianと入力すると、本文に1行あることがわかります。

UseMethod("median")

これは、S3メソッドであることを意味します。つまり、S3クラスごとに異なるmedian関数を使用できます。可能なすべての中央分離法をリストするには、次を入力します。

methods(median) #actually not that interesting.  

この場合、何に対しても呼び出されるデフォルトのメソッドは1つだけです。次のように入力すると、そのためのコードを見ることができます

median.default

もっと興味深い例はprint関数で、これには多くの異なるメソッドがあります。

methods(print)  #very exciting

一部のメソッドには、名前の横に*sがあることに注意してください。つまり、パッケージの名前空間内に隠されています。 findを使用して、どのパッケージに入っているかを調べます。たとえば、

find("acf")  #it's in the stats package
stats:::print.acf
48
Richie Cotton

http://adv-r.had.co.nz/OO-essentials.html から:

Rの3つのOOシステムは、クラスとメソッドの定義方法が異なります。

  • S3は、OOジェネリック関数OOと呼ばれるプログラミングのスタイルを実装します。これは、メッセージ受け渡しOOを実装するJava、C++、C#などのほとんどのプログラミング言語とは異なります。 (メソッド)はオブジェクトに送信され、オブジェクトはどの関数を呼び出すかを決定します。通常、このオブジェクトはメソッド呼び出しで特別な外観を持ち、通常はメソッド/メッセージの名前の前に表示されます:例えばcanvas.drawRect( "blue")。 S3は異なります。計算はまだメソッドを介して実行されますが、ジェネリック関数と呼ばれる特別なタイプの関数が呼び出すメソッドを決定します(例:drawRect(canvas、 "blue")。S3は非常にカジュアルなシステムです。クラスの定義。

  • S4はS3と同様に機能しますが、より形式的です。 S3には2つの大きな違いがあります。 S4には、各クラスの表現と継承を記述する正式なクラス定義があり、ジェネリックとメソッドを定義する特別なヘルパー関数があります。 S4には複数のディスパッチもあります。つまり、汎用関数は、1つだけでなく、任意の数の引数のクラスに基づいてメソッドを選択できます。

  • 略してRCと呼ばれる参照クラスは、S3およびS4とはまったく異なります。 RCはメッセージ受け渡しOOを実装するため、メソッドは関数ではなくクラスに属します。 $はオブジェクトとメソッドを分離するために使用されるため、メソッド呼び出しはcanvas $ drawRect( "blue")のようになります。 RCオブジェクトも可変です。Rの通常の変更時コピーセマンティクスを使用しませんが、その場で変更されます。これにより、推論が難しくなりますが、S3またはS4では解決が難しい問題を解決できます。

完全にオブジェクト指向ではない他のシステムも1つありますが、ここで言及することが重要です。

  • 基本型、他のOOシステムの基礎となる内部Cレベル型。基本型はほとんどCコードを使用して操作されますが、その他OOシステム。
34
Amit K Thakur

私はこの質問にほとんど名前がどこから来たのだろうと思いました。 このウィキペディアの記事 から、名前はRのベースとなっているSプログラミング言語のバージョンを指しているようです。他の回答で説明されているメソッドディスパッチスキームはSに由来し、バージョンに応じて適切にラベル付けされています。

11
Sam Hoice

試して

_methods(residuals)
_

これには、「residuals.lm」および「residuals.glm」などが含まれます。これは、線形モデル、m、およびタイプresiduals(m)をフィッティングすると、residues.lmが呼び出されることを意味します。一般化線形モデルをフィッティングすると、residues.glmが呼び出されます。それは、逆さまになったC++オブジェクトモデルのようなものです。 C++では、派生クラスによってオーバーライドされる仮想関数を持つ基本クラスを定義します。 Rでは、仮想(別名ジェネリック)関数を定義してから、この関数をオーバーライドするクラスを決定します(別名メソッドを定義します)。これを行うクラスは、1つの共通のスーパークラスから派生する必要がないことに注意してください。一般に、S4よりもS3を好むことに同意しません。 S4にはより多くの形式(=タイピング)があり、これは一部のアプリケーションには多すぎるかもしれません。ただし、S4クラスは、C++のクラスまたは構造体のように定義できます。たとえば、特定のクラスのオブジェクトが文字列と2つの数字で構成されるように指定できます。

_setClass("myClass", representation(label = "character", x = "numeric", y = "numeric"))
_

そのクラスのオブジェクトで呼び出されるメソッドは、それらのメンバーを持つオブジェクトに依存できます。これは、要素の単なるリストであるS3クラスとは大きく異なります。

S3およびS4では、fun(object, args)ではなくobject$fun(args)によってメンバー関数を呼び出します。後者のようなものを探しているなら、protoパッケージを見てください。

8
Harald Brendel