R 中的 For 循环(不知道如何停止循环并继续我的其余代码)

For loop in R(no clue how stop the loop and continue with the rest of my code)

我想在 if 条件变为真时停止循环并继续我的代码的下一行。当我 运行 this 时,我得到一个错误,即 blocks[[i]] 中的下标 i 越界。有什么想法吗?

for(i in 1:length(blocks)){
  if(length(blocks[[i]]) == 0){
    path <- path[ -i , -i]

    modes = rep("A", nrow(path))
    blocks[[i]] = NULL
  }
}

注意:我已经阅读了循环、下一步、停止和中断的帮助

使用 STOP 命令,下面的代码应该可以工作

    for(i in 1:length(blocks)){
        if(length(blocks[[i]]) == 0){
          path <- path[ -i , -i]

          modes = rep("A", nrow(path))
          blocks[[i]] = NULL
    `     stop("Outside bounds")


        }

      }

我无法解析您的标题和描述。在我看来你不想停止循环,而是继续整个 object blocks。这可能会有所帮助,当长度不同于 0:

时,它应该跳到下一次迭代
for(i in 1:length(blocks)){
  if(length(blocks[[i]]) != 0) {
    next
  } else if(length(blocks[[i]]) == 0){
    path <- path[ -i , -i]

    modes = rep("A", nrow(path))
    blocks[[i]] = NULL
  }
}

如果我没理解错的话,你想在条件为真时循环,在条件为假时退出循环。所以你应该使用 while 控制流运算符,而不是 for.

i <- 1
while(i<=length(blocks) & length(blocks[[i]])!=0){
    i <- i+1
}

# check that we exited the loop because there was a zero
# and not because we went through all the blocks
if(i != length(blocks+1)) {
    path <- path[ -i , -i]
    modes = rep("A", nrow(path))
    blocks[[i]] = NULL
}
# rest of your code

但是这里确实不需要循环。

# apply 'length' to every element of the list blocks 
# returns a vector containing all the lengths
all_length <- sapply(blocks, FUN=length)

# check that there is at least one zero
if(any(all_length==0)) {
    # find the indexes of the zeros in 'all_length'
    zero_length_ind <- which(all_length==0)

    # this is the index of the first zero
    i <- min(zero_length_ind)
}

我不知道你想做什么,但如果你的计划是按顺序处理所有 'i',你实际上可能想使用 zero_length_ind 并一次处理所有零.

例如,如果你想删除path中对应于blocks中零长度的所有值,你应该直接这样做:

path <- path[-zero_length_ind,-zero_length_ind]

(注意,如果块中没有零长度元素,那么zero_length_ind将是integer(0)(即一个空整数向量)并且你不能用它来索引path。这可能会为您节省一些调试时间。)