Основы программирования: условные операторы
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()... [Read More]
статью подготовил кандидат социологических наук Сергей Дембицкий
Data science (3)
Europe (2)
Geopolitics (2)
Infographics (1)
R (26)
Russia (2)
SPSS (2)
Ukraine (2)
Акционализм (1)
Анализ данных (27)
Аномия (1)
Выборка (1)
Выступления (3)
Геополитика (12)
Гражданское общество (2)
Демократизация (1)
Европа (4)
Интернет ресурсы (1)
Инфографика (8)
Исследовательские дизайны (1)
Историческая социология (10)
История социологии (5)
Киберспорт (1)
Книги (7)
Массивы (3)
Методология социальных исследований (1)
Методология социологических исследований (2)
Научная жизнь (3)
Новости (6)
Обратная связь (1)
Персоналии (3)
Православные конфессии в Украине (1)
Президентская власть (1)
Психологический дистресс (18)
Психология (5)
Публицистика (2)
Революция (1)
Результаты исследований (28)
Религия (3)
Россия (2)
Согласование концептов (4)
Социальная гетерогенность (1)
Социальная работа (1)
Социологическая теория (6)
Социологические тесты (1)
Социологическое образование (5)
Теория конфликта (2)
Теория социального измерения (8)
Украина (9)
Учебные планы (2)
Философия (1)
Шкалирование (36)
Экономика (1)
Эмпирическая социология (46)
Europe (2)
Geopolitics (2)
Infographics (1)
R (26)
Russia (2)
SPSS (2)
Ukraine (2)
Акционализм (1)
Анализ данных (27)
Аномия (1)
Выборка (1)
Выступления (3)
Геополитика (12)
Гражданское общество (2)
Демократизация (1)
Европа (4)
Интернет ресурсы (1)
Инфографика (8)
Исследовательские дизайны (1)
Историческая социология (10)
История социологии (5)
Киберспорт (1)
Книги (7)
Массивы (3)
Методология социальных исследований (1)
Методология социологических исследований (2)
Научная жизнь (3)
Новости (6)
Обратная связь (1)
Персоналии (3)
Православные конфессии в Украине (1)
Президентская власть (1)
Психологический дистресс (18)
Психология (5)
Публицистика (2)
Революция (1)
Результаты исследований (28)
Религия (3)
Россия (2)
Согласование концептов (4)
Социальная гетерогенность (1)
Социальная работа (1)
Социологическая теория (6)
Социологические тесты (1)
Социологическое образование (5)
Теория конфликта (2)
Теория социального измерения (8)
Украина (9)
Учебные планы (2)
Философия (1)
Шкалирование (36)
Экономика (1)
Эмпирическая социология (46)
January 2021
September 2020
March 2019
September 2018
August 2018
April 2018
March 2018
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013
October 2013
September 2013
December 2020
November 2020
October 2020September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
December 2019
November 2019
October 2019September 2019
August 2019
July 2019
June 2019May 2019
April 2019March 2019
February 2019
January 2019
December 2018
November 2018
October 2018September 2018
August 2018
July 2018
June 2018
May 2018April 2018
March 2018
February 2018
January 2018December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
December 2014November 2014
October 2014
September 2014August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013
October 2013
September 2013