【问题标题】:Reference layout functions of igraph from a list从列表中引用 igraph 的布局功能
【发布时间】:2013-03-12 15:00:54
【问题描述】:

我希望能够从列表中引用一个函数。 使用此代码,我想自动导出具有不同布局的图形。我正在使用 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()
}

【问题讨论】:

  • 您是否尝试使用c("..", "...")layouts 设置为vector
  • 将函数名称保存在列表中是一种可接受的解决方案,然后如何调用名称为“fun1”的函数?
  • 它可以与 get() 一起使用吗?让我试试:D
  • 您应该为图形g 的每个布局构造一个layout 矩阵。如果它们都具有相似的参数,那么您可以执行以下操作:do.call(get(layouts[i]), g, ...) 其中layouts 是一个向量,... 是您要传递的其余参数。
  • 如果你提供g,我也许可以进行更多实验(总是提供可重复的示例)。

标签: r list reference igraph


【解决方案1】:

如果将实际的函数对象放入列表中,则无法再找到它们的名称。函数对象不存储它们的名称,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 只是根据图形的大小和其他属性调用其他布局函数之一。您错过了一些布局功能,例如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"                      

【讨论】:

  • tnx,你成功了。现在我可以导出高分辨率图表了。
  • @frinx,您还应该学会为有帮助的答案投票。
  • 二分找不到,合并,norm和sugiyama抛出错误
  • @Arun 我刚刚获得了足够的业力来做到这一点,耐心;)
  • @frinx:那么您使用的是不同的 igraph 版本,运行命令以查看您的版本中可用的内容并检查各个函数以获取所需的参数。正如我所说,layout.norm 不是布局函数,layout.merge 也不是。
【解决方案2】:

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

【讨论】:

  • tnx 寻求帮助,我搞定了。我将编辑您的答案以包含代码组合以形成我正在寻找的答案
  • 您实际上不需要传递任何参数,只需使用get()按名称获取函数即可
  • 是的,然后您将函数复制到另一个对象,然后您可能可以使用该变量运行它。例如:get(layouts[1])(g)
  • @frinx,您的编辑丢失了。我已设法重新创建您的编辑。
  • @frinx,仍然对于某些布局,这个给出了错误。你必须弄清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
相关资源
最近更新 更多