在 R 中,当循环的输出停止变化时,如何使循环停止?
In R, how do you make a loop stop when the output of the loops stops changing?
我有这样的代码:
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之后,属性"a"值为1的节点比例停止变化。我想更改循环,以便在属性 "a" 的值为 1 的节点的比例停止变化时它会自动中断。
所以我不想重复命令 5 次,而是希望它重复 3 次(当输出停止变化时)并打破循环。
我猜 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
}
这基本上保存了前一次迭代的值,并将其与当前迭代的值进行比较。如果它们相等,则循环中断。
我有这样的代码:
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之后,属性"a"值为1的节点比例停止变化。我想更改循环,以便在属性 "a" 的值为 1 的节点的比例停止变化时它会自动中断。
所以我不想重复命令 5 次,而是希望它重复 3 次(当输出停止变化时)并打破循环。
我猜 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
}
这基本上保存了前一次迭代的值,并将其与当前迭代的值进行比较。如果它们相等,则循环中断。