Программирование на R: учебник для начинающих

Программирование на R Изучение

Язык программирования R — это популярный язык программирования статистики, который в основном используется в естественных науках и математике для статистических вычислений. R — интересный язык с ярко выраженными особенностями. Как только вы привыкнете к этому, работать с языком будет очень весело.

Что отличает «Язык программирования R»?

R не является языком программирования «общего назначения», как Java или Python. Скорее, язык обслуживает особую область применения статистических вычислений, по-немецки «статистические вычисления». В этой области R уже много лет занимает место среди 20 самых популярных языков программирования, несмотря на сильную конкуренцию.

Что делает R особенным, так это не только сам язык, но и весь пакет. Например, программирование на R обычно происходит в интерактивной среде, дополненной циклом чтения-оценки-печати (REPL) и встроенной справкой. Язык с открытым исходным кодом поддерживается хорошо развитой экосистемой; сообщество поддерживает репозиторий пакетов The Comprehensive R Archive Network (CRAN). Также постоянно добавляются наборы данных и научные официальные документы о новых подходах и пакетах.

В совокупности эти свойства делают R идеальной средой программирования для статистики и обработки данных. Интерактивный характер среды, в частности, побуждает вас проводить исследования и позволяет изучать язык и базовую математику в игровой форме.

R — язык программирования статистики и данных

R — это язык программирования статистики, и он знает такие понятия, как нормальное распределение, статистические тесты, модели и регрессия. Помимо R существует ряд сопоставимых научных языков — помимо коммерческого продукта Matlab, особо стоит упомянуть младший язык Julia. Еще одним сильным конкурентом последних лет является Python.

В отличие от Python, R имеет встроенную поддержку статистического программирования. Существенная разница заключается в том, как язык работает со значениями. Данные обычно во множественном числе, поэтому в R принято вычислять с несколькими значениями сразу. В то время как почти во всех других языках самым простым значением является одно число, в R это особый случай.

Давайте проиллюстрируем подход R к обработке данных на простом примере. Математические операции можно выполнять на любом языке программирования. Это также имеет место в Р. Складываем два числа:

# returns 15
10 + 5

Пока ничего необычного. Однако в R та же операция сложения может быть применена к списку чисел. Мы объединяем два числа в список и добавляем постоянное значение:

# returns 15, 25
c(10, 20) + 5

Удивительный результат для опытных программистов. Даже современный динамический язык, такой как Python, не позволяет этого:

# throws an error
[10, 20] + 5

В R вы даже можете добавить два списка. Элементы списка не объединяются в список, но для каждого элемента выполняется соответствующая математическая операция :

# returns 42, 69
c(40, 60) + c(2, 9)

В более старых языках, таких как Java или C++, вам нужен цикл для обработки нескольких элементов списка. Потому что эти языки проводят строгое различие между отдельными значениями, скалярами, и составными структурами данных, векторами. В R вектор является основной единицей ; скаляр — это особый случай в программировании на R как одноэлементный вектор.

Что особенного в статистике, так это то, что знаменитая математическая точность была смягчена. Расчет ведется с неопределенностью и несовершенными данными, полученными из реальности. Что-то всегда может пойти не так; к счастью, R несколько отказоустойчив. Язык может обрабатывать отсутствующие значения без сбоя работающего скрипта.

Читайте также:  "Основы и Установка MySQL Первые Шаги для Начинающих"

Давайте проиллюстрируем надежность языка на примере. Обычно в любом языке программирования сбой может быть вызван делением числа на ноль. Однако R оставляет это без внимания; значение Inf отмечается как результат деления на ноль, который можно легко отфильтровать из данных на более позднем этапе очистки:

# list of divisors, containing zero
divisors = c(2, 4, 0, 10)
# returns `c(50, 25, Inf, 10)`
quotients = 100 / divisors
# filter out Inf; returns `c(50, 25, 10)`
cleaned_quotients = quotients[quotients != Inf]

R поддерживает ООП и функциональное программирование.

Программирование с помощью R чрезвычайно гибкое; язык не может быть четко классифицирован в иерархии ((парадигмы программирования|веб-сайты/веб-разработка/парадигмы программирования/)). Он поддерживается системой ООП, но вы не найдете обычных определений классов. Функциональный и императивный подходы в основном используются в повседневном использовании. Особенно ярко выражены функциональные особенности, которые хорошо подходят для обработки данных.

Подобно JavaScript, объектная система отличается своей гибкостью. Подобно Python, это общие функции, которые можно применять к объектам разных типов. Например, в программировании на R есть функция length(), аналогичная len() в Python.

Как работает программирование на R?

Программирование на R основано на данных, потому что на них основана статистика. Чтобы разработать решение проблемы в R, вам нужен набор данных. К сожалению, этого часто не существует на момент разработки. Поэтому вы часто начинаете проект программирования R с моделирования данных. Мы пишем код, тестируем функциональность и позже обмениваем тестовые данные на реальные данные.

Как выполняется R-код?

Подобно Ruby или Python, R — это динамический интерпретируемый язык сценариев. В отличие от языка программирования C, в R нет разделения исходного текста и исполняемого кода. Разработка в основном происходит интерактивно, т.е. ЧАС. вы передаете интерпретатору построчно исходный код, который немедленно выполняется. Переменные генерируются автоматически по мере необходимости, а имена привязываются во время выполнения.

Эффект от этого интерактивного и динамичного программирования сравним с нахождением внутри работающей программы. Уже созданные объекты можно исследовать и модифицировать, а новые идеи сразу же тестировать. Команда help дает доступ к синтаксису и документации по функциям:

# view help for `for` syntax
help('for')
# view help for `c()` function
help(c)

Файлы сценариев могут быть динамически загружены из интерпретатора. Исходная команда работает как эквивалентная команда оболочки. При вызове содержимое исходного текстового файла R считывается и передается в текущий сеанс:

source('path/to/file.r')

Каков синтаксис языка программирования R?

Язык сценариев использует фигурные скобки, известные из C и Java, для разделения тел функций и операторов управления. В отличие от Python, код с отступом не влияет на его функцию. Как и в Ruby и Python, комментарии начинаются с решётки, точка с запятой в конце оператора не нужна.

Читайте также:  "Всеобъемлющее руководство по HTML тегам от основ до примеров и полезных советов"

Имея небольшой опыт, вы сможете сразу распознать R-код, потому что язык имеет некоторые особенности. Помимо знака равенства в качестве оператора присваивания, в программировании на R для присваивания используются два стреловидных оператора. Чтобы изменить направление задания:

# equivalent assignments
age <- 42
'Jack' -> name
person = c(age, name)

Другая типичная особенность кода R — своего рода нотация псевдообъекта, аналогичная object.method() :

# test if argument is a number
is.numeric(42)

Функция is.numeric отображается как метод numeric(), принадлежащий объекту с именем is. Однако, это не так. В программировании на R точка является обычным символом ; функция также может называться is_numeric вместо is.numeric.

Функция конкатенации c() используется для генерации векторов, повсеместно используемых в программировании на R :

people.ages &lt;- c(42, 51, 69)

Если вы применяете функцию к векторам, они объединяются в непрерывный вектор :

# yields `c(1, 2, 3, 4)`
c(c(1, 2), c(3, 4))

В отличие от большинства языков программирования, в R индексация элементов вектора начинается с 1. Поначалу к этому нужно привыкнуть, но это помогает избежать ужасных ошибок, возникающих при переходе на один. Самый высокий индекс вектора соответствует длине вектора:

# create a vector of names
people <- c('Jack', 'Jim', 'John')
# access the first name
people[1] == 'Jack'
# access the last name
people[length(people)] == 'John'

Подобно Python, в программировании на R также используется концепция нарезки. Срез можно использовать для индексации части вектора. Это основано на последовательностях, изначально поддерживаемых в R. Генерируем последовательность чисел и выбираем часть:

# create vector of numbers between 42 and 69
nums = seq(42, 69)
# equivalent assignment using sequence notation
nums = 42:69
# using a sequence, slice elements 3 through 7
sliced = nums[3:7]

Как управляющие структуры работают в программировании на R?

Основные операции в программировании на R определены для векторов. Часто циклы не требуются, а выполняется операция непосредственно над всем вектором, в результате чего изменяются отдельные элементы. Возводим в квадрат первые десять положительных чисел без цикла:

nums <- seq(10)
squares <- nums ** 2
squares[3] == 9

При использовании R For-Loop следует отметить, что он работает не так, как в C, Java или JavaScript. Не проходя через переменную цикла, выполняется итерация непосредственно по элементам, как в Python:

people = c('Jim', 'Jack', 'John')
for (person in people) {
  print(paste('Here comes', person, sep = ' '))
}

Конечно, в R есть ветвь if-else в качестве базовой управляющей структуры. Однако во многих случаях это также можно заменить функциями фильтрации или логической индексацией векторов. Мы создаем вектор возрастов и фильтруем лиц старше и младше 18 лет в двух переменных соответственно, без необходимости цикла или ветвления:

# create 20 ages between 1 and 99
ages = as.integer(runif(20, 1, 99))
# filter adults
adults = ages[ages > 18]
# filter children
children = ages[ages < 18]
# make sure everyone is accounted for
length(adults) + length(children) == length(ages)

Для полноты эквивалентный подход с управляющими структурами :

# create 20 ages between 1 and 99
ages = as.integer(runif(20, 1, 99))
# start with empty vectors
adults = c()
children = c()
# populate vectors
for (age in ages) {
  if (age > 18) {
    adults = c(adults, age)
  }
  else {
    children = c(children, age)
  }
}

Что нужно для начала программирования на R?

Чтобы начать программирование на R, вам нужна только локальная установка R. Установщики для всех основных операционных систем доступны для скачивания. Стандартная установка R включает в себя интерпретатор GUI с REPL, встроенную справку и редактор. Для продуктивного кодирования следует использовать один из установленных редакторов кода. R -Studio — привлекательная альтернатива среде R.

Читайте также:  "Полное руководство по созданию эффективных моделей данных в C и MongoDB"

Для каких проектов подходит R?

Программирование R особенно часто используется в науке и исследованиях, например, в биоинформатике и машинном обучении. Однако язык подходит для всех проектов, использующих статистическое моделирование или математические модели. R слаб только для чистой обработки текста; У Python здесь явное преимущество.

Обычные расчеты и визуализации в электронных таблицах можно заменить R-кодом. Вы получаете выгоду от четкого разделения задач, поскольку данные и код не смешиваются в ячейках. Это позволяет написать код один раз и применить его к нескольким наборам данных. Кроме того, отсутствует риск перезаписи формулы ячейки при внесении изменений вручную.

Для научных публикаций R считается золотым стандартом. Разделение кода и данных обеспечивает научную воспроизводимость. Зрелая экосистема инструментов и пакетов позволяет создавать эффективные конвейеры публикаций. Оценки и визуализации автоматически генерируются из кода и данных и интегрируются в высококачественные документы LaTeX или RMarkdown.

Оцените статью
Блог о программировании
Добавить комментарий