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" ループも同様に長くかかります。実際、1 つのソース頂点から他の 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日になります。
これは「参照渡し」と「値渡し」の問題の 1 つですか? もしそうなら、誰かがそれを解決する方法を理解するのを手伝ってくれますか? このような問題を解決するために R でハッシュまたは環境関数を使用することを聞いたことがありますが、それについてコメントできますか? これに対処するのに役立つRのパッケージについても聞いたことがありますか?
基本的に、C でコーディングせずにこれを解決するにはどうすればよいでしょうか。