【问题标题】:Best way to iterate using for loop使用 for 循环进行迭代的最佳方法
【发布时间】:2015-03-10 11:03:46
【问题描述】:

我正在寻找迭代 R 的最佳方式。我知道简单的解决方案,例如:

times <- 3
for(i in 1:times){

}

但是如果时间

for(i in seq_len(times))

如果我想从 start 迭代到 end

for(i in seq_len(end - start))

但是如果end-start &lt; 0 那么:

seq_len(-1)
Error in seq_len(-1) : argument must be coercible to non-negative integer

我知道我可以在循环之前检查end-start &lt; 0,但这不是很干净的解决方案......还有其他想法吗?

澄清一下 - 我正在寻找类似于其他编程语言的解决方案,例如 C++/Java:

for(int i = start; i < end; i++)

所以如果start=5end=3 循环甚至不会开始。

【问题讨论】:

  • 如果你正在迭代一个对象本身,你可以使用seq_along。这能解决您的问题吗?
  • 如果没有更多的例子,很难说出什么是有意义的——这个循环有什么作用?但是,您可以在 for 中执行 abs(end-start),这是绝对值(不是负数) - 这有帮助吗?
  • 并非如此。 seq_along 不起作用,我有范围,而不是对象。我已经编辑了问题:)
  • 为什么要投反对票?这个问题有什么问题?

标签: r loops for-loop


【解决方案1】:

只需编写自己的辅助函数

loop_seq <- function(start,end) {
    if(end<start) return(integer(0))
    seq(start, end)
}

for(i in loop_seq(3,4)) {print(i)}
# [1] 3
# [1] 4
for(i in loop_seq(3,3)) {print(i)}
# [1] 3
for(i in loop_seq(3,2)) {print(i)}
# {nothing}

for 循环将始终遍历一个向量,因此问题实际上不在于 for 循环,它正在创建您需要担心的正确索引向量(:seq_lenseq_along) .

【讨论】:

  • 是的,我在地铁上也有同样的想法:)
【解决方案2】:

鉴于上面的示例(C++/Java),您实际上是在查看 while 循环。

复制你的例子:

start = 5
end = 3
i <- start

while(i <= end){
  print(i)
  i = i+1
}

这个循环不会开始。请注意&lt;=,因为 R 是 base-1 索引的。当然你可以只修改索引,但这更干净。

【讨论】:

  • @bartektartanus,可以理解,但我相信 R for 循环至少会运行一次,除非您事先提供条件。当然,如果这样的事情是可能的,我想被这里的一位 R 大师证明是错误的。
  • 我可以证明这一点 :) 只需检查这两个示例:for(i in integer(0)){print(i)} 不打印任何内容,但这个可以for(i in integer(1)){print(i)}
  • @bartektartanus,非常有趣。我没有考虑过 0 整数,但我相信这可能是唯一的例外。据我所知,如果迭代器小于“结束”迭代器而没有附加条件,则无法使 for 循环不运行。
猜你喜欢
  • 2010-09-11
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
相关资源
最近更新 更多