2016-08-15 47 views
1

假設我有以下:現在(1)中的R檢索在O列表元素

a <- vector('list',50) 

for(i in 1:50) 
{ 
    a[[i]] <- list(path=paste0("file",sample(0:600,1)),contents=sample(1:5,10*i,replace=TRUE)) 
} 

,例如;我想盡可能快地檢索file45(假設它存在於這個隨機生成的數據中)的內容。

我曾嘗試以下:

contents <- unlist(Filter(function(x) x$path=="file45",a),recursive=FALSE)$contents 

但是,列表搜索開銷使得從內存不是直接從磁盤讀取(在某種程度上)更慢讀。

是否有任何其他方式檢索內容的速度比從磁盤理想地讀取O(1)更快?

編輯:假設有在我的子列表中沒有重複filepaths並有很大程度上超過50個子列表

+0

你是否期待重複的路徑變量? – James

+0

@詹姆斯沒有與我寫得不好的例子所暗示的相反的副本。假設'sample(0:600,1)'在整個50次迭代中不會返回任何副本,即不存在重複的文件路徑 – Imlerith

回答

2

使用names屬性跟蹤的項目相反:

a <- vector('list',50) 

for(i in 1:50) 
{ 
    a[[i]] <- list(contents=sample(1:5,10*i,replace=TRUE)) 
} 

names(a) <- paste0("file",sample(1:600,50)) 

a[["file45"]] 
NULL 
a[["file25"]] 
$contents 
[1] 3 1 3 1 2 5 1 5 1 2 3 1 4 1 1 4 1 5 1 5 1 4 5 2 5 2 2 5 1 1 
+0

你必須這樣做,它的名字(a)[i] < - ...' – James

0

嘗試以下操作:

a[sapply(a, function(x) x$path == "file45")][[1]]$contents 
+0

不幸的是,這比從文件中讀取還要慢。也許這會更好,如果我有一個非常大的文件。 (1) – Imlerith