-1

2 つの数値を比較し、最後にプログラムですべての数値を並べ替える数式の作成に問題があります。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回のループの後、ソートされましたが、最後のループ中にまだ順序が変更されているため、spr壊れTrueません。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
}
于 2013-03-02T14:24:29.570 に答える