我正在使用R中的图形对象(igraph包)。 我应用了一个名为"get.shortest.paths()"的函数,它提供了从给定顶点到图形中所有其他顶点的最短路径。该算法返回一个列表,其中列表的每个元素对应于一个目标顶点,并包含源和目标之间最短路径上所有顶点的顶点索引。例如;
head(get.shortest.paths(graph, from = V(graph)[1], to = V(graph), mode = "out"))
[[1]]
[1] 0 (source and target are the same)
[[2]]
[1] 0 91835 38405 89704 1
[[3]]
[1] 0 91835 12104 39002 22670 2
[[4]]
[1] 0 62386 36754 89246 31045 3
问题是当我想从顶点索引转到顶点名称时。 像这样的东西;
[[1]]
[1] "gene 1"
[[2]]
[1] "gene 1" "protein 45" "protein 83" "protein 70" "gene 2"
[[3]]
[1] "gene 1" "protein 45" "protein 30" "reaction 2" "protein 404" "gene 3"
[[4]]
[1] "gene 1" "protein 4" "reaction 12" "protein 19" "protein 494" "gene 4"
我尝试使用 lapply() 来做到这一点
path.index.list <- get.shortest.paths(graph, from = V(graph)[1], to = V(cn), mode = "out")
path.name.list <- lapply(path.index.list, FUN = function(path) V(graph)[path]$name)
。但这需要很长时间。 "for"循环需要同样长的时间。 事实上,我需要从一个源顶点到所有其他 100,000+ 顶点的索引到名称的确切时间是......
system.time(lapply(path.index.list, FUN = function(path) V(graph)[path]$name))
user system elapsed
608.62 152.69 761.66
。整个图表大约需要 900 天。
这是"按引用传递"与"按值传递"问题之一吗,如果是这样,有人可以帮助我了解如何解决它吗? 我听说过在 R 中使用哈希或环境函数来解决这样的事情,任何人都可以对此发表评论吗? 我还听说过 R 中的一些包可以帮助解决这个问题?
基本上,如何在不必用 C 编码的情况下解决这个问题?
预先查询顶点的名称,并在lapply
中索引:
names <- V(graph)$name
lapply(path.index.list, FUN = function(path) names[path])
我想这会快得多,因为lapply
不必每次都构建V(graph)
和名称列表,只是为了选择它的子列表。
是的,我最初使用的是使用"Tamás"描述的lapply方法。 我每次迭代大约 230 秒(每 2 个项目大约 1000 秒)。 我尝试使用"快速匹配"包与使用矩阵的内存分配相结合,速度实际上下降了。 我认为这意味着这更多的是R查找项目的速度而不是内存的问题。 我需要将其减少到每次迭代不到 6 秒,这实际上是实用的。 我想我要去C...