如何在R中重复一系列功能?

时间:2017-11-01 05:05:24

标签: r igraph

我有一个图表,我正在尝试模拟相互依赖的节点属性,并且不断变化,直到出现某种形式的均衡。但是,我无法使用for循环来处理这一系列命令。有什么东西我不见了吗?

library(igraph)
g <- make_empty_graph (2) %>%
  set_vertex_attr("a", value = 1) %>%
  add_vertices(2, color = 2, "a" = 2) %>%
  add_vertices(2, color = 4, "a" = 3) %>%
  add_edges(c(1,2, 2,1, 1,5, 5,1, 1,4 ,4,1)) %>%
  set_vertex_attr("xyz", value = 3)
plot(g)

for(i in 1:3){
 V(g)$xyz = sapply(V(g), function(x) { NeighborList = neighbors(g, x) ;length(NeighborList[NeighborList$a == 2]) } )
 V(g)$a[V(g)$xyz==1]=2
 V(g)$a
}

所以在这里我希望这段代码能够运行最后3行3次,但如果我像这样做一个for循环,绝对没有任何反应。 理想情况下,我希望它输出3行,如下所示:

[1] 2 1 2 2 3 3

[1] 2 2 2 2 2 3

[1] 2 2 2 2 2 3

所以我可以看到由于网络中的节点相互影响而发生的属性的变化

1 个答案:

答案 0 :(得分:2)

在循环和功能中,自动打印已关闭。因此,以下内容不会打印出任何内容:

> for (i in 1:3) {
+   i
+ }

并且为了打印出某些东西,你明确地在循环中调用print

> for (i in 1:3) {
+   print(i)
+ }
[1] 1
[1] 2
[1] 3

为了得到输出,在你的情况下你只需要在循环中添加print(...)(或类似的):

> for(i in 1:3) {
+   V(g)$xyz = sapply(V(g), function(x) { NeighborList = neighbors(g, x) ;length(NeighborList[NeighborList$a == 2]) } )
+   V(g)$a[V(g)$xyz==1]=2
+   print(V(g)$a)
+ }
[1] 2 1 2 2 3 3
[1] 2 2 2 2 2 3
[1] 2 2 2 2 2 3