Я пытаюсь написать программу, используя цикл 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"))}
@Rohit: &&
работает иначе, чем один &
, поскольку он возвращает только один результат, даже если вы применяете его к векторам. Часто это лучший выбор для пунктов if
.
Да и нет, одиночный &
выполняет поэлементное сравнение и, таким образом, возвращает логический вектор длины n, в то время как двойной &&
всегда возвращает единственное значение ИСТИНА / ЛОЖЬ, оценивая первый элемент слева направо. Однако ни то, ни другое не изменит представленную здесь ошибку.
Ошибка возникает из-за того, что одна из переменных в (it_count) < it_max && it_change > tol
- это NA
, поэтому любое сравнение оценивается как NA
, которое не является ни ИСТИННЫМ, ни ЛОЖНЫМ.
привет всем, я предоставил полный код, который использовался в алгоритме
@SalmanLashkarara - сравнения (>
и <
) имеют приоритет над и и или (stat.ethz.ch/R-manual/R-devel/library/base/html/Syntax.html), поэтому они не должны влиять на результат. Но это могло улучшить читаемость.
@Honstel Но вы не привели пример данных. stackoverflow.com/questions/5963269/… Кроме того, ваш код не минимален; минимальный воспроизводимый пример
почему бы вам не очистить свой код?
Кажется, что что-то в вашем условии в операторе while не возвращает TRUE или FALSE, как должно. Судя по фрагменту кода, которым вы поделились, он не говорит нам, как определяется it_max
или tol
. Учитывая, что он работает, но возвращает что-то, что не ИСТИНА или ЛОЖЬ, я подозреваю, что один (или оба) из них являются NA
или NULL
. Убедитесь, что они объявлены, и это должно сработать.
Если это по-прежнему не работает, загрузите код, в котором они объявлены, и мы сможем помочь.
Вам нужен только один символ
&
для оператора AND