75

私はプロのコンテキストでRで定期的にプログラムを作成し、クライアントや同僚向けのパッケージも作成しています。ここにいるプログラマーの中には、Javaのバックグラウンドを持っており、S4メソッドを使用してすべてをオブジェクト指向の方法で実行することを主張している人もいます。一方、私の経験では、S4の実装はパフォーマンスが低下することが多く、コードに希望どおりの動作をさせようとすると、より多くの頭痛の種が発生します。

場合によっては、複雑なオブジェクトを作成したり、既存のオブジェクトを制御された方法で追加したりできる必要があることに間違いなく同意します。しかし、ほとんどの場合、S4の実装は、standardGeneric、メソッド、コンストラクター、初期化子などを定義するなどの面倒な作業なしで、クラシックリストを使用して簡単に実行できます。

RのS4実装を作成することをいつ検討しますか?

編集:明確にするために、Rでのオブジェクト指向一般に関する回答と議論に感謝します。OOPはRでさまざまな方法で実行できますが、私の質問は、特にS4メソッドを使用することの付加価値を目的としています。

4

7 に答える 7

29

私の経験はあなたの経験と一致しているので、S3のみを使用しています。

明確にするために:S4にはいくつかの洗練された機能があります(たとえば、複数の引数でのディスパッチやスロットタイプチェック)が、機能がコストを上回っている状況には遭遇していません。コストの例には、次のものが含まれます。スロットの変更には、完全なオブジェクトコピーが必要であり、(場合によってはさらに悪いことに)S4メソッドへの継続的な変更が必要です。

要するに、私はS4の背後にあるアイデアが好きですが、それが成熟するのを待ってから、自分のコードで使用します。

于 2010-08-30T16:17:45.807 に答える
28

これはあなたには直接当てはまらないと思いますが、Bioconductor 用のパッケージを開発している場合は、S4 を使用するインセンティブがあり、S4 の使用を積極的に奨励し、現在 10 年間の大半を使用しているため、コアのすべてパッケージは S4 を多用します。

setGeneric、setMethod、NAMESPACE の処理など、余分なオーバーヘッドはすべて苦痛であることがわかりました。すべての場合と同様に、トレードオフが関係しています。私はそれがもっときれいになると思います-S3メソッドが命名規則(foo.class)によって単純に偽装される方法が嫌いです。そうは言っても、そうするように言われない限り、私は自分のコードで S4 を多用することを避ける傾向があります。

于 2010-08-31T18:08:55.190 に答える
9

素晴らしい質問です!そして、それがいくつかの思慮深い議論を生み出すことを願っています...

私はこれを使用したことがありません。また、次の理由で使用するつもりもありません。

  1. パフォーマンス
  2. S4とS3の関係を完全に理解する忍耐力がありません。
  3. 構文上のsuguar:method(object)よりもobject.method()が欲しいです。

私はsuguarが好きです、何と言えばいいですか!

于 2010-08-30T17:27:39.633 に答える
9

動物の足跡データの Spatial (sp) クラスを拡張するために S4 ​​を学習しました。必要なすべてをゼロから作成することを避けるために、利用可能なオプションの中から最良の選択 (最も一貫性があり、一般的で、多くの GIS 定義と密接に一致する) でした。S4 は多くの人が言うほど面倒ではありませんが、今ではこのようなオブジェクトの根底にある構造を調べることに慣れています。パフォーマンスも良いです。うまくやれると思いますが、下手するとパフォーマンス トラップがあります。

空間データに興味があるなら、spatstat は S3 で sp に似た多くのことを行う方法の良い例ですが (一見すべての空間データと同様に . . .)、異なるソフトウェアのデータ構造間に明確な類似性はほとんどありません。 .

于 2011-01-17T09:28:06.177 に答える
6

spS4 クラスは、あるタイプのデータから別のタイプのデータへの変換がシームレスに見える空間統計 (sensu パッケージ) で強力な役割を果たします。これの落とし穴はデバッグです。これは、私の経験ではせいぜい退屈なものでした。これまでのところ、私は S3 で管理していますが、将来的には S4 の使用を検討する可能性があります。

時間が経つにつれて、さまざまなことが行われるようになるにつれて、R のさまざまな分野 (空間分析、計量経済学、環境計量学など) の少なくともコア機能で強力な役割を果たすと私は信じています。

于 2010-08-31T07:36:14.537 に答える
5

R で OO を実行する 3 番目の方法を提供する R.oo (CRAN 上) も存在することを忘れないでください。私の考えでは、これは他のシステムから移行するプログラマーにとってより親しみやすい OO システムを提供します。関数 (そのため、print(foo) は foo のクラスでディスパッチする必要があります) メソッドはオブジェクトに関連付けられているため、foo$print() を実行します - Python や C++ で foo.print を実行するのと同じように().

于 2010-08-31T15:06:56.193 に答える
5

むかしむかし、Roxygen2 は S4 メソッドが好きではありませんでした。2017年現在(少なくとも)、彼らは一緒に働いています。

私は、S3 クラスと S4 クラスの両方で動作するメソッドを必要とするいくつかの関数を作成するという不運に見舞われました。R コアは、これらのシステムがどのように相互作用するか、名前空間がどのように機能するか、および Rcmd チェックがどのように機能するかについての詳細を何度も変更したため、このコードを何年にもわたって機能させ続けることは非常に困難でした。

Google のスタイル ガイドが気に入らない場合は、R-help のこのスレッドにある有名な R パッケージ開発者のコ​​メントを検討してください。

Frank Harrell 「自分の時間を大切にするよりもコンピュータ サイエンスを愛するなら、S4 を使用してください。」

Terry Therneau は次のように書いています: 私がやっていることの 90% について、厳密な (S4) クラスよりも緩い (S3) クラスを強く好みます.... S4 と S3 の私の要約

S4 は次の点で大きく増加します: 1. 書くのが煩わしい 2. デバッグが難しい 3. 非常にあいまいなコードを書く能力 4. デザイン

S4 の利点: 5. 自動変換を指示する機能 6. クラス オブジェクトの内容を検証する

于 2012-08-02T20:29:26.060 に答える