如果我使用自定义类,实例化它并将其添加到矩阵中,我可以控制输出的外观吗?
例如,我有一个类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,] ?
答案 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
值,然后创建逻辑,使其看起来像元素是个体的。事情会快得多。