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

Posted

技术标签:

【中文标题】在 R 中,当循环的输出停止变化时,如何使循环停止?【英文标题】:In R, how do you make a loop stop when the output of the loops stops changing? 【发布时间】:2017-11-02 06:01:21 【问题描述】:

我有这样的代码:

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 次(当输出停止变化时)并打破循环。

【问题讨论】:

【参考方案1】:

我猜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

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

【讨论】:

返回:if (V(g)$a == prev_value) 中的错误:参数长度为零 啊是的,当 prev_value 为空时 if 条件不起作用。尝试用prev_value &lt;- FALSE替换prev_value &lt;- numeric() 使用 FALSE 防止了错误。但是,现在有一个问题,它只考虑了这个属性值的第一个值,因此,它在 i=2 而不是 i=3 之后停止,这是我希望它停止的地方。 V(g)$xyz 是第二个属性吗?如果是这种情况,请查看我对帖子所做的编辑 抱歉不够清楚。当我说属性的第一个值时,我的意思是该命令在确定是否满足“if 语句”时只查看第一个节点的属性值。当我使用代码时,它告诉我:警告消息:在 if (V(g)$a == prev_value) : 条件长度 > 1 并且只会使用第一个元素

以上是关于在 R 中,当循环的输出停止变化时,如何使循环停止?的主要内容,如果未能解决你的问题,请参考以下文章

当没有更多数据时如何停止无限循环(分页)

React js停止循环背景视频

ffmpeg/for 循环:如何使 ffmpeg 或 cmd 循环在发现错误后停止?

如何在python的while循环中停止函数

如何在播放/暂停控制功能中停止无限循环

如何使异步请求Swift 5的for循环停止