2013-07-19 33 views
-1

我非常希望R具有的一個特性是虛擬向量和矩陣,它們沒有存儲空間,但實際上是與計算其成員的函數的接口。R中無存儲和實時計算的向量和矩陣R

這樣一個特徵的一個應用是分層聚類大量的項目,其距離度量計算起來很便宜。目前dist將所有的距離存儲在內存中,所以我可以用它來分類最多隻有20,000個項目。但我希望做更多。由於hclust允許用戶提供dist矩陣,所以這樣的功能將允許我解決內存限制。

一個相關但不太普遍的特性是文件映射向量和矩陣,即將文件用作虛擬內存。

有沒有這樣做的軟件包?寫一個會很簡單嗎?如果我想自己實現這一點,我應該從哪裏開始尋找?

+0

'ff','ffbase','bigmemory' –

+0

請閱讀[** on-topic questions **](http://stackoverflow.com/help/on-topic)上的網頁,或許[**什麼不要問**](http://stackoverflow.com/help/dont-ask) –

+3

對於JIT計算,你總是可以用一個'[''函數來創建一個類似矩陣的對象, '感興趣。 – Peyton

回答

2

[R確實有一個東西,看起來像一個變量的一些設施,但幕後的功能(稱爲主動綁定):

> makeActiveBinding("rand.x", function(...) rnorm(1,100,10), .GlobalEnv) 
> rand.x 
[1] 94.1004 
> rand.x 
[1] 109.3716 

(但必須非常小心使用這一點,它會導致難以追蹤錯誤)

您也可以創建一個對象類型,其中有一個子集方法,可以像@Peyton所提到的那樣快速計算子集方法。

正如在評論中指出的那樣,ff這樣的軟件包會將大型數據對象存儲在磁盤上,但讓您像訪問內存一樣訪問碎片。

但是,這些都不可能實現您所描述的內容。像集羣庫中的agnes這樣的函數將參數傳遞給另一個函數,如data.tableas.dist,它將有效地複製對象(或一次運行函數的結果)。因此,ff對象將被全部加載到內存中,並且活動綁定或方法將被預先調用以創建整個矩陣,然後從那時起使用該方法的副本。

如果你真的想要這個功能(我當然可以看到它的用處),最好重寫集羣(或其他)函數來接受函數而不是數據或距離矩陣。您可以直接從該功能開始,只需剝離不再需要的零件,並將從數據中提取的零件更改爲提供距離信息的功能的調用。