oop - R中的矩阵丢失类属性

标签 oop r r-s3

考虑以下代码:

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"
通常,将泛型函数应用于对象会保留类属性。不适用于矩阵/数字/整数对象。为什么?这种行为可以避免吗?

最佳答案

data.frames 有自己的子集方法 [.data.frame ,它会为您处理类(class)。我不确定为什么 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
}

关于oop - R中的矩阵丢失类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7532845/

相关文章:

f# - 关于 F# 面向对象编程

java - 继承和HAS-A关系

r - mlflow R 安装 MLFLOW_PYTHON_BIN

r - ggplot2中连续变量的方面

r - 多个类的 S3 运算符重载

r - 创建名为 `Median` 的 S4 方法

Javascript 伪经典继承 vs 函数式继承

r - 列表中每个数据框的行数

r - 强制执行指定的S3方法

python - 有两个程序的 GUI 类