Недавно мы рассказали, для чего нужен и что умеет язык R. Теперь познакомимся с ним поближе и посмотрим, из чего он состоит и как на нём пишутся программы. На самом деле здесь 9 конструкций, но 10 звучит круче.
👉 Точка с запятой в R не ставится.
Комментарии
Для комментариев в R используют решётку, как и в большинстве языков:
# это комментарий
# его можно оставлять на той же строке, что и команда, а можно выносить в отдельную строку
Переменные и векторы
Чтобы объявить переменную, достаточно объявить её имя и присвоить ей что-нибудь, а R сам разберётся, какой тип тут нужен:
x <- 120 # число
y <- "Привет" # строка
z <- 1:5 # набор чисел от 1 до 5
Если говорить совсем точно, то в R существует много структур данных: векторы, матрицы, списки, факторы и так далее. Самым важным считается вектор — это набор элементов, у которых одинаковый тип данных.
Сами типы векторов такие:
- логический (logical),
- целочисленный (integer),
- вещественный (double),
- комплексный (complex),
- символьный (character),
- двоичные данные (raw).
👉 С векторами можно делать любые операции из векторной алгебры. Если что — у нас есть отличный цикл про векторы и матрицы. Матрицы в R тоже есть.
Внешние модули
Сила языка R — во внешних модулях или пакетах, которые существенно расширяют возможности базового набора команд. Они позволяют быстрее строить нейросети, вторые — анализировать данные, а третьи заточены на работу со статистикой.
Чтобы подключить внешний модуль, используют команду library():
library(pipelearner) # подключаем модуль для разбиения
данных на блоки, чтобы лучше обучать модель
Ввод и вывод
Для вывода значения переменной достаточно просто написать её имя:
x # выведет значение x
y # выведет значение y
А для вывода сообщения нужна команда print(): print("Привет, это журнал Код!").
Если нужно вывести график функции, можно использовать стандартную команду plot() — она построит график в виде точек, гистограмм или соединит всё линиями.
plot(x,y) # в x и y — наборы значений
Так как R предназначен для работы с большими объёмами данных, то ввод данных идёт не с клавиатуры, а из файлов:
src <- read.table(file = "chehov.txt", header = TRUE)
Но если нужен ввод с клавиатуры, используйте команду readline():
input <- readline(prompt = "Введите возраст: ") #
отправляем введённое число в переменную input
Присваивание и сравнение
Сравнение обозначается как обычно, двойным знаком равно:
a == 1331
А вот присваивания есть два, стрелка и знак равенства.
x = 15
y <- 15
Если не вдаваться в нюансы использования, то стрелка отвечает за глобальное использование переменной, чтобы она была видна всем, а знак равенства — за локальное использование, то есть внутри какой-то подпрограммы.
Условный оператор if
В нём никаких сюрпризов: фигурные скобки, как в JavaScript, и скобки для выражения, которое проверяем:
if(x >= 100 && x < 1000){
y = 12
print(y)
}
else {
y = 0
}
Цикл for
А вот цикл for похож уже на Python с его диапазоном для организации шага цикла. Остальное всё то же самое — фигурные скобки тоже нужны для группировки нескольких команд:
for(i in 1:100){
y<-y+y*0.05
}
Функции
Работают и объявляются точно так же, как и в других языках высокого уровня. Единственное отличие в том, что функция объявляется не сама по себе, а как бы отправляется в переменную (как стрелочная функция в JavaScript):
run.10km <- function(y){
for(i in 1:100){
y<-y+y*0.05
}
print(y)
}
run.10km(0.1)
Классы, методы и объекты
R — полностью объектно-ориентированный язык. Каждый элемент в нём — это объект, даже функции и таблицы. Поэтому всё, что работает в ООП (классы, методы и объекты), работает и в R, но на более сложном уровне абстракции.
В R можно посмотреть список всех доступных методов для любого объекта с помощью команды methods(). Например, если нам нужно понять, какие методы есть у команды plot(), которая рисует нам график, то нам нужно написать в консоли среды разработки: methods(plot)
В ответ мы получим все доступные методы:
[1] plot.acf* plot.data.frame* plot.decomposed.ts*
[4] plot.default plot.dendrogram* plot.density*
[7] plot.ecdf plot.factor* plot.formula*
[10] plot.function plot.hclust* plot.histogram*
[13] plot.HoltWinters* plot.isoreg* plot.lm*
[16] plot.medpolish* plot.mlm* plot.ppr*
[19] plot.prcomp* plot.princomp* plot.profile.nls*
[22] plot.raster* plot.spec* plot.stepfun
[25] plot.stl* plot.table* plot.ts
[28] plot.tskernel* plot.TukeyHSD*
Кстати, метод default срабатывает, когда plot() получает на обработку объект неизвестного ей класса.