6

私はRでS3クラスを書いています。これは、いくつかの属性が付加された単なる整数です。x1とx2がこのクラスのオブジェクト(「myclass」と呼びます)の場合、c(x1、x2)が元のクラス定義と属​​性をそのままにしたmyclassオブジェクトのベクトルを返すようにします。ただし、文書化されたc()の動作は属性を削除することであるため、独自のc.myclass()メソッドを作成する必要があるようです。私の質問は、どうすればこれを行うことができますか?

問題の例:

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

2 に答える 2

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です。

すべてのベクトルのジェネリックであるリストを使用する方が自然な場合があります。あなたの場合、もっと複雑で、おそらく上記で十分なビットですか?

于 2010-11-22T09:42:15.743 に答える
4

これは機能しますが、次のようなことをしているので、各ベクトル要素には数値クラスがあると結論付けていると思います。

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

その場合、抽出された要素に属性を保持させたい場合は、myclass属性を保持するサブセットメソッド"[.myclass"を作成する必要があります。

于 2010-11-22T02:00:07.627 に答える