4

マトリックス(オブジェクト)名がリストに保持されているマトリックスのセットにデータを入力しようとしています。get()を使用して指定された名前のオブジェクトを返すことができますが、get()を使用して入力しようとしている行列オブジェクトを定義すると、関数の問題が発生します。

#Create list of matrix names:
list.names <- c("m.1")

#Create matrix object
m.1 <- matrix(nrow=2,ncol=2)

#Return matrix m.1 from the list.names using get(). Works great!
get(list.names[1])

#Populate m.1 with some values. Doesn't work.
get(list.names[1]) <- c(1,2,3,4)

したがって、コードの最後の行で、エラーが発生します。

関数「get<-」が見つかりませんでした

同様に、次を使用してm.1を呼び出すことができます。

eval(as.name(list.name[1]))

しかし、マトリックスにデータを入力しようとすると、Rは同様の「関数が見つかりませんでした」エラーを返します。

誰かが私のアプローチのエラーをここで説明できますか?

編集/更新:

ですから、ここに投稿するための質問を単純化しようとして、私がやろうとしていることを単純化しすぎたのではないかと気づきました。

したがって、実際には、一連の行列内の要素にデータを入力しようとしています。行列の名前はlist.namesオブジェクトに含まれています。ネストされたfor()ループを使用して、行列内の各要素にデータを入力しています。

したがって、実際には、私の問題はより正確に次のように記述されます。

get(list.names[1])[1,1] <- some_value

いくつかの返信では、元の投稿に基づいて割り当てを使用することを提案していますが、オブジェクト全体ではなくオブジェクト内の要素を「割り当て」ようとしているため、このアプローチは機能しません。

混乱させて申し訳ありません。

4

2 に答える 2

5

これは FAQ 7.21 で対処されています。その FAQ の最も重要な部分は、リスト (実際のリストであり、上記のリストと呼んでいるベクトルではありません) を使用するように指示されているところです。グローバルワークスペースに多数の行列ではなく、行列のリストがあると、多くのことが簡単になります。次に例を示します。

mnames <- c('m.1','m.2','m.3')
m.1 <- matrix(1, 2, 2)
m.2 <- matrix(2, 2, 2)
m.3 <- matrix(3, 2, 2)

## put matricies into a list
mymats <- lapply( mnames, get )
names(mymats) <- mnames

## change 1 value in each matrix a different way
mymats[['m.2']][1,1] <- 22
mymats[[1]][2,2] <- 11
tmp <- "m.3"
mymats[[tmp]][1,2] <- 33

## change the same element in each matrix using a loop
for( i in seq_along(mymats) ) {
 mymats[[i]][2,1] <- 44
}

## apply the same function to every matrix and simplify the output
sapply( mymats, rowMeans )

getこれは、と をいじるよりもはるかに簡単ですassign

于 2013-03-08T23:07:07.720 に答える
3

assignの代わりに関数を使用get:

assign(list.names[1],c(1,2,3,4))

getオブジェクトの値を返し、assign割り当てます。:)

と同じことですeval。呼び出しを評価するだけです。

于 2013-03-08T21:57:40.597 に答える