2016-03-20 32 views
0

バブルソートを行うためにR言語のプログラミング作業を行った。場合によっては、エラーメッセージなしで完全に動作することもありますが、「if(x [i]> x [i + 1]){:引数の長さがゼロである」というエラーが表示されることがあります。誰が私に何が間違っているかを確認するのに役立つことができますか?私はあなたが繰り返しnが減少しているため、エラーが発生しR言語のバブルソートコードのエラーメッセージ

example <- function(x) { 
    n <- length(x) 
    repeat { 
    hasChanged <- FALSE 
    n <- n - 1 
    for(i in 1:n) { 
     if (x[i] > x[i+1]) { 
     temp <- x[i] 
     x[i] <- x[i+1] 
     x[i+1] <- temp 
     hasChanged <- TRUE 
     cat("The current Vector is", x ,"\n") 
     } 
    } 
    if (!hasChanged) break; 
    } 
} 

x <-sample(1:10,5) 
cat("The original Vector is", x ,"\n") 
example(x) 
+0

'traceback'を使用して、どの関数呼び出しが誤った入力を得ているかを判断しましたか?また、無駄な空きスペースをなくしてください。 –

答えて

2

以下の私のコードを添付しています。元のベクトルの順序(またはその欠如)に応じて、nは最後の変更後に値1に達する可能性があります。その場合、次の反復ステップにおけるnのさらなる減少は、値が未定義であるx[0]に対処する。

最小限の修正で、エラーメッセージを表示せずにコードが正常に動作します。

if (!hasChanged | n==1) break 

は基本的に2つの終了基準を持っているとライン

if (!hasChanged) break; 

を交換してみてください。何もどちらかが前の反復で変更されていないかnは1に等しいです。いずれの場合も、それが既に注文されているので、さらなる反復はベクトルを変更しない。

ところで、Rプログラミングでは、コマンドの最後にセミコロンは必要ありません。インタプリタによって許容される/無視されますが、コードを混乱させ、良いプログラミングスタイルとはみなされません。

これが役に立ちます。

+0

+1コードを修正している最中の変更はこれを修正する最良の方法ではありません。より良い方法は、後の時点で 'n 'を減らすことです。しかし、これにはかなりの書き換えが必要です。 –

関連する問題