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

一些回复建议我根据我的原始帖子使用 assign ,但鉴于我试图在 object 中“分配”一个元素而不是整个 object ,这种方法将行不通。

对困惑感到抱歉。

4

2 回答 2

5

这在 FAQ 7.21 中得到解决。该常见问题解答中最重要的部分是它说使用列表的结尾(一个真正的列表,而不是您在上面调用列表的向量)。如果您在全球工作空间中有一个矩阵列表而不是一堆矩阵,那么很多事情都会变得容易得多。这是一个例子:

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 )

这比弄乱getand简单得多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 回答