参考布局函数的图从一个列表



我希望能够从列表中引用函数。有了这个代码,我想自动导出不同布局的图形。我正在使用图形库。

问题是我得到了函数的文本,而不是函数的引用。

你能不能提供一些代码的变化,使这个工作?

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()
}

如果将实际的函数对象放入列表中,则无法再找到它们的名称。函数对象不存储它们的名称。您需要使列表成为一个命名列表,或者简单地收集函数名:

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只是根据图形的大小和其他属性调用其他布局函数之一。你遗漏了一些布局功能,如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"                      

我会做do.call(layouts[i], list(g)),其中layouts是矢量(如下所示),g是您的图形。

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 and布局。Norm给出错误(可能需要额外的参数)。我将把它留给你(因为你的问题是关于从列表/向量中获得函数内的布局矩阵)。

最新更新