2013-03-02 3 views
-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)

+2

Что с 'рода (х)'? – Ista

ответ

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 
} 
+0

Большое спасибо. Ты лучший :)) – Phantom

Смежные вопросы