2013-03-08 165 views
3

我試圖填充一組 矩陣,其中矩陣(對象)名稱保存在列表中。我可以 使用get()返回具有給定名稱的對象,但當我使用get()來定義矩陣 對象時,我是 運行到函數問題我想填充。R 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) 
在代碼的最後一行

所以,我得到一個錯誤:

找不到功能 「使< - 」

同樣,我可以使用呼叫M.1:

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

但是當我嘗試填充矩陣時,R會返回一個類似的'could not find function'錯誤。

有人能解釋我的方法中的錯誤嗎?

編輯/更新:

所以在我試圖簡化張貼在這裏的問題,我意識到,我可能過於簡化什麼,我試圖做的。

所以,實際上,我試圖在一組基元中填充元素。這些矩陣的名稱包含在list.names對象中。我使用嵌套for()循環來填充矩陣內的每個元素。

所以,其實,我的問題會更準確地表述爲:

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

一對夫婦的答覆都建議我用分配基於我原來的職位,但考慮到我attemping到在對象中「賦值」一個元素而不是整個對象,這種方法將無法工作。

對不起,我感到困惑。

+0

我想你想'assign'在'assign(get(list.names [1]),1:4)'中。我無法解釋具體情況,但解釋聽起來像這樣:從'get'返回的對象沒有賦值('<-')方法,這是錯誤所指示的。所有的警告你幾乎不需要這種體操來達到類似的結果。在另一個問題上擴展這個可能會產生一些更好的答案,理解和代碼。 – Justin 2013-03-08 21:57:52

+2

@Justin不完全。它是'get()'沒有賦值函數,不是'get()'返回的對象。基本上沒有''get < - '()'函數,因此錯誤。它是解析器,它看到這種構造並將它轉換爲調用「get < - 」(x = list.names [1],value = c(1,2,3,4))'評估參數,從而得出關於沒有函數''get < - 「'的錯誤。 – 2013-03-08 22:11:42

回答

3

使用功能assign代替get

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

get返回一個對象的值,assign受讓人。 :)

eval一樣,它只是評估你的電話。

+0

謝謝大家。可以使用assign來更改/填充Object中的單個元素嗎?實際上,我的代碼是一系列嵌套循環,我使用輔助函數來生成元素值。我試過:assign(list.names [1] [1,1],1)沒有運氣。 – user2059737 2013-03-08 22:22:02

+2

你可能想看'with'和'within',...'assign'創建一個名稱對象,而'with'和'within'允許訪問內部組件。爲什麼不能更準確地描述你的問題? – 2013-03-08 22:30:50

3

這在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) 

這比用getassign亂搞簡單得多。

+0

太棒了。完善。謝謝! – user2059737 2013-03-08 23:20:56