11  Цикли у R

Автор

Юрій Клебан

Опубліковано

3/18/23

Цикли у програмуванні використовуються для виконання повторюваних операцій. В R є три типи циклів: for(“R for Loop,” n.d.), while(“R for Loop,” n.d.) та repeat(sabir, n.d.).

11.1 Цикл for

Цикл for у R використовується для повторюваних операцій над елементами вектора. Ми раніше уже використовували вектори для фнших прикладів:

x <- c(2, 4, 5, 7, 9, 11, 14)
x
[1]  2  4  5  7  9 11 14

Синтаксис циклу for виглядає наступним чином:

for (value in sequence) { 
  code
}

Де value - це змінна, яка буде використовуватись для доступу до елементів вектора sequence. code - це код, який буде виконуватись для кожного елемента вектора sequence.

Для прикладу, давайте знайдемо кількість непарних елементів вектора x:

# створюємо змінну count та присвоюємо їй значення 0
even_count <- 0                   
# створюємо вектор x
x <- c(2, 4, 5, 7, 9, 11, 14)     

for (i in x) {
  # якщо елемент i не парний
  if (i %% 2 != 0) {     
    # збільшуємо значення even_count на 1         
    even_count <- even_count + 1  
    # виводимо значення i та even_count
    print(paste("i: ", i, " | even_count: ", even_count)) 
  }
}
[1] "i:  5  | even_count:  1"
[1] "i:  7  | even_count:  2"
[1] "i:  9  | even_count:  3"
[1] "i:  11  | even_count:  4"
print(even_count)
[1] 4

У прикладі вище, цикл for виконався 7 разів, бо саме стльіки значень у векторі x. На кожній ітерації циклу змінні i отримує нове значення з вектора x.

Також цикл for можна використовувати для роботи з індексами елементів вектора (або іншої колекції). Розвязати попередній приклад можна також так:

# створюємо змінну count та присвоюємо їй значення 0
even_count <- 0                   
# створюємо вектор x
x <- c(2, 4, 5, 7, 9, 11, 14)     

for (i in 1:length(x)) {
  # якщо елемент **x[i]** не парний
  if (x[i] %% 2 != 0) { 
    # збільшуємо значення even_count на 1             
    even_count <- even_count + 1    
    # виводимо значення i та even_count
    print(paste("i: ", i, " | even_count: ", even_count)) 
  }
}
[1] "i:  3  | even_count:  1"
[1] "i:  4  | even_count:  2"
[1] "i:  5  | even_count:  3"
[1] "i:  6  | even_count:  4"
print(even_count)
[1] 4
Tip

Функція length() повертає довжину вектора/послідовності.

11.2 Цикл while

Цикл while виконується поки вказана умова є істинною, а синтаксис виглядає наступним чином:

while (condition) {
  code
}

де condition - це умова, яка повинна бути істинною, а code - це код, який буде виконуватись поки умова condition є істинною.

Наприклад, виведемо на консоль усі парні числа від 1 до 10:

i <- 1

while(i <= 10) {
  # збільшуємо значення i на 1 на кожній ітерації циклу
  i <- i + 1 
  # перевіряємо i на парність
  if (i %% 2 == 0) {
    print(i)
  }
}
[1] 2
[1] 4
[1] 6
[1] 8
[1] 10

Використовуючи цикл while Ви моежете виконувати

11.3 Команди break та next

Команди break та next дозволяють виконувати певні дії в циклі.

Так, break зупиняє виконання поточного циклу, а next переходить на виконання наступної ітерації циклу, на виконуючи код після неї.

Розглянемо наступний приклад: потрібно вивести на консоль усі парні числа з поданого вектора x <- c(4, 6, 7, 1, -4, 0, 6, -8), але при цьому пропускати від’ємні числа, а при знаходженні 0 зупинити виконання циклу.

x <- c(4, 6, 7, 1, -4, 0, 6, -8)

for(i in x) {
  # якщо i < 0, то переходимо на наступну ітерацію циклу
  if(i < 0) 
    next
  # якщо i == 0, то зупиняємо виконання циклу та виводимо повідомлення
  if(i == 0) {
    print("ZERO!!!")
    break
  }
  # якщо i парне, то виводимо його на консоль
  if(i %% 2 == 0) 
    print(i)
}
[1] 4
[1] 6
[1] "ZERO!!!"

11.4 Цикл repeat

Цикл repeat на відміну від for та while зупиняється лише коли виконано команду break та не має жодних умов виходу з нього. Синтаксис виглядає наступним чином:

repeat {
  code
  if(condition) {
    break
  }
}

Приклад використання циклу repeat:

i <- 1
repeat {
  print(i)
  i <- i + 1
  if(i > 10) {
    break
  }
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

У прикладі вище ми вивели на консоль усі числа від 1 до 10.

“R for Loop.” n.d. W3Schools. https://www.w3schools.com/r/r_for_loop.asp.
sabir. n.d. “R Repeat Loop.” R-Bloggers.com. https://www.r-bloggers.com/2022/07/r-repeat-loop/.