2015-01-12 3 views
0

Я ищу лучший способ для итерации в R. Я знаю, что простые решения, такие как:Лучший способ итерации с использованием для цикла

times <- 3 
for(i in 1:times){ 

} 

НО если раз < - 0, то мой цикл перебирает в два раза, не равна нулю. Таким образом, решение:

for(i in seq_len(times)) 

Так что, если я хочу итерацию от start до end:

for(i in seq_len(end - start)) 

НО если end-start < 0 то:

seq_len(-1) 
Error in seq_len(-1) : argument must be coercible to non-negative integer 

Я знаю, что я могу проверить, если end-start < 0 перед циклом, но это не очень чистое решение ... любые другие идеи?

Для уточнения - я ищу решение, аналогичное другие языки программирования, как C++/Java:

for(int i = start; i < end; i++) 

Так что если start=5 и end=3 цикл, даже не запускается.

+2

Если вы выполняете итерирование по самому объекту, вы можете использовать 'seq_along'. Это касается вашей проблемы? – cdeterman

+2

Без лишнего примера трудно сказать, что имеет смысл - что делает этот цикл? Однако вы можете сделать 'abs (end-start)' в своем 'for', который является абсолютным значением (не отрицательным) - это помогает? –

+2

Не совсем. 'seq_along' не работает, у меня есть диапазон, а не объект. Я отредактировал вопрос :) – bartektartanus

ответ

1

Просто написать собственной вспомогательной функцию

loop_seq <- function(start,end) { 
    if(end<start) return(integer(0)) 
    seq(start, end) 
} 

for(i in loop_seq(3,4)) {print(i)} 
# [1] 3 
# [1] 4 
for(i in loop_seq(3,3)) {print(i)} 
# [1] 3 
for(i in loop_seq(3,2)) {print(i)} 
# {nothing} 

для цикла всегда Переберет вектор, так что проблема на самом деле не цикл, это создает правильный вектор индексов (:, seq_len, seq_along), о котором вам нужно беспокоиться.

+1

Да, я придумал ту же идею в метро :) – bartektartanus

1

Учитывая ваш пример выше (C++/Java), вы в основном смотрите на цикл while.

Чтобы повторить вам пример:

start = 5 
end = 3 
i <- start 

while(i <= end){ 
    print(i) 
    i = i+1 
} 

Этот цикл не запустится. Обратите внимание на <=, учитывая, что R индексируется по основанию-1. Конечно, вы можете просто изменить индексы, но это чище.

+0

Я пытался избежать цикла 'while', но спасибо за ответ;) – bartektartanus

+0

@bartektartanus, понятный, но я считаю, что циклы' '' '' 'всегда будут запускаться хотя бы один раз, если вы заранее не предоставите условие. Естественно, я хотел бы, чтобы один из мастеров R здесь оказался ошибочным, если такое возможно. – cdeterman

+5

Я могу это доказать. Просто проверьте два примера: 'for (i in integer (0)) {print (i)}' ничего не печатает, но этот делает 'for (i in integer (1)) {print (i)} ' – bartektartanus

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