0

我有一些函数采用非常特定的矩阵,并在使用我制作的另一个函数时加载了特定的信息。目前该函数接受的矩阵是正常的 R 矩阵类型。但是我想将它们分配为不同的类型或类,以便实现简单的输入检查,这样用户就不能将任何矩阵放入函数中。

在网上看到几个例子后,我认为 S3 方法会很简单:

mat1 <- matrix(c(1:10),ncol=5)

colnames(mat1) <- c("ONE","TWO","THREE","FOUR","FIVE")

as.sdpmgdna <- function(x) {
  class(x) <- "sdpmgdna"
  return(x)
}

mat2 <- as.sdpmgdna(mat1)

就好像我返回 mat2 我看到一个矩阵一样,这似乎是有效的,如果我通过 indecies mat2[1,2] 调用它,我会得到我应该得到的正确值。但是我不能确定有些事情已经改变了——它现在被描述为 sdpmgdna[10] 即它似乎忽略了它有 2 个维度,尽管执行上述操作并将 mat2 打印到屏幕上显示它确实有 2 个维度。另一个奇怪的事情是,如果我这样做colnames(mat2),它们就会被退回。但是,如果我尝试查找单个列的 colname,例如colname(mat2[,4]),则返回的值是NULL. 任何人都可以解释为什么这是或我应该做什么 - 我真的希望它基本上是一个矩阵,但是因为函数要求它在什么和多大的矩阵方面非常具体,将它定义为另一个类会错误和输入检查更容易 - 并允许我使用 R 的方法机制,所以我所有的自定义绘图函数都可以只是 plot() 的方法。

4

2 回答 2

1

如果您使用colnames普通矩阵的单个列,您还会得到NULL

colnames(mat1[,1])
NULL
dim(mat1[,1])
NULL
dim(mat1[,1,drop=FALSE])
[1] 2 1
colnames(mat1[,1,drop=FALSE])
[1] "ONE"

另一个问题是,由于您的新矩阵没有matrix类,因此需要类对象的方法matrix将不起作用。最好也matrix作为类属性给出:

isSymmetric(mat2)
Error in UseMethod("isSymmetric") : 
  no applicable method for 'isSymmetric' 
  applied to an object of class "sdpmgdna"
class(mat2)<-c("sdpmgdna","matrix")
isSymmetric(mat2)
[1] FALSE

请注意,即使没有矩阵类,有些事情也可以作为:

class(mat2)<-c("sdpmgdna")
is.matrix(mat2)
[1] TRUE
于 2013-03-13T17:49:37.813 回答
1

你应该改变

class(x) <- "sdpmgdna"

class(x) <- c("sdpmgdan", "matrix")

这样R首先搜索您的类方法,如果没有找到它们,它将使用矩阵方法

于 2013-03-13T18:01:14.727 回答