6

次のコードを検討してください。

A <- matrix(1:12, ncol=4)
colnames(A) <- letters[1:4]
class(A) <- c("foo", "matrix")

Aがサブセットの場合、「foo」クラスラベルが失われます。

class(A[1:2,])
# [1] "matrix"

同じことがベクトルでも起こります。ただし、data.framesでは同じことは起こりません。

B <- as.data.frame(A)
class(B) <- c("foo", "data.frame")
class(B[1:2,])
# [1] "foo"        "data.frame"

そして通常、ジェネリック関数をオブジェクトに適用すると、クラス属性が保持されます。行列/数値/整数オブジェクト用ではありません。なんで?そして、この動作を回避できますか?

4

1 に答える 1

7

data.framesには独自のサブセットメソッド[.data.frameがあり、クラスを自動的に処理します。Primitiveがクラスを保持しない理由はわかりませんが、独自のサブセットメソッドを作成するのは非常に簡単です。

`[.foo` <- function(x, i, j, ...) {
  y <- unclass(x)[i,j,...]
  class(y) <- c("foo",class(y))
  y
}
class(A[1:2,])
# [1] "foo"    "matrix"

編集:
他の人が述べたように、NextMethodここで使用する必要があります。

`[.foo` <- `[.bar` <- function(x, i, j, ...) {
  y <- NextMethod(.Generic)
  class(y) <- .Class
  y
}
于 2011-09-23T17:51:19.847 に答える