我想创建一个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
};
考虑到我正在寻找一个位置的值加上下一个位置的值,如何确保在打印找到的第一个位置后循环中断(我在第一个位置或之后的位置中断,因为它也应该被考虑在内?
感谢任何意见
一些评论。
如果你想添加 x
和 y
一起,你可以使用 x + y
或 sum(x, y)
. 他们是不同的,如果 x
和 y
是向量(试一试就知道了!)。但如果 x
和 y
都是单值(长度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
}
}
你可以不使用 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