首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:参数是长度为零的解

R:参数是长度为零的解
EN

Stack Overflow用户
提问于 2021-07-04 19:48:27
回答 3查看 122关注 0票数 1

我有一个简单的列表

代码语言:javascript
复制
s<-c(1,2,3,4,5,6)

我想编写一个循环,测试列表中的每个值是否大于前一个值。

代码语言:javascript
复制
for(i in 1:length(s)){
  if(s[i]<s[i-1]){
    print("ok")
  }
}

在if (si > si - 1) {:是长度为零的中,得到了错误-错误。

我知道发生这种情况的原因--因为当它是s1

EN

回答 3

Stack Overflow用户

发布于 2021-07-04 19:50:19

我们需要从2开始,因为第一次迭代的i-1返回0,R索引从1开始。

代码语言:javascript
复制
for(i in 2:length(s)) {if(s[i] < s[i-1]) print("ok")}

或者,如果我们想使用from 1:length(s) (seq_along是一个比1:length更好的选项),那么只在第一个表达式为真的情况下,做一个短路(&& -只在第一个表达式为真时才计算)条件,以跳过i = 1if条件。

代码语言:javascript
复制
for(i in seq_along(s)) {
     if(i > 1 && (s[i] < s[i-1])) {
        print("ok")
   }
}

使用OP的示例,不会出现任何printed,因为's‘的下一个值总是大于当前值。

票数 5
EN

Stack Overflow用户

发布于 2021-07-04 20:32:25

我们也可以通过一个while循环来完成这个任务:

代码语言:javascript
复制
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"
票数 3
EN

Stack Overflow用户

发布于 2021-07-04 21:11:56

您应该知道,给定长度为n-1 ns,可以进行n倍比较。如果从第二个值开始,您可以在for循环中尝试使用for作为条件,例如,

代码语言:javascript
复制
for (i in seq_along(s)[-1]) {
    if (s[i] > s[i - 1]) {
        print("ok")
    }
}

这给

代码语言:javascript
复制
[1] "ok"
[1] "ok"
[1] "ok"
[1] "ok"
[1] "ok"

一个较短的版本是使用“Diff‘”,例如,

代码语言:javascript
复制
> for (d in diff(s)) {
+     if (d) print("OK")
+ }
[1] "OK"
[1] "OK"
[1] "OK"
[1] "OK"
[1] "OK"
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68248302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档