在R中,当循环输出停止变化时,如何使循环停止?

时间:2017-11-02 06:01:21

标签: r igraph

我有这样的代码:

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:5) {
 print(V(g)$a)
 print(mean(V(g)$a == 1))
 print(i)

 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
if(time>5) {
 break
}
}

所以,现在循环中的命令运行5次。但是在i = 3之后,属性&#34; a&#34;的值为1的节点的比例。停止改变。我想改变循环,以便如果属性&#34; a&#34;的值为1的节点的比例,它将自动中断。停止改变。

所以不要重复5次命令,我希望它重复3次(当输出停止变化时)并打破循环。

1 个答案:

答案 0 :(得分:2)

我猜V(g)$a是有问题的价值?如果是这样,你可以试试这个:

i <- 1
prev_value <- FALSE

repeat {
  print(V(g)$a)
  print(mean(V(g)$a == 1))
  print(i)

  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

  if (V(g)$a[i] == prev_value) {
    break
  }

  prev_value <- V(g)$a[i]
  i <- i + 1
}

这基本上保存了上一次迭代的值,并将其与当前迭代的值进行比较。如果它们等于循环中断。