2

リストから関数を参照できるようにしたい。このコードを使用して、さまざまなレイアウトのグラフのエクスポートを自動化したいと考えています。igraph ライブラリを使用しています。

問題は、関数への参照ではなく、関数のテキストを取得することです。

これを機能させるために、いくつかのコード変更を提供していただけますか?

library(igraph)
g2 <- barabasi.game(100)
layouts = list(layout.auto, 
        layout.random, 
        layout.circle, 
        layout.sphere, 
        layout.fruchterman.reingold, 
        layout.kamada.kawai, 
        layout.spring, 
        layout.reingold.tilford, 
        layout.fruchterman.reingold.grid, 
        layout.lgl, 
        layout.graphopt, 
        layout.svd, 
        layout.norm)
for(i in layouts) {
    plot.igraph(g, layout=i, vertex.label=NA, vertex.size=3, edge.color="darkblue", edge.lty=3)
    dev.copy(png,paste("figures/network_v0.1_",substitute(i),".png",sep=""))
    dev.off()
}
4

2 に答える 2

8

実際の関数オブジェクトをリストに入れると、それらの名前を見つける方法はもうありません。関数オブジェクトはその名前を保存しません、AFAIK。リストを名前付きリストにするか、単に関数名を収集する必要があります。

library(igraph)
g <- barabasi.game(100)
layouts = c("layout.random",
  "layout.circle",
  "layout.sphere",
  "layout.fruchterman.reingold",
  "layout.kamada.kawai",
  "layout.spring",
  "layout.reingold.tilford",
  "layout.fruchterman.reingold.grid",
  "layout.lgl",
  "layout.graphopt",
  "layout.svd")

for (alg in layouts) {
  print(alg)
  coords <- do.call(alg, list(g))
  png(paste("figures/network_v0.1_", alg, ".png", sep=""))
  plot.igraph(g, layout=coords, vertex.label=NA,
              vertex.size=3, edge.color="darkblue", edge.lty=3)
  dev.off()
}

いくつかの意見。layout.normレイアウト関数ではありません。layout.autoグラフのサイズやその他のプロパティに基づいて、他のレイアウト関数の1つを呼び出すだけです。いくつかのレイアウト機能、たとえばその他を見逃しlayout.drlました。これらすべてを一覧表示して、不要なものを除外する方法は次のとおりです。

grep("^layout\\.", ls("package:igraph"), value=TRUE)
#  [1] "layout.auto"                      "layout.bipartite"                
#  [3] "layout.circle"                    "layout.drl"                      
#  [5] "layout.fruchterman.reingold"      "layout.fruchterman.reingold.grid"
#  [7] "layout.graphopt"                  "layout.grid"                     
#  [9] "layout.grid.3d"                   "layout.kamada.kawai"             
# [11] "layout.lgl"                       "layout.mds"                      
# [13] "layout.merge"                     "layout.norm"                     
# [15] "layout.random"                    "layout.reingold.tilford"         
# [17] "layout.sphere"                    "layout.spring"                   
# [19] "layout.star"                      "layout.sugiyama"                 
# [21] "layout.svd"                      
于 2013-03-12T15:32:20.793 に答える
3

はベクトル(以下に示すように)であり、グラフはdo.call(layouts[i], list(g))どこですか。layoutsg

library(igraph)
g <- barabasi.game(100) #example graph
layouts = c("layout.auto", 
        "layout.random", 
        "layout.circle", 
        "layout.sphere", 
        "layout.fruchterman.reingold", 
        "layout.kamada.kawai", 
        "layout.spring", 
        "layout.reingold.tilford", 
        "layout.fruchterman.reingold.grid", 
        "layout.lgl", 
        "layout.graphopt", 
        "layout.svd", 
        "layout.norm")

for(i in layouts) {
    plot.igraph(g, layout=get(i), vertex.label=NA, vertex.size=3, 
              edge.color="darkblue", edge.lty=3)
    dev.copy(png,paste("figures/network_v0.1_",i,".png",sep=""))
    dev.off();
}

layout.spring, layout.graphopt, layout.svd andlayout.norm` でエラーが発生します (おそらく追加のパラメーターが必要です)。それはあなたにお任せします(あなたの質問は、リスト/ベクターから関数内のレイアウト行列を取得することに関するものです)。

于 2013-03-12T15:18:47.090 に答える