我正在使用 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 语言编写代码?