for循环寻找实际值和下一个值之和大于x的位置。

问题描述 投票:0回答:1

我想创建一个for循环,对一个向量进行迭代。一旦它找到一个位置,在这个位置的实际值和下一个位置的值之和大于100,它就应该打印索引号,然后中断。

我使用了下面的示例向量

v <- sample(1:100, 100, replace = TRUE);

到目前为止,我创建了

for (index in 1:length(v)){
  if (sum(v[index]+v[index+1]) > 100){
    print(sprintf("found in %s", v[index]));
  }
  if (sum(v[index]+v[index+1]) > 101) break
};

考虑到我正在寻找一个位置的值加上下一个位置的值,如何确保在打印找到的第一个位置后循环中断(我在第一个位置或之后的位置中断,因为它也应该被考虑在内?

感谢任何意见

r for-loop
1个回答
3
投票

一些评论。

  • 如果你想添加 xy 一起,你可以使用 x + ysum(x, y). 他们是不同的,如果 xy 是向量(试一试就知道了!)。但如果 xy 都是单值(长度1),它们是一样的。sum(v[index]+v[index+1]) 似乎是多余的--保持简单,使用一个或另一个。

  • 如何确保在打印出第一个找到的位置后循环中断?

    break 紧接着 print().

  • ...考虑到我正在寻找一个位置的价值加上下一个位置的价值。

    那是你的 if() 语句。因为你同时使用了 v[index]v[index + 1]你已经考虑到了这两个方面。

  • 如果你到了循环的最后一次迭代,其中的 index = length(v)那么 v[index + 1] 会给出一个越界错误。所以你应该只循环到第二个到最后一个元素。

  • 欢迎来到R,这里不需要分号。

所以,清理后的for循环可能是这样的。

for (index in 1:(length(v) - 1)){
  if (v[index] + v[index + 1] > 100){
    print(sprintf("found in %s", v[index]))
    break
  }
}

1
投票

你可以不使用 for 循环 。

v <- c(23, 45, 67, 33, 45)
which.max(head(v, -1) + tail(v, -1) > 100)
#[1] 2

返回总和大于100的一对的第一个索引。


以上的变化是 。

which.max(v[-1] + v[-length(v)] > 100)
which.max(v + dplyr::lead(v) > 100)
which.max(v + data.table::shift(v, type = 'lead') > 100)
which.max(v + dplyr::lag(v) > 100) - 1
which.max(v + data.table::shift(v) > 100) - 1
© www.soinside.com 2019 - 2024. All rights reserved.