【问题标题】:For loop in R(no clue how stop the loop and continue with the rest of my code)R中的for循环(不知道如何停止循环并继续我的其余代码)
【发布时间】:2015-08-27 08:38:27
【问题描述】:

我想在我的 if 条件变为真时停止循环并继续执行我的代码的下一行。当我运行它时,我收到一个错误,即 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
  }
}

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

【问题讨论】:

  • 尝试阅读help("for")? (您将了解nextstop
  • 不是一个答案,只是一个评论......如果你这样做了,你应该在问题中提到它。很多人没有阅读帮助,您的问题的答案确实在帮助中,因此我的“明显评论”......
  • @JamesMarshall 无需讽刺。您的问题中没有任何内容表明您已经在某处尝试过 next/stop/break。问问自己你是否真的描述了你的问题。并阅读How to ask
  • @JamesMarshall 花一些时间在 SO 上,你会看到的。整个星球都不像你那么聪明,而且由于 SO 不是免费的代码服务,我们希望提问者尽最大努力尝试解决问题并揭露他们是如何被阻止的,而不是要求“给我代码”。你没有在这里展示它们。再次查看我在之前评论中链接的“如何提问”页面。
  • @JamesMarshall(与某人交谈时,ping 他们以便他们收到通知,并且很清楚您在说谁)。 不是一个讨论论坛,它是一个旨在解决代码问题的问答网站。

标签: r loops break


【解决方案1】:

如果我对您的理解正确,您希望在条件为真时循环并在条件变为假时退出循环。所以你应该使用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。这可能会节省您需要一些调试时间。)

【讨论】:

  • 非常感谢这个想法!!我想提一下,我想发现我的列表的第一个 emtpy 观察并删除它。例如。 mylist{ c(a),c(b),c(c).......} 当 c(a) = character(o) 或 mylist[[1]] = 0 时删除它
  • 运行while 循环后,i 包含第一个空观察的索引。注意没有空观察的情况,那么循环后i会是length(blocks)+1
  • 但我建议你使用“无循环”代码,它也会产生第一个空观察的索引。由于基本操作是矢量化的,因此可以很容易地避免这种情况,因此在 R 中使用循环效率更高,而且味道不好。注意没有空观察的情况,您应该检查 all_length 是否包含至少一个零。
  • 你知道吗,我只是添加了你应该做的测试,因为它们真的很重要,否则代码会失败。顺便说一句,如果您的问题得到解答,请标记它。
【解决方案2】:

使用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")


        }

      }

【讨论】:

  • 谢谢你在某种程度上提供了帮助。老实说,这恰好在我想要的地方停止了循环,但是我可以在循环之后再说十行,我想找到一种方法来继续这一行。有什么建议吗?
【解决方案3】:

我无法解析您的标题和说明。在我看来,你不想停止循环,而是继续你的对象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
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    相关资源
    最近更新 更多