Ошибка в цикле while: отсутствует значение, где требуется true / false

Я пытаюсь написать программу, используя цикл while:

(ОБНОВЛЕНИЕ: решение найдено !!, поскольку в приведенной ниже части должно быть указано истинное / ложное утверждение), функция if должна иметь четкое обоснование.

while ((it_count) < it_max && it_change > tol)
     {

    wj <- Kc%*%yj               #LS regression for wj
    vj <- wj/as.vector(t(wj)%*%wj)      #normalization of wj
    cj <- t(yj)%*%vj            #LS regression for cj
    old_yj <- yj
    yj <- yj%*%cj
    yj <- yj/as.vector(t(yj)%*%yj)      #normalize new yj
    diff_y <- yj - old_yj
    it_change <- diff_y/as.vector(t(diff_y)%*%diff_y)
    it_count <- inc(it_count)
     }

    if (a == j ) break 
    else 
    {warning(paste("failed to converge for component", a, "steps"))}

Вам нужен только один символ & для оператора AND

Rohit 10.09.2018 08:14

@Rohit: && работает иначе, чем один &, поскольку он возвращает только один результат, даже если вы применяете его к векторам. Часто это лучший выбор для пунктов if.

Marius 10.09.2018 08:23

Да и нет, одиночный & выполняет поэлементное сравнение и, таким образом, возвращает логический вектор длины n, в то время как двойной && всегда возвращает единственное значение ИСТИНА / ЛОЖЬ, оценивая первый элемент слева направо. Однако ни то, ни другое не изменит представленную здесь ошибку.

MrGumble 10.09.2018 08:24

Ошибка возникает из-за того, что одна из переменных в (it_count) < it_max && it_change > tol - это NA, поэтому любое сравнение оценивается как NA, которое не является ни ИСТИННЫМ, ни ЛОЖНЫМ.

MrGumble 10.09.2018 08:25

привет всем, я предоставил полный код, который использовался в алгоритме

Honstel 10.09.2018 08:26

@SalmanLashkarara - сравнения (> и <) имеют приоритет над и и или (stat.ethz.ch/R-manual/R-devel/library/base/html/Syntax.html‌), поэтому они не должны влиять на результат. Но это могло улучшить читаемость.

MrGumble 10.09.2018 08:28

@Honstel Но вы не привели пример данных. stackoverflow.com/questions/5963269/… Кроме того, ваш код не минимален; минимальный воспроизводимый пример

jogo 10.09.2018 08:29

почему бы вам не очистить свой код?

Jimmy 10.09.2018 08:35
4
8
134
1

Ответы 1

Кажется, что что-то в вашем условии в операторе while не возвращает TRUE или FALSE, как должно. Судя по фрагменту кода, которым вы поделились, он не говорит нам, как определяется it_max или tol. Учитывая, что он работает, но возвращает что-то, что не ИСТИНА или ЛОЖЬ, я подозреваю, что один (или оба) из них являются NA или NULL. Убедитесь, что они объявлены, и это должно сработать.

Если это по-прежнему не работает, загрузите код, в котором они объявлены, и мы сможем помочь.

Другие вопросы по теме