2016-08-15 46 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