我试图填充一组 矩阵(对象)名称保存在列表中的矩阵。我可以 使用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)
所以在最后一行代码中,我收到了错误:
找不到功能&#34;得到&lt; - &#34;
同样,我可以使用:
调用m.1eval(as.name(list.name[1]))
但是R返回类似的&#39;找不到功能&#39;我尝试填充矩阵时出错。
有人可以在我的方法中解释错误吗?
修改/更新
因此,在我尝试简化在此发布的问题时,我意识到我可能已经过度简化了我试图做的事情。
所以,事实上,我试图在一组基质中填充元素。矩阵的名称包含在list.names对象中。我使用嵌套的for()循环来填充矩阵中的每个元素。
所以,事实上,我的问题会更准确地说明:
get(list.names[1])[1,1] <- some_value
有几条回复建议我根据我的原帖使用分配,但考虑到我正在尝试分配&#39;对象中的元素而不是整个对象,这种方法不起作用。
很抱歉这个混乱。
答案 0 :(得分:3)
使用函数assign
代替get
:
assign(list.names[1],c(1,2,3,4))
get
返回一个对象的值,assign
分配。 :)
与eval
相同,它只是评估你的电话。
答案 1 :(得分:3)
这在FAQ 7.21中得到了解决。该FAQ中最重要的部分是它使用列表的结尾(真实列表,而不是您上面列出的列表的向量)。如果你的全球工作空间中有一个matricies列表而不是一堆matricies,那么很多事情会变得容易多了。这是一个例子:
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
简单得多。