在for循环中跳过迭代时,避免存储空值

时间:2016-11-14 14:54:09

标签: r for-loop

当某些条件被激活以跳转到下一次迭代时,是否存在避免在迭代过程中存储空值的方法? "如何解决&#34的意图;这个问题与循环的结构本身

有关

[ CONTEXT ]:

我指的是当你需要在一个循环中使用一个存储机制和一个条件语句的情况,并给出了一个场景,其中基本上一个可能的路径不是你感兴趣的。为了在当下给出处理,而不是计算的后验,你跳到下一次迭代。

[示例

假设给定一定数量的数字,我只对存储列表中大于2的序列号感兴趣。

storeGreaterThan2 <- function(x){
y <- list()
    for (i in seq_along(x)) {
        if (x[i] > 2) {
            y[[i]] <- x[i]
        } else {
            next
        }
    }
y
}

前一个函数处理最终目的,但是当激活跳过迭代的条件时,索引中的缺失操作在最终列表中用空值填充。

> storeGeaterThan2(1:5)
[[1]]
NULL

[[2]]
NULL

[[3]]
[1] 3

[[4]]
[1] 4

[[5]]
[1] 5

本着处理循环结构内部问题的精神,它如何处理?

1 个答案:

答案 0 :(得分:1)

这是一个相当奇怪的例子,我想知道它是否是x-y problem。最好多说一下你的情况以及你最终想做什么。例如,尝试执行此操作的方法有多种,具体取决于函数的输入是否始终为升序。 @ Dave2e的comment在我看来,根据你的真实情况,会有更好的方法。无论如何,您只需删除NULL元素,然后再返回列表。考虑一下:

storeGreaterThan2 <- function(x){
  y <- list()
    for(i in seq_along(x)) {
      if(x[i] > 2) {
        y[[i]] <- x[i]
      } else {
        next
      }
    }
  y <- y[-which(sapply(y, is.null))]
  return(y)
}
storeGreaterThan2(1:5)
# [[1]]
# [1] 3
# 
# [[2]]
# [1] 4
# 
# [[3]]
# [1] 5

这是一种可能的方法,无需存储NULL元素,而不是在最后清理它:

storeGreaterThan2 <- function(x){
  y <- list()
  l <- 1                   # l is an index for the list
  for(i in seq_along(x)){  # i is an index for the x vector
    if(x[i] > 2) {
      y[[l]] <- x[i]
      l      <- l+1
    } 
  }
  return(y)
}