【问题标题】:How do I skip a loop iteration based on the value of the last iteration performed?如何根据执行的最后一次迭代的值跳过循环迭代?
【发布时间】:2020-03-29 19:18:39
【问题描述】:

我正在循环一个向量,我想知道如何根据最后一次迭代“跳过”一次迭代。

例如:第一次迭代将命中 1,然后第二次将命中另一个 1,但如果数字与前一个数字相同,我想跳过该迭代。

简单示例:

vector <- c(1, 1, 1, 2, 3, 3, 4)

for (i in vector) {
print(i)
}

我不希望迭代打印出 3 次“1”。我希望它跳到下一次迭代,直到它到达 2。这需要是动态的,因为实际向量要复杂得多。

反之亦然,也许我想执行下一次迭代,前提是之前的迭代相同。

【问题讨论】:

    标签: r loops for-loop iteration


    【解决方案1】:

    rle 提供了另一种方法。对于您的示例数据,它将与unique 执行相同的操作,但在某些其他情况下会有所不同(以似乎更符合您的问题描述的方式):

    vector <- c(1, 1, 1, 2, 3, 3, 4, 1, 1, 5)
    for(i in rle(vector)$values){
        print(i)
    }
    
    #output:
    
    [1] 1
    [1] 2
    [1] 3
    [1] 4
    [1] 1
    [1] 5
    

    【讨论】:

      【解决方案2】:

      如果要显式查看之前的值

      ind <- c(TRUE, vector[-length(vector)] != vector[-1])
      
      print(vector[ind])
      
      # or
      for (i in which(ind)){
        vector[i]
       }
      

      【讨论】:

        【解决方案3】:

        除了unique(),这里还有另外一个选项,专门查看之前​​的值,可以更概括:

        j <- ""
        for (i in vector) {
          if (i == j) {
            j <- i
            next
          }
          print(i)
          j <- i
        }
        

        【讨论】:

        • 这太棒了!谢谢你。我一直在寻找这个可靠的答案。
        【解决方案4】:

        如何迭代向量的unique 值?

        for (i in unique(vector)) {
          print(i)
        }
        # output
        # [1] 1
        # [1] 2
        # [1] 3
        # [1] 4
        

        【讨论】:

        • 这可以作为一个简单的答案,我需要它更健壮一些,因为如果发生特定迭代,我需要发生某些事情。
        • 如果您希望搜索明确检查向量的先前值,请查看@tims 解决方案。还要注意即使使用这个大小为 7 的小向量也会出现效率问题。
        • unique() 肯定更容易看,可能是我默认的...性能可能取决于它正在查看的对象类型有几种不同的方法github.com/wch/r-source/blob/…
        猜你喜欢
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 2013-03-18
        • 2015-02-07
        • 1970-01-01
        • 2019-05-06
        相关资源
        最近更新 更多