我在R语言上做了一些编程工作来进行冒泡排序。有时它在没有任何错误消息的情况下完美地工作,但有时,它显示"错误if if(x [i]> x [i + 1]){:参数长度为零"。任何人都可以帮我查看它有什么问题吗?我附上了我的代码
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 :(得分:2)
发生错误是因为您正在迭代地减少n
。根据原始向量的顺序(或缺少顺序),n
在最后一次更改后可以达到值1。在这种情况下,在下一个迭代步骤中进一步减少n
会解决值x[0]
,这是未定义的。
通过最小的更正,您的代码将正常工作,而不会给出错误消息。尝试替换
行if ( !hasChanged ) break;
带
if ( !hasChanged | n==1 ) break
基本上你有两个终止标准:在前一次迭代中没有任何变化,或n
等于一。在这两种情况下,进一步的迭代都不会改变向量,因为它已经被排序。
顺便说一句,在R编程中,您不需要在命令结尾处使用分号。解释器可以容忍/忽略它,但它会使代码混乱,并且不被认为是良好的编程风格。
希望这有帮助。