我有一个简单的列表
s<-c(1,2,3,4,5,6)我想编写一个循环,测试列表中的每个值是否大于前一个值。
for(i in 1:length(s)){
if(s[i]<s[i-1]){
print("ok")
}
}在if (si > si - 1) {:是长度为零的中,得到了错误-错误。
我知道发生这种情况的原因--因为当它是s1
发布于 2021-07-04 19:50:19
我们需要从2开始,因为第一次迭代的i-1返回0,R索引从1开始。
for(i in 2:length(s)) {if(s[i] < s[i-1]) print("ok")}或者,如果我们想使用from 1:length(s) (seq_along是一个比1:length更好的选项),那么只在第一个表达式为真的情况下,做一个短路(&& -只在第一个表达式为真时才计算)条件,以跳过i = 1的if条件。
for(i in seq_along(s)) {
if(i > 1 && (s[i] < s[i-1])) {
print("ok")
}
}使用OP的示例,不会出现任何printed,因为's‘的下一个值总是大于当前值。
发布于 2021-07-04 20:32:25
我们也可以通过一个while循环来完成这个任务:
s <- c(1,2,3,4,5,6)
i <- 2
while(i <= length(s)) {
if(s[i] > s[i - 1]) {
print("Ok")
i <- i + 1
} else {
stop("The ", i, "th element is not greater than its predecessor", call. = FALSE)
}
}
[1] "Ok"
[1] "Ok"
[1] "Ok"
[1] "Ok"
[1] "Ok"发布于 2021-07-04 21:11:56
您应该知道,给定长度为n-1 n的s,可以进行n倍比较。如果从第二个值开始,您可以在for循环中尝试使用for作为条件,例如,
for (i in seq_along(s)[-1]) {
if (s[i] > s[i - 1]) {
print("ok")
}
}这给
[1] "ok"
[1] "ok"
[1] "ok"
[1] "ok"
[1] "ok"一个较短的版本是使用“Diff‘”,例如,
> for (d in diff(s)) {
+ if (d) print("OK")
+ }
[1] "OK"
[1] "OK"
[1] "OK"
[1] "OK"
[1] "OK"https://stackoverflow.com/questions/68248302
复制相似问题