矩阵中自定义S4类的控制表示

时间:2014-08-22 10:50:11

标签: r matrix s4

如果我使用自定义类,实例化它并将其添加到矩阵中,我可以控制输出的外观吗?

例如,我有一个类cell我实例化并添加到矩阵中。当我show矩阵时,它会显示为问号。我可以控制输出的外观吗?

setClass("cell", representation(a="character", b="character"))

setMethod("show", "cell",
          function(object) print(paste(object@a,'|',object@b))
)

cell1<-
  new("cell", a="hello", b="world")

mat1<-
  matrix(c(cell1))


> print(cell1)
[1] "hello | world"
> print(mat1)
     [,1]
[1,] ?  

1 个答案:

答案 0 :(得分:2)

不幸的是,print似乎没有在初始调度之后调度对象的子组件,这非常烦人但可能出于效率原因而完成。这是一个解决方法:

setMethod("as.character", "cell", function(x, ...) paste(x@a, '|', x@b))    
cell_matrix <- function(...) {
  structure(matrix(...), class="cell_matrix")
}
print.cell_matrix <- function(x, ...) {
  mat.char <- lapply(x, as.character)      
  dim(mat.char) <- dim(x)
  print(mat.char)
}
mat1 <- cell_matrix(c(cell1, cell1, cell1, cell1), nrow=2)
mat1

产地:

     [,1]            [,2]           
[1,] "hello | world" "hello | world"
[2,] "hello | world" "hello | world"

这里我有懒惰和混合的S3和S4类,但是如果你在一个包中做这个,你可能想要实现一个S4 cellMatrix类,并定义一个as.character方法对于那个类,而不仅仅是单个单元格。

请注意,当您为每个单元格创建对象时,这可能是相对低效的,然后您将遍历每个单元格。我将创建包含所有单元格的所有a值的向量,以及所有单元格的所有b值,然后创建逻辑,使其看起来像元素是个体的。事情会快得多。