-1

我在创建公式时遇到了一些问题,该公式比较两个数字并在最后程序对所有数字进行排序。我创建(拥有)一个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)

4

1 回答 1

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-1make 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
}
于 2013-03-02T14:24:29.570 回答