2014-01-14 134 views
0

我想一個新行追加到每個I運行時間的函數的矩陣每次運行。我認爲,第一次運行函數時創建了一個矩陣,並在後面的時間中添加一個帶有值的新行。追加新行的功能

這是一些虛擬數據。可以說xy是矩形的邊和z某種形式的ID。實際上,這些並不是事先知道的,而是由函數輸出的。真正的函數將一個物種目錄作爲參數,讀取形狀文件,合併多邊形並執行一系列其他操作,但輸出表面區域。對於每個物種(即函數運行),我想將每個輸出區域存儲在矩陣或數據框中以供進一步分析,而不是將其輸出到單個變量。

myfunc <- function(x, y, z){ 
    area <- x*y 
    id <- z 
    tmp <- cbind(area,id) 
    assign(as.matrix('mtrx'), rbind(tmp), envir=.GlobalEnv) 

} 

以上顯然只會創建矩陣並在每次運行函數時覆蓋它。

任何指針將是非常非常感謝!

+0

第一個參數需要是要分配的對象的名稱。爲什麼你要將字符串轉換爲字符矩陣?這個'assign('mtrx',....)'工作嗎?一旦你運行功能 –

+0

矩陣'mtrx'創建... –

+1

OK,但我的觀點是第一個參數'assign'是你想分配給,而不是一個矩陣的東西的名字的特徵向量。閱讀'?assign'。 –

回答

1

這是基本的想法。

myfunc <- function(ID) { 
    # do a bunch of stuff based on ID 
    # calculate area 
    area <- 2*ID + rnorm(1,0,10) # fake the area... 
    return(c(ID=ID,area=area)) 
} 

ID.list <- rep(1:100) # list of ID's 
result <- do.call(rbind,lapply(ID.list,myfunc)) 
# head(result) 
#  ID  area 
# [1,] 1 -14.794850 
# [2,] 2 13.777036 
# [3,] 3 17.807578 
# [4,] 4 21.070712 
# [5,] 5 11.904047 
# [6,] 6 3.735771 

返回IDareac(ID=ID, area=area)名爲向量。撥打電話lapply(...),爲所有身份證辦理。然後使用do.call(rbind,...)將它們全部綁定在一起。

+0

@jihoward:感謝您的評論。啊,是的,這看起來很不錯!乾杯! –

1

強烈建議這個方法,但是你需要使用get在最後一行

assign('mtrx', rbind(get('mtrx', envir=parent.frame()), tmp)), envir=.GlobalEnv) 
+0

感謝您的評論。爲什麼是建議反對的理由?我實際上的功能是合併多邊形(物種分佈)並計算表面積。輸入參數是一個物種。我只想將所有計算的區域放入一個矩陣或數據框中以供進一步分析。 –

+3

分配到不同環境的明顯替代方法是將矩陣傳遞給另一個環境。針對這種分配方法的建議的原因是因爲沒有通過矩陣得到的結果很少,而且存在很多脆弱性和錯誤結果。假設你的代碼只是簡單的幾行代碼是相對無害的,但即使如此,這在代碼中引入了不必要的複雜性。換句話說,我想不出一個很好的理由,但可以想到許多不該做的不好的理由。 –

2

如果,在你的榜樣,你知道值x,在yz它是有道理的說這樣的話:

> f1 <- function(x, y, z) c(x*y, z) 
mapply(f1, x=seq(4), y=seq(4), z=seq(4)) 

>  [,1] [,2] [,3] [,4] 
[1,] 1 4 9 16 
[2,] 1 2 3 4 

如果這些變量的值被另一個函數返回,那麼最好存儲它們直到你準備好通過最終函數運行所有的值(例如,上面的f1)。

你說

的新行值附加

但在RAM中的新矩陣是創建assign ED)與新行每次追加時添加。 (你在Circle 2)。 對於小型數據,這在實踐中不太可能成爲問題。

此外,使用assign可以使呼叫的環境內的功能(例如,另一個功能)時確定範圍彆扭,所以一般最好避免如果可能的話。通常有更好的選擇。

+1

感謝您的評論。 '(..)第一次函數運行時創建了一個矩陣,並且後面的時間,附加了一個新的帶有值的行被添加了,這正是我想要它的方式,因此''只創建矩陣並且每次都覆蓋它該函數運行'。 –