Недавно мы рассказали, для чего нужен и что умеет язык 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() получает на обработку объект неизвестного ей класса.
						