我想创建一个迭代向量的 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