Основы программирования: условные операторы
13/12/13 23:47 Относится к категории: Анализ данных | R

Условные операторы if
В R условные операторы типа if делятся на два вида - if-else и ifelse. Хотя последний из них скорее является сокращенным вариантом первого. Оператор if-else может принимать множество форм, которые, вместе с тем можно свести к трем основным:
В R условные операторы типа if делятся на два вида - if-else и ifelse. Хотя последний из них скорее является сокращенным вариантом первого. Оператор if-else может принимать множество форм, которые, вместе с тем можно свести к трем основным:
1 2 3 4 5 6 7 8 9 10 11 | (a) if (cond) statement
(b) if (cond) statement1 else statement2
(c) if (cond1) {
statement1
} else if (cond2) {
statement2
} else {
statement2
}
|
Первую форму можно представить следующим образом: если есть условие (cond), наступает следствие (statement). Во второй форме имеем: если есть условие (cond), то наступает следствие 1 (statement1); во всех других случаях наступает следствие 2 (statement2). Для третей формы: если есть условие 1 (cond1), то наступает следствие 1 (statement1); если же есть условие 2 (cond2), то наступает следствие 2 (statement2); во всех других случаях наступает следствие 3 (statement3). Конечно же конкретных условий до else может быть максимум не две, а столько, сколько необходимо исследователю. Важно помнить, что в рамках одного запуска условного оператора может быть реализован только один из вариантов.
Рассмотрим простые примеры:
Рассмотрим простые примеры:
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | > words <- c("Питер","Гарри","Иван")
> for_chek <- sample(words,1)
> print(for_chek)
[1] "Гарри"
> if (for_chek == "Питер") cat(words[1], "Пенн")
> if (for_chek == "Питер") cat(words[1], "Пенн") else
print("Не Питер Пенн...")
[1] "Не Питер Пенн..."
> if (for_chek == "Питер") {
cat(words[1], "Пенн")
} else if(for_chek == "Гарри") {
cat(words[2], "Поттер")
} else {
cat(words[3], "Дурак")
}
Гарри Поттер
|
Сначала мы создаем вектор с тремя именами. Далее случайным образом выбираем одно из них, записываем в скаляр for_chek и выводим его на экран с помощью функции print(). Это "Гарри". После этого идут три цикла. Первый (строка 16 синтаксиса) с помощью функции cat() выводит словосочетание "Питер Пенн" (более подробно о функции cat() смотри в завершении главы) в том случае, если for_chek равно "Питер". А поскольку for_chek равно "Гарри", то ничего не происходит. Второй цикл (строки 17 и 18 синтаксиса) выводит то же самое словосочетание для того же случая, во всех остальных выводит фразу - "Не Питер Пенн...". Последнее собственно и произошло. Наконец, третий цикл (строки 20-26 синтаксиса) выводит свое собственное словосочетание для каждого из имен. Здесь можно запустить этот код онлайн.
Что касается условного оператора в виде ifelse, то он представляет собой функцию, действие которой схоже с использованием условного оператора if-else формы (b). То есть в данном случае есть следствие для одного условия, а также еще одно следствие для всех остальных случаев. Общий вид функции следующий: ifelse(cond, statement1, statement2). Следовательно, первый агргумент - это условие для запуска первого следствия, второй - само это следствие, третий - следствие для всех остальных случаев.
Что касается условного оператора в виде ifelse, то он представляет собой функцию, действие которой схоже с использованием условного оператора if-else формы (b). То есть в данном случае есть следствие для одного условия, а также еще одно следствие для всех остальных случаев. Общий вид функции следующий: ifelse(cond, statement1, statement2). Следовательно, первый агргумент - это условие для запуска первого следствия, второй - само это следствие, третий - следствие для всех остальных случаев.
Рассмотрим пример:
28 29 30 31 | > ifelse(for_chek == "Питер",
"Да это же Питер Пенн!!!",
"Питера Пенна не существует!")
[1] "Питера Пенна не существует!"
|
На экран выводится "Питера Пенна не существует!", так как предварительно в for_chek было записано слово "Гарри", а не "Питер".
Теперь рассмотрим более содержательный пример. Далее показана часть синтаксис для подготовки данных к регрессионному анализу:
Теперь рассмотрим более содержательный пример. Далее показана часть синтаксис для подготовки данных к регрессионному анализу:
32 33 34 35 36 37 | > for (j in (1:29)) {
> if (mean(test[,j])!=-999) {
> testNew <- cbind(testNew,test[,j])
> names(testNew)[length(testNew)] <- nameS[j]
> }
> }
|
Суть этого синтаксиса заключается в том, чтобы каждую из 29 переменных в массиве, среднее значение которой не равно -999 (если среднее равно -999, это значит, что все ее значения пропущенны) записать в массив testNew. При этом, если переменная записывается, необходимо дать ей приемлемое имя, так как предварительно в процессе записи оно искажается.
Условные операторы switch
Базовый синтаксис для условных операторов этого вида выглядит так: switch(expr, ...). Здесь expr предполагает выражение, относительно которого будет выбрана одна из реализаций кода. Все возможные выражения и соответствующие реализации кода обозначены троеточием.
Рассмотрим простой пример:
Условные операторы switch
Базовый синтаксис для условных операторов этого вида выглядит так: switch(expr, ...). Здесь expr предполагает выражение, относительно которого будет выбрана одна из реализаций кода. Все возможные выражения и соответствующие реализации кода обозначены троеточием.
Рассмотрим простой пример:
38 39 40 41 42 43 44 45 46 | > words <- c("Питер","Иван")
> for (i in words)
> print(switch
> (i,
> Питер = "Питер Пенн",
> Гарри = "Гарри Поттер",
> Иван = "Иван Дурак"))
[1] "Питер Пенн"
[1] "Иван Дурак"
|
Здесь условный оператор (строки 40-44 синтаксиса) является аргументом функции print(). Использования одних функций (или других программных конструкций) в качестве аргументов других является распространенной практикой. Как видно, в зависимости от того, чем является выражение i, будет выведен один из трех вариатов (или не будет выведено ни одного, если i не равно "Питер", "Гарри" или "Иван"). Поскольку функция print() и условный оператор switch являются частью цикла for, синтаксис будет запущен для каждого элемента вектора words. При каждой итерации цикла вместо i последовательно будет подставлен каждый элемент упомянутого вектора, что приведет к реализации соответствующих вариантов функции print(). Онлайн вариант кода можно запустить здесь.
Подробнее о функции cat(). Функция cat() в качестве аргументов принимает как числовые, так и текстовые значения (в рамках одной функции можно использовать и первые, и вторые одновременно). Результатом функции является выведение в командной строке соответствующих аргументов в виде текста, в котором эти элементы (или аргументы) разделяются пробелом. В примере к этой главе в качестве одного из аргуметов выступает выражение words[1], которое равносильно первому элементу в векторе words (а это "Питер").
статью подготовил кандидат социологических наук Сергей Дембицкий
Вверх
blog comments powered by Disqus