атрибут потери класса матрицы в R - PullRequest
5 голосов
/ 23 сентября 2011

Рассмотрим следующий код:

> 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"

И обычно применение универсальных функций к объектам сохраняет атрибут класса.Не для матричных / числовых / целочисленных объектов.Зачем?И можно ли избежать такого поведения?

1 Ответ

7 голосов
/ 23 сентября 2011

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"

EDIT:
Как уже упоминалось, здесь следует использовать NextMethod.

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