2016-03-20 18 views
0

我在R語言上做了一些編程工作來完成氣泡排序。有時它完美地工作,沒有任何錯誤消息,但有時,它顯示「錯誤在if(x [i]> x [i + 1]){:參數的長度爲零」。任何人都可以幫我檢查它有什麼問題嗎?我附上我的代碼如下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。根據原始矢量的順序(或缺少),n可以在最後一次更改後達到1的值。在這種情況下,在下一個迭代步驟中進一步減少n可解決未定義的值x[0]

使用最少的更正,您的代碼將正常工作,而不會給出錯誤消息。試着用

if (!hasChanged | n==1) break 

基本上有兩種終止條件,以取代線

if (!hasChanged) break; 

:要麼什麼也沒有在先前的迭代被更改或n等於一體。在這兩種情況下,進一步的迭代都不會改變向量,因爲它已經被排序。

順便說一下,在R編程中,在命令結尾不需要分號。解釋器容忍/忽略它,但是它混亂了代碼並且不被認爲是好的編程風格。

希望這會有所幫助。

+0

+1,儘管在修復代碼時最小的變化並不值得去解決這個問題。更好的方法是稍後減少'n';但是這需要更多的重寫。 –