2016-10-30 4 views
1

В R, я хочу, чтобы мой цикл while продолжался до тех пор, пока каждый элемент в определенном векторе «theta_diff» (который обновляется в цикле while на каждой итерации) уменьшается ниже определенного порога «эпсилон». В настоящее время я могу добиться этого, используя условие OR в то время как тест цикла условие (theta_diff представляет собой 2-элементный вектор):R: Запустите цикл while, пока все элементы вектора не будут меньше порогового значения

while((theta_diff[1]>epsilon)|(theta_diff[2]>epsilon)) 
{ 
    } 

Я интересно, если есть более разумный способ сделать это? Я попробовал all(), но он реализует логику AND вместо логики OR, поэтому, даже если один из элементов theta_diff соответствует критериям, цикл while останавливается.

while(all(theta_diff>epsilon)) 
{ 
    } 

Основное вдохновение для поиска умнее вариант заключается в следующем: в зависимости от программы, размерность вектора theta_diff может измениться, и я хочу сделать то время как условие цикла не зависит от длины вектора theta_diff.

ответ

1

я мог придумать два варианта (по крайней мере, один элемент theta_diff больше, чем epsilon):

  • any(theta_diff > epsilon)
  • max(theta_diff) > epsilon

Аналогично, следующие два эквивалентны (все элементы theta_diff больше epsilon):

  • all(theta_diff > epsilon)
  • min(theta_diff) > epsilon

Иногда использование repeat более читаемым, чем при использовании while. Почему не считают:

repeat { 
    ## blablabla 
    if (all(theta_diff > epsilon)) break 
    } 

что означает сделать ... пока ....