いくつかの拡張機能 (追加の関数、追加のプロパティ) を備えた、ほとんどデータ フレームであるクラスを作成したいと考えています。クラスは基本的にデータ フレームですが、そのデータ フレームのスキーマ (以下では「フォーム」と呼ばれる、自動派生、データ フレームとして表され、データ フレームを適切な型にキャストするために使用される) などの追加の属性があります。他にもいくつかあります。ユーザーがこのオブジェクトを、その特別な型を認識しない他の関数で使用する場合、オブジェクトの data.frame 部分を処理するようにしてください。これを行う最善の方法は何ですか?
私が見つけた 2 つの方法はどちらも不十分です。それらと、私がまだ見て解決しようとしている問題をリストします。質問は、私がやろうとしていることを行うための最良の方法は何ですか?
方法 1、「data.frame」を「ベース」スロットとして使用する (この SO 投稿に触発された)
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'))
このメソッドを使用すると、次のようなことができます。
fd$x >> 1 2
names(fd) >> "x"
[更新: 「故障」は、異なる引数で setClass('formhubData', ...) を繰り返し呼び出していた私の環境が原因であることが判明しました。新しい R セッションでは、以下の関数はすべて期待どおりに動作します。]
しかし、それはすぐに壊れます:
nrow(fd) >> NULL
colnames(fd) >> NULL
上記のリンクの投稿とは異なり、単純なものでもis.data.frame
うまくいきません
is.data.frame >> FALSE
方法 2、「データ」スロットを使用する(SP に触発された)
setClass("formhubData", representation(data="data.frame", form="data.frame"))
fd <- new('formhubData', data=data.frame(x=c(1,2)), form=data.frame(name='x', type='select one', label='X'))
デフォルトの定義を失います:
fd$x >> NULL
names(fd) >> integer(0)
しかし、少なくともそれらのほとんどを再定義できます ([、[[ などについてはまだ学習する必要があります)。
dim.formhubData <- function(x) dim(x@data)
names.formhubData <- function(x) names(x@data)
nrow(fd) >> 2
names(fd) >> "x"
ただし、data.frame を受け取るメソッドについては、@data スロットへのパススルーとしてクラスを使用する必要があるという事実を表現できないようです。*.formhubData <- function(x, ...) *(x, ...)
クラスのクライアントが使用する可能性のあるすべての関数を推測してdim.formhubData
、names.formhubData
、 などのように定義するのではなく、のようなものが必要だと感じて います。
このようなことを達成する方法はありますか?