2017-10-16 6 views
0

私は、クラス "S4DeqResults"を持っています。私が私を考え始めていますどのようにしてR S4オブジェクトを拡張して新しいスロットを確保し、元のオブジェクトを同じように動作させることができますか?

[email protected]_slot = 5 

:基本的に、私は理想的には、このオブジェクトに新しい情報を追加できるようにしたい、私はちょうど私のようなものを保存することができますので、それにいくつかのスロットを追加したいです「DESeqResults」を継承するサブクラスを作成しなければなりませんが、Rのようにそれをどうやって行うかについては正確にはわかりませんが、元のオブジェクトからのデータをそのままどのように保つかについてはもっと心配です。

本質的に、ライブラリはこの "DESeqResults"クラスオブジェクトを作成して使用しており、作成されてデータがあると、多くの機能に使用されます。これらのうちの1つを作成したら、オブジェクトに新しい情報を追加したいだけです。このクラスを拡張して余分なスロットを持つクラスを作成すると、クラスの元のインスタンスから既存のデータをすべてサブクラスの新しいインスタンスにどのように転送できますか?

私がここでやろうとしていることを達成する最良の方法は何でしょうか?任意のオブジェクトがインスタンス化される前に元のクラスを変更して、作成時に余分なスロットが必要になることはありますか?それともこれを達成するための他の方法がありますか?

ありがとうございました!で

## x is some DESeqResults object 
x <- as(x,"myDESRclass") 
[email protected]_slot <- 5 

setClass(
    "myDESRclass", 
    contains="DESeqResults", 
    slots=c(new_slot="numeric") 
) -> myDESRclass 

は、その後、あなたのクラスにオブジェクトを変換するためにasを使用することができます。

答えて

0

これを行うための通常の方法は、親クラスの新しいサブクラスを定義することですほとんどの場合、setAsまたは同等のものを呼び出す必要がありますが、DESeqResultsはスーパークラスであるため、asメソッドはRによって事前定義されており、意図したとおりに動作します。

あなたがこのアプローチを取るしたくない場合は、二つの選択肢があるが、それらはあまり安全である:

1)使用S3の代わりに、S4。難しいかもしれないので、あなたはDESeqResultsクラスを「所有していない」と聞いているようですが、myDESet$new_slot <- 5はエラーにはなりません。

2)スロットは属性として実装されているため、attr(myDESet,"new_slot") <- 5でスロットを設定できます。この修正されたオブジェクトはまだ妥当性チェックに失敗するので、これはかなり不安定になる可能性があります。

関連する問題