矩阵丢失R中的类属性

gap*_*ppy 5 oop r r-s3

请考虑以下代码:

> A <- matrix(1:12, ncol=4)
> colnames(A) <- letters[1:4]
> class(A) <- c("foo", "matrix")
Run Code Online (Sandbox Code Playgroud)

当A是子集时,它会丢失"foo"类标签:

> class(A[1:2,])
[1] "matrix"
Run Code Online (Sandbox Code Playgroud)

矢量也是如此.然而,data.frames不会发生同样的情况:

> B <- as.data.frame(A)
class(B) <- c("foo", "data.frame")
> class(B[1:2,])
[1] "foo"        "data.frame"
Run Code Online (Sandbox Code Playgroud)

通常,将泛型函数应用于对象会保留class属性.不适用于矩阵/数字/整数对象.为什么?并且可以避免这种行为吗?

Jos*_*ich 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"
Run Code Online (Sandbox Code Playgroud)

编辑:
正如其他人提到的,NextMethod应该在这里使用.

`[.foo` <- `[.bar` <- function(x, i, j, ...) {
  y <- NextMethod(.Generic)
  class(y) <- .Class
  y
}
Run Code Online (Sandbox Code Playgroud)

  • 使用 NextMethod 比取消分类更好,后者会复制 (2认同)