比较后排序

时间:2013-03-02 14:07:47

标签: r

我在创建公式方面遇到了一些问题,它比较了两个数字,并在最后的程序中对所有数字进行排序。我创建了(有)带有值x的向量x <- c(5, 10, 2, 35, 1)和带有名称的函数:SortFunc(x)

最后的结果应如下所示:

[1] 1 2 5 10 35

我做了这个功能:

SortFunc <- function(x) {
  n <- length(x)
  repeat {
    spr <- FALSE
    n <- n-1
    for(i in 1:n) {
      if ( x[i] > x[i+1] ) {
        t <- x[i]
        x[i] <- x[i+1]
        x[i+1] <- t
        spr <- TRUE
      }
    }
    if (!spr) break;
  }
  x
}

当我运行SortFunc(x)时,我收到此错误:

Error in if (x[i] > x[i + 1]) { : argument is of length zero

有人洗吗?如果我更改了x <- c(5,8,7,30,1,100) *之类的向量,我会得到真正的解([1] 1 5 7 8 30 100)

1 个答案:

答案 0 :(得分:2)

这是每个循环的函数输出:

R > SortFunc(c(5,10,2, 35, 1))
[1]  5  2 10  1 35
[1]  2  5  1 10 35
[1]  2  1  5 10 35
[1]  1  2  5 10 35
Error in if (x[i] > x[i + 1]) { (from #7) : argument is of length zero

所以在4个循环之后,它已被排序,但在最后一个循环中,它们仍然改变了顺序,因此sprTrue,因此它不会中断。相反,它会继续尝试n <- n-1制作n = 0,这会导致错误。

略微修改您的代码,它可以工作:

SortFunc <- function(x) {
  n <- length(x)
  repeat {
    spr <- FALSE
    for(i in 1:(n-1)) {
      if ( x[i] > x[i+1] ) {
        t <- x[i]
        x[i] <- x[i+1]
        x[i+1] <- t
        spr <- TRUE
      }
    }
    n <- n-1
    if (n == 1 | !spr) break;
  }
  x
}