在R中的O(1)中检索列表元素

时间:2016-08-15 08:57:28

标签: r performance search file-io

假设我有以下内容:

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个子列表

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

尝试以下方法:

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