2013-05-05 20 views
8

いくつかの拡張(追加機能、追加プロパティ)を備えたかなりのデータフレームであるクラスを作成したいと思います。方法はそれです。クラスは基本的にはデータフレームですが、データフレームのスキーマ(以下、「フォーム」という名前が付けられ、データフレームとして表現され、データフレームを正しいタイプにキャストするために使用される)などのいくつかの追加の属性があります。その他いくつかのことがあります。ユーザーが特別な型を認識しない他の関数でこのオブジェクトを使用する場合、私はそれらのオブジェクトのdata.frame部分を処理する必要があります。これを行う最善の方法は何ですか?追加機能付きdata.frameのサブクラスを作成する方法

私が見つけた2つの方法は両方とも不満足です。私はそれらを列挙し、私がまだ見ている問題と解決しようとしている問題は何か?質問は、私がやろうとしていることをする最善の方法は何ですか?

fd$x     >> 1 2 
names(fd)    >> "x" 

[更新:

方法1は、この方法では、私はのようなものを行うことができます(inspired by this SO post)

setClass("formhubData", representation(form="data.frame"), contains="data.frame") 
fd <- new('formhubData', data.frame(x=c(1,2)), form=data.frame(name='x', type='select one', label='X')) 

"ベース" スロットとして "data.frame" を使用判明します私の環境では、setClass( 'formhubData'、...)を異なる引数で繰り返し呼び出していたため、「ブレークダウン」が発生していました。新鮮Rのセッションでは、予想通り、以下のすべての機能が動作]

しかし、それはかなり迅速に破壊する:上記のリンクポストとは異なり

nrow(fd)    >> NULL 
colnames(fd)   >> NULL 

を、でもシンプルなis.data.frameが機能しません私

is.data.frame   >> FALSE 

方法2、(SPに触発) "データ" スロット

を使用

fd$x    >> NULL 
names(fd)  >> integer(0) 

しかし、少なくとも私はそれらのほとんどは(まだ[、[、などについて学ぶことがあります)を再定義することができます:

dim.formhubData <- function(x) dim([email protected]) 
names.formhubData <- function(x) names([email protected]) 
nrow(fd)  >> 2 
names(fd)  >> "x" 

私はデフォルトの定義を失います

しかし、data.frameをとるどのメソッドでも、自分のクラスを@dataスロットへのパススルーとして使用する必要があるという事実を表現できないようです。私は

はこのような何かを達成するための任意の方法がありますなど、むしろ私のクラスのクライアントが使用する可能性のあるすべての機能を推測しようとするよりも*.formhubData <- function(x, ...) *(x, ...)のようなものの必要性を感じ、そしてdim.formhubDatanames.formhubDataのようにそれらを定義しますか?

+0

方法1の「nrow」と「colnames」は、「R version 3.0.0 Patched(2013-04-15 r62590)」の下で私のために働いています。 –

+0

MartinとR 2.15.2と同じ結果が得られました。また、 'is.data.frame(fd)'が 'TRUE'となりました。しかし、方法2では 'fd'も表示されません! – Frank

+0

さて、同じことをお二人ともお話した後、私は新鮮なRセッションでテストしましたが、今でも良い結果が得られています。多分、RはsetClassを同じ 'formhubData'で何度も呼び出すことを扱っていないでしょう。それが私のことです。 – prabhasp

答えて

1

どちらのアプローチもある程度うまくいきますが、私は実際に方法2を提案しています。 'is-a'対 'has-a'デザインに関する '標準的な'オブジェクト指向の考察は、一般に 'has- 'さらに、Rメソッドはいつでもオブジェクトに追加できるので、いくつかの点では 'is-a'は、あなたのクラスに任意の数の任意の数を行うのが理にかなっていることを宣伝しています。サブ設定などの定義された機能であっても、実現するための厳しい契約です。おそらくユーザがdataの行または列をformhubDataにドロップ/追加する場合は、formの情報を更新したいと考えています。

代わりに、あなたは本当に 'has-a'関係を実装したいと思うし、機会を利用して、インターフェイスを意味のある操作に制限することができます。あなたはまだ、例えば、

setMethod(dim, "formhubData", function(x) dim([email protected]) 

は、例えば、あなたのnrowncolを与え、基礎となる実装への簡単な派遣することにより、最小限の新しいコードと実質的にコードの再利用を得ることができます。一般的な操作(サブセット化など)では、データ構造の整合性を考慮した実装を提供したいと考えています。そして、実際にユーザーがかなり自由にできるような場合は、dataに簡単な「アクセサ」を提供することができます。formフィールドを更新されたデータに合わせるために必要なことは、ユーザによって提供される。

+0

ありがとうございます。部分集合は 'is-a' +データ形式対応契約を破棄する操作ではありませんが、'名前 'の変更のようなものがあります。しかし、私はちょうど 'validity'関数を書いて解決し、' has-a'の純粋さよりむしろ 'is-a'の利便性を楽しむことを考えています。しかし、提案は価値のあるものです。 – prabhasp

関連する問題