S4クラスを含むさまざまな変数のdata.frameを作成したいと思います。「POSIXlt」(日付用)のような組み込みクラスの場合、これは正常に機能します。
as.data.frame(list(id=c(1,2),
date=c(as.POSIXlt('2013-01-01'),as.POSIXlt('2013-01-02'))
しかし今、私はユーザー定義のクラスを持っています。たとえば、名前と年齢を持つ「Person」クラスを考えてみましょう。
setClass("person", representation(name="character", age="numeric"))
しかし、以下は失敗します:
as.data.frame(list(id=c(1,2), pers=c(new("person", name="John", age=20),
new("person", name="Tom", age=30))))
私もオーバーロードしようとしました[...]-を使用して人のクラスの演算子
setMethod(
f = "[",
signature="person",
definition=function(x,i,j,...,drop=TRUE){
initialize(x, name=x@name[i], age = x@age[i])
}
)
これにより、ベクトルのような動作が可能になります。
persons = new("person", name=c("John","Tom"), age=c(20,30))
p1 = persons[1]
しかし、それでも次は失敗します。
as.data.frame(list(id=c(1,2), pers=persons))
おそらく、ユーザー定義クラスをデータフレームに取り込むために、より多くの演算子をオーバーロードする必要がありますか?POSIXltはS4クラスであり、機能するため、これを行う方法があるはずです。新しいR5参照クラスを使用するソリューションも問題ありません。
すべてのデータをpersonクラスに入れたくありません(「id」がpersonのメンバーではない理由は、データフレームを使用しないだけです)。アイデアは、私のdata.frameが、文字列、数値など、さまざまなタイプの多くの列を持つデータベースのテーブルを表すということですが、日付、間隔、ジオオブジェクトなどもあります。間隔、ジオオブジェクトなどのソリューション(POSIXlt)。おそらく、独自のS4/R5クラスを指定する必要があります。
よろしくお願いします。