という名前の 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
問題は、なぜ最初のものが機能するのかということです。