2010-11-22 17 views
6

私は、RにS3クラスを書いています。 x1とx2がこのクラスのオブジェクト( "myclass"と呼びます)であれば、元のクラス定義と属​​性をそのまま使用してmyclassオブジェクトのベクトルを返すことができます。しかし、c()の文書化された動作は属性を削除することです。したがって、独自のc.myclass()メソッドを記述する必要があるようです。私の質問は、私はこれをどうすればできるのですか?カスタムS3クラスのc()関数を書く方法R

問題の例:

myclass <- function(x, n) structure(x, class="myclass", n=n) 
x1 <- myclass(1, 5) 
x2 <- myclass(2, 6) 
c(x1, x2) 
[1] 1 2 
ここ

結果は、ちょうど数値クラスの項目のベクトル、およびオリジナルのn個の属性がなくなっています。

c.myclass <- function(..., recursive = F) { 
    structure(c(unlist(lapply(list(...), unclass))), class="myclass") 
} 

残念ながら、私もこれを動作させることはできません。

さまざまなパッケージのためのコードを見てみると、私は時々私たちはクラス属性が、他には何を維持する必要がある中で、次のようなコードを参照してください。 c.myclass(x1、x2)を呼び出した結果は、ベクトル自体がクラス "myclass"を持ちますが、ベクトルの各項目はクラスnumericを持ちます。私は本当にベクトルの各アイテムにクラス "myclass"が必要です。実際には、他の属性も保持するためにこのメソッドをアップグレードする必要があります(myclassの属性 "n"など)。

答えて

4

これは、作業を行いますが、私はあなたがこのような何かをやっているので、各ベクトルの要素は、クラスの数値を持っていると結論付けたと仮定します。その場合は

foo <- c(x1, x2) 
class(foo[1]) 
class(foo[2]) 

、あなたが抽出された要素がmyclass属性を保持したいです属性を保持するには、サブセットメソッド"[.myclass"を記述する必要があります。ここで

+0

ありがとう、ジョシュア、あなたの提案が働いた。 – Abiel

7

は(私が思う)あなたがc[のための具体的な方法を経由して欲しいん何例です。

c.myclass <- function(..., recursive = FALSE) { 
    dots <- list(...) 
    ns <- sapply(dots, attr, which = "n") 
    classes <- rep("myclass", length(dots)) 
    res <- structure(unlist(dots, recursive = FALSE), class = classes) 
    attr(res, "n") <- ns 
    res 
} 

`[.myclass` <- function (x, i) { 
    y <- unclass(x)[i] 
    ns <- attr(x, "n")[i] 
    class(y) <- "myclass" 
    attr(y, "n") <- ns 
    y 
} 


myclass <- function(x, n) structure(x, class = "myclass", n = n) 
x1 <- myclass(1, 5) 
x2 <- myclass(2, 6) 
c(x1, x2) 
c(x1, x2)[2] 

しかし、それは、我々は余分の設定とサブセットを扱う管理しなければならないことでファッジですnを保持する属性。これは実際には、記録のための属性を持つ数値ベクトルnです。

すべてのベクトルの総称であるリストを使用する方が自然かもしれません。あなたのケースでは、より関与していて上記のもので十分でしょうか?

関連する問題