我已经定义了一个名为 的 S4 类cell
,我想将其实例分配给一个 3x3 矩阵(选择 3x3 是为了确定性)。以下代码适用于 R 版本 2.15.1,并在一个简单的情况下重现了 R 的行为。我发现我可以将类型的对象分配cell
给一个矩阵,该矩阵的条目首先用 初始化为空列表matrix(list(),3,3)
,然后我将新的类型对象分配给cell
条目。问题是:它为什么有效?
setClass("cell", representation = representation(
A="numeric", # a field
B="numeric")) # another one
# initialize the cell
setMethod("initialize", "cell", function(.Object, a,b) {
.Object@A <- a;
.Object@B <- b;
.Object})
createGrid <- function(a,b) {
grid <- matrix(list(),3,3) # note initialization to list()
for (i in 1:3 )
for (j in 1:3)
grid[[i,j]] <- new("cell",j,i);
grid}
这是一个示例会话:
> source("stackoverflow.R")
> grid <- createGrid(1,2)
> grid[[1,3]]
An object of class "cell"
Slot "A":
[1] 3
Slot "B":
[1] 1
> grid[[2,3]]
An object of class "cell"
Slot "A":
[1] 3
Slot "B":
[1] 2
createGrid()
通过将空列表分配更改为进行修改grid<- matrix(0,3,3)
将产生错误:
> grid <- createGrid0(1,2)
Error in grid[[i, j]] <- new("cell", j, i) :
more elements supplied than there are to replace
这并不奇怪,但它确实让我找到了工作代码。以下尝试使用 3x3 单元格矩阵定义new()
失败:
> grid <- matrix(new("cell",1,2),3,3)
Error in as.vector(data) :
no method for coercing this S4 class to a vector
问题是,为什么第一个有效?