Как использовать цикл For в R (с 18 примерами кода)
Цикл for — это одна из основных конструкций потока управления в языке программирования R. Итак, что это значит и как вы это используете?
В этом руководстве мы обсудим, что такое цикл for в R, какой у него синтаксис, когда его можно применять, как использовать его в разных структурах данных, как вложить несколько циклов for и как мы может регулировать выполнение цикла for.
Что такое цикл For в R?
Цикл for — одна из основных конструкций потока управления в языке программирования R. Он используется для перебора набора объектов, таких как вектор, список, матрица или кадр данных, и применения одного и того же набора операций к каждому элементу заданной структуры данных. Мы используем циклы for, чтобы сохранить наш код в чистоте и избежать ненужного повторения блока кода.
Базовый синтаксис цикла for в R следующий:
for (переменная в последовательности) { выражение }
Здесь последовательность — это набор объектов (например, вектор), по которым проходит цикл for, переменная — это элемент этого набора на каждой итерации, а выражение в теле цикла — это набор операций, вычисляемых для каждого элемента.
Из приведенного выше синтаксиса ключевые слова для
и для
являются обязательными, а также круглые скобки. Другие элементы, такие как фигурные скобки, отступ, размещение выражения и закрывающей фигурной скобки на новой строке, пробел между головой и телом цикла for, не являются обязательными, но настоятельно рекомендуются. Они рекомендуются для выделения основных частей цикла for и, следовательно, улучшения читаемости кода и облегчения отладки (при необходимости).
Цикл for останавливается после последнего элемента коллекции объектов, если только не используется оператор break
(мы рассмотрим этот оператор позже в этом руководстве).
Как использовать цикл for в R
Давайте посмотрим, как можно использовать цикл for в R для перебора различных типов коллекций объектов. В частности, рассмотрим вектор, список и матрицу.
Использование цикла For на векторе
Чтобы начать с очень простого примера, давайте напечатаем все числа от 1 до 5 включительно. Для этой цели мы возьмем соответствующий вектор, созданный с помощью :
оператор ( 1:5
) и используйте функцию print()
как выражение:
for (x in 1:5) { печать (х) }
[1] 1 [1] 2 [1] 3 [1] 4 [1] 5
В реальном случае мы можем захотеть использовать более значимое имя переменной, а не x
(например, цена
, месяц
и т. д.).
Если нам нужно напечатать каждое значение как символ, дающий дополнительный контекст, мы можем добавить функцию paste()
к выражению:
для (месяц в 1:5) { печать(вставить('Месяц:', месяц)) }
[1] "Месяц: 1" [1] «Месяц: 2» [1] «Месяц: 3» [1] «Месяц: 4» [1] «Месяц: 5»
Часто нам нужно вычислить условное выражение в теле цикла и на его основе вывести соответствующий результат:
for (месяц в масштабе 1:5) { если (месяц < 3) { print(paste('Зима, месяц', месяц)) } еще { print(paste('Весна, месяц', месяц)) } }
[1] "Зима, месяц 1" [1] «Зима, месяц 2» [1] «Весна, месяц 3» [1] «Весна, месяц 4» [1] «Весна, месяц 5»
Используя понятный и последовательный синтаксис, обращая внимание на отступы и помещая каждую часть тела цикла на новую строку, мы ясно видим, что для месяцев 1 и 2 (т.
for(month in 1:5) if(month < 3)print(paste('Зима, месяц', месяц))else print(paste('Весна , месяц', месяц))
[1] "Зима, месяц 1" [1] «Зима, месяц 2» [1] «Весна, месяц 3» [1] «Весна, месяц 4» [1] "Весна, месяц 5"
Во втором случае код выглядит гораздо сложнее для понимания. Это подтверждает, что использование правильного синтаксиса, включая необязательные элементы, важно для лучшей читабельности кода.
Мы можем сохранить результат цикла for в новом векторе, добавляя результат каждой итерации к изначально пустому вектору, как в примере ниже:
vect_1 <- c(2, 7, 4, 9, 8) vect_2 <- числовой() для (число в vect_1) { vect_2 <- c(vect_2, число * 10) } vect_2
- 20
- 70
- 40
- 90
- 80
Выше мы умножили каждый элемент числового вектора vect_1
на 10 и добавили значение каждой итерации к vect_2
.
Цикл for работает также с векторами символов:
animals <- c('koala', 'cat', 'dog', 'panda') для (животное в животных) { печать (животное) }
[1] "коала" [1] «кошка» [1] «собака» [1] "panda"
Использование цикла For в списке
Давайте попробуем применить цикл for к спискам.
Сначала создадим список со смешанными типами данных и структурами:
my_list <- list(c(5, 8, 2, 9), 'кот', 'собака', c('коала', 'панда' , 'кролик'), ИСТИНА, 3.14) мой_список
- 5
- 8
- 2
- 9
- 'кошка'
- 'собака'
-
- 'коала'
- 'панда'
- 'кролик'
Мы можем вывести значение каждого элемента в списке:
for (item in my_list) { печать (элемент) }
[1] 5 8 2 9 [1] «кошка» [1] «собака» [1] «коала» «панда» «кролик» [1] ИСТИНА [1] 3.14
Мы также можем вывести длину каждого элемента в списке:
for (элемент в my_list) { печать (длина (элемент)) }
[1] 4 [1] 1 [1] 1 [1] 3 [1] 1 [1] 1
Теперь давайте создадим новый список на основе my_list
, в котором каждый элемент исходного списка дублируется дважды:
my_list_2 <- list() для (я в 1: длина (мой_список)) { my_list_2[[i]] <- rep(my_list[[i]], 2) } мой_список_2
- 5
- 8
- 2
- 9
- 5
- 8
- 2
- 9
- 'кошка'
- 'кошка'
-
- 'собака'
- 'собака'
- 'коала'
- 'панда'
- 'кролик'
- 'коала'
- 'панда'
- 'кролик'
- ИСТИНА
- ИСТИНА
- 3,14
- 3,14
Как и в разделе о векторах, мы можем добавить оценку условия в тело цикла for выше. Создадим новый список my_list_3
, опять же на основе my_list
с каждым элементом исходного списка, реплицированного дважды, , но только для элементов длиной более 1 . В противном случае будет добавлен символ 'Слишком короткий элемент'
:
my_list_3 <- list() для (я в 1: длина (мой_список)) { если (длина (мой_список [[i]]) >1) { my_list_3[[i]] <- rep(my_list[[i]], 2) } еще { my_list_3[[i]] <- 'Слишком короткий элемент' } } мой_список_3
- 5
- 8
- 2
- 9
- 5
- 8
- 2
- 9
- 'Слишком короткий элемент'
- 'Слишком короткий элемент'
-
- "коала"
- 'панда'
- 'кролик'
- 'коала'
- 'панда'
- 'кролик'
Использование цикла For на матрице
Поскольку матрица в R представляет собой двумерную структуру данных со строками и столбцами, для цикла по матрице мы должны использовать вложенные циклы for , т. е. один цикл for внутри другого цикла for:
my_matrix <- matrix(1:9, nrow=3, ncol=3) для (строка в 1:nrow(my_matrix)) { for (столбец в 1:ncol(my_matrix)) { print(paste('Row', row, 'col', col, 'value', my_matrix[row, col])) } }
[1] "Строка 1 столбец 1 значение 1" [1] «Строка 1, столбец 2, значение 4» [1] «Строка 1, столбец 3, значение 7» [1] «Строка 2, столбец 1, значение 2» [1] «Строка 2, столбец 2, значение 5» [1] «Строка 2, столбец 3, значение 8» [1] «Строка 3, столбец 1, значение 3» [1] «Строка 3, столбец 2, значение 6» [1] "Строка 3 столбец 3 значение 9"
В приведенном выше фрагменте кода мы создали матрицу 3x3, заполнили ее целыми числами от 1 до 9 включительно и использовали 2 вложенных цикла for для перебора строк и столбцов и печати значения для каждой ячейки
С помощью вложенных циклов for мы можем изменять значения матрицы. Например, давайте обнулим все значения нашей матрицы, чтобы каждое из них было равно сумме индексов соответствующей ячейки.
dim()
, который возвращает размер матрицы:for(i in 1:dim(my_matrix)[1]) { for(j in 1:dim(my_matrix)[2]) { my_matrix[я, j] = я + j } } моя_матрица
2 | 3 | 4 |
3 | 4 | 5 |
4 | 5 | 6 |
Вложенные циклы for в R применимы не только для манипулирования матрицами. Ниже приведен простой пример создания различных комбинаций значений двух векторов и печати этих комбинаций:
качеств <- c('смешной', 'милый', 'дружелюбный') животные <- c('коала', 'кошка', 'собака', 'панда') for (x в качестве) { для (y у животных) { печать (вставить (х, у)) } }
[1] "веселая коала" [1] «забавный кот» [1] «смешная собака» [1] "веселая панда" [1] «милая коала» [1] «милый кот» [1] «милая собачка» [1] «милая панда» [1] «дружелюбная коала» [1] «дружелюбный кот» [1] «дружелюбная собака» [1] «friendly panda»
Использование цикла For на фрейме данных
Точно так же, как мы сделали с приведенной выше матрицей, мы можем перебрать фрейм данных, который также является двумерной структурой данных:
super_sleepers <- data. frame(рейтинг=1:4, животное=с('коала', 'ежик', 'ленивец', 'панда'), country=c('Австралия', 'Италия', 'Перу', 'Китай'), avg_sleep_hours=c(21, 18, 17, 10)) print(super_sleepers)
рейтинг животных страны avg_sleep_hours 1 1 коала Австралия 21 2 2 ёжик Италия 18 3 3 ленивец Перу 17 4 4 панда Китай 10
для (строка в 1:nrow(super_sleepers)) { for (столбец в 1:ncol(super_sleepers)) { print(paste('Row', row, 'col', col, 'value', super_sleepers[row, col])) } }
[1] "Строка 1 столбец 1 значение 1" [1] «Строка 1, столбец 2, значение коала» [1] «Строка 1, столбец 3, значение Австралия» [1] «Строка 1, столбец 4, значение 21» [1] «Строка 2, столбец 1, значение 2» [1] «Строка 2, столбец 2, значение ежа» [1] «Строка 2, столбец 3, значение Италия» [1] «Строка 2, столбец 4, значение 18» [1] «Строка 3, столбец 1, значение 3» [1] «Строка 3, столбец 2, значение лени» [1] «Строка 3, столбец 3, значение Перу» [1] «Строка 3, столбец 4, значение 17» [1] «Строка 4, столбец 1, значение 4» [1] «Строка 4, столбец 2, значение panda» [1] «Строка 4, столбец 3, значение Китай» [1] «Строка 4, столбец 4, значение 10»
Использование оператора
break
в цикле For Оператор break
используется внутри логического условия в цикле for для выхода из цикла до того, как он пройдет через все элементы. В случае вложенных циклов этот оператор приводит к прерыванию только самого внутреннего цикла.
Давайте повторим наш вектор символов животных из предыдущего примера и остановим цикл for, как только он встретит элемент, содержащий менее 4 символов:
животных <- c('коала', 'кошка', 'собака', 'панда') для (животное в животных) { если (nchar(животное) < 4) { перерыв } печать (животное) }
[1] "koala"
Мы видим, что хотя где-то после "koala" у нас есть еще один элемент, по крайней мере, с 4 символами ("panda") в нашем векторе animals
, цикл for не достиг этого значение и остановил выполнение при первом появлении элемента с менее чем 4 символами ("кошка").
Использование
Следующая инструкция
внутри цикла For В отличие от инструкции break
, эта инструкция используется для пропуска итерации на основе определенных предопределенных условий, а не для выхода из всего цикла.
Чтобы понять, как работает это выражение, давайте запустим тот же фрагмент кода, что и выше, заменив break
на next
:
animals <- c('koala', 'cat', 'dog', 'panda') для (животное в животных) { если (nchar(животное) < 4) { следующий } печать (животное) }
[1] "коала" [1] "панда"
На этот раз оба элемента, содержащие менее 4 символов ("кошка" и "собака"), были отброшены, а два других ("коала" и "панда") были напечатаны.
Заключение
В этом уроке мы рассмотрели использование циклов for в R. Теперь мы знаем следующее:
- Как определить цикл for в R
- Синтаксис цикла for и какие синтаксические элементы являются обязательными
- Назначение цикла for в R
- Как использовать цикл for для векторов, списков и матриц
- Как и зачем вкладывать несколько циклов for
- Какие операторы помогают регулировать поведение цикла for и как их использовать
Для цикла - MATLAB и Simulink
Открытый сценарий
В этом примере показано, как реализовать конструкцию цикла для
при помощи блоков Simulink®, Stateflow® Charts и блоков MATLAB® Function.
C Конструкция
у1 = 0; for(inx = 0; inx <10; inx++) { y1 = u1[inx] + y1; }
Шаблон моделирования для цикла For: блок For-Iterator Subsystem
Одним из способов создания цикла for
является использование блока For Iterator Subsystem из библиотеки Simulink > Ports & Subsystems .
1. Откройте пример модели ex_for_loop_SL
.
Модель содержит блок For Iterator Subsystem, который повторяет выполнение содержимого подсистемы в течение временного шага симуляции.
В модели соблюдать следующие настройки:
Откройте блок For Iterator. В диалоговом окне Block Parameters параметр Index-mode равен
Zero-based
, а параметр Iteration limit равен 10.Откройте блок Unit Delay. В диалоговом окне «Параметры блока» параметр Initial Conditions равен 0. Этот параметр инициализирует состояние до нуля.
2. Чтобы построить модель и сгенерировать код, нажмите Ctrl+B .
Код, реализующий цикл for
, находится в функции ex_for_loop_SL_step
в ex_for_loop_SL.c
:
/* Внешние входы (сигналы корневого входа с хранилищем по умолчанию) */ Внешние входы U; /* Внешние выходы (корневые выходные порты, питаемые сигналами с хранилищем по умолчанию) */ Внешние выходы Y; /* Пошаговая функция модели */ недействительным ex_for_loop_SL_step (недействительным) { int32_T rtb_y1; int32_T s1_iter; /* Выходные данные для подсистемы итератора: '/For Iterator Subsystem' включает: * Для итератора: ' /Для итератора' */ для (s1_iter = 0; s1_iter < 10; s1_iter++) { /* Сумма: ' /Добавить' включает: * Ввод: '<Корень>/u1' * MultiPortSwitch: ' /Индексный вектор' * UnitDelay: ' /Unit Delay' */ rtb_y1 = U. u1[s1_iter] + DWork.UnitDelay_DSTATE; /* Обновление для UnitDelay: ' /Unit Delay' */ DWork.UnitDelay_DSTATE = rtb_y1; } /* Конец выходных данных для подсистемы: ' /For Iterator Subsystem' */ /* Вывод: ' /y1' */ Y.y1 = rtb_y1; }
Шаблон моделирования для цикла For: диаграмма Stateflow
1. Откройте пример модели ex_for_loop_SF
.
Диаграмма содержит шаблон решения цикла For
, который вы добавляете, щелкнув правой кнопкой мыши внутри графика > Добавить шаблон в график > Loop > For .
2. Чтобы построить модель и сгенерировать код, нажмите Ctrl+B .
Код, реализующий цикл for
, находится в ex_for_loop_SF_step
функция в ex_for_loop_SF.c
:
/* Внешние входы (сигналы корневого входа с хранилищем по умолчанию) */ Внешние входы U; /* Внешние выходы (корневые выходные порты, питаемые сигналами с хранилищем по умолчанию) */ Внешние выходы Y; /* Пошаговая функция модели */ недействительным ex_for_loop_SF_step (недействительным) { int32_T inx; /* Диаграмма: '/Диаграмма' */ для (inx = 0; inx < 10; inx++) { /* Выход: ' /y1' включает: * Ввод: '<Корень>/u1' */ Y. y1 += U.u1[inx]; } /* Конец диаграммы: ' /Chart' */ }
Шаблон моделирования для цикла For: блок MATLAB Function
1. Откройте пример модели ex_for_loop_ML
.
Функциональный блок MATLAB содержит эту функцию:
функция y1 = fcn(u1) у1 = 0; для инкс=1:10 y1 = u1(inx) + y1 ; конец
2. Чтобы построить модель и сгенерировать код, нажмите Ctrl+B .
Код, реализующий цикл for
, находится в функции ex_for_loop_ML_step
в ex_for_loop_ML.c
:
/* Экспортированные блочные сигналы */ реальный_T u1[10]; /* '<Корень>/u1' */ реальный_T y1; /* '/функция MATLAB' */ /* Пошаговая функция модели */ недействительным ex_for_loop_ML_step (недействительным) { int32_T inx; /* Функция MATLAB: ' /MATLAB Function' включает в себя: * Ввод: '<Корень>/u1' */ у1 = 0,0; для (inx = 0; inx < 10; inx++) { y1 += u1[inx]; } /* Конец функции MATLAB: ' /MATLAB Function' */ }