For-Loop:将对象名称添加到图标题和文件名中

时间:2013-07-10 13:39:15

标签: r igraph sna

我想要使用相同的布局绘制大约24个网络(它们都共享相同的顶点)。我是R和igraph的新手,所以我想出了这个解决方案,可能不是很优雅。现在我卡住了。我想知道如何将对象名称(在这种情况下:V_turn1等)放入我的标题中,如果可能的话,还可以放入文件名中。

我添加了一些随机网络,以便更容易重现。它有点像这样:

print("begin")
library("igraph")

V_turn1 <- erdos.renyi.game(n=10,p.or.m=.2,type="gnp",directed=T)
V_turn2 <- erdos.renyi.game(n=10,p.or.m=.1,type="gnp",directed=T)
V_turn3 <- erdos.renyi.game(n=10,p.or.m=.3,type="gnp",directed=T)
V_turn4 <- erdos.renyi.game(n=10,p.or.m=.3,type="gnp",directed=T)

layout.old <- layout.random(V_turn1) 
# I need the same layout for all renderings, because the nodes are all the same across my network data 
list_of_graphs <- c("V_turn1", "V_turn2", "V_turn3", "V_turn4")

png(file="Networks_V3_%03d.png", width=1000,height=1000)

for(i in list_of_graphs){

        plot(get(i), layout=layout.old)  
        title(deparse(list_of_graphs))
        } 
        dev.off()

“deparse(list_of_graphs)”显然不起作用......

实际上,如果我可以为循环的每次迭代指定实际标题,即在新的字符向量或某些东西(如V_turn1的“This is Turn 1”)中,我会更高兴。我觉得必须有一个明显的解决方案,但到目前为止我没有尝试过任何工作。谢谢你的阅读。

2 个答案:

答案 0 :(得分:0)

您可以使用main=的{​​{1}}参数:

plot.igraph

当然,如果你有一个标题的特定模式,你可以使用list_of_graphes来创建list_of_titles。例如,在这里我从图形名称中删除前两个字母以创建图形标题:

list_of_graphs <- c("V_turn1", "V_turn2", "V_turn3", "V_turn4")
list_of_titles <- c("This is Turn 1","This is Turn 2","This is Turn 3","This is Turn 4")
lapply(seq_along(list_of_graphs),
         function(i) plot(get(list_of_graphs[i]), 
                          layout=layout.old,
                          main=list_of_titles[i]))

答案 1 :(得分:0)

您现在的解决方案几乎就在那里。目前,您的for循环正在迭代list_of_graphs,因此每个i都将成为该列表中的元素。

如果您对使用变量名称作为标题感到满意,可以使用i作为标题:

plot(...)
title(i)

标题也可以简单地作为main参数传递给plot函数:

plot(..., main=i)

如果您不想将变量名称用作标题,则需要更多工作。 首先,您需要迭代索引,并使用它来查找图形和标题:

titles <- c("Title 1", "Title 2", "Title 3", "Title 4")
for (i in seq_along(list_of_graphs)) {
   old.i <- list_of_graphs[i]  # This is `i` in your current code
   plot(get(old.i), layout=layout.old, main=titles[i])
}

然而@ agstudy的答案更优雅。