Введение в аналитику больших массивов данных

Синтаксис

Показывать лекцию целиком

 

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

Для начала разберем векторы. Числовые векторы образуются с помощью функции combine, но мы можем записывать числа с плавающей точкой, можем без точки, можем получать числа как результаты функции. Но если мы пишем 0x, то это запись для шестнадцатеричных чисел. По умолчанию числовые векторы становятся типом double. Даже если мы запишем от единички — typeof(1). Единичка — это вектор, который состоит из одного элемента: из числа 1. Он пишется double. Для того, чтобы образовать тип integer, используется запись через двоеточие. A:b, где мы натуральные числа записываем через двоеточие. Typeof(1:1) — это уже integer. Также мы можем записывать комплексные числа. Они пишутся в нотации действительная плюс мнимая часть, и дальше i. Даже если нам требуется только одну мнимую часть записать, нам все равно приходится в действительной писать 0.

Предельная точность для чисел в R это 2 в степени 1023 (определено размеров 1024). То есть, если мы возьмем минус единицу (1023-1), это будет то же самое число. Плюс-минус 1 — вот на этой точности у нас все заканчивается. Есть буквенные векторы – они состоят из элементов типа character. И каждое слово обозначено в двойных или в одинарных кавычках. Здесь нет значения. Если кавычки внешние, то как бы мы ни писали — одно или два, это будет одно и то же слово. Однако одинарные и двойные кавычки отличаются, если приведены одна в другой. Вот, например, здесь слово «однако» - видно, что оно записано в одинарных кавычках. Также мы можем приводить эти символы — двойные и одинарные кавычки — внутри кавычек. Для этого используется бэкслеш (/).

Символы языка. Как мы уже знаем, символы являются объектами. Символы обязательно начинаются с буквы, могут содержать точки, другие буквы, почерк, числа. Очень важно понимать: если мы привыкли в объектно-ориентированных языках, что точка — это доступ к методам или свойствам объектов, то здесь точка — это элемент имени, элемент наименования. Мы можем также использовать другие символы, если заключаем имя символа в обратные кавычки. Например, для функции присвоения: если мы напишем ее в обратных кавычках, мы получим доступ к телу функции. Также мы можем ввести новый символ в язык: 2+2=5, и сказать, что этому символу мы на время исполнения этой программы присваиваем TRUE. И, действительно, смотрим значение этого символа — это объект TRUE. Можем переопределить TRUE/FALSE и так далее. Но мы определяем новые символы, которые в этих обратных кавычках. Есть символы, которые не могут быть переопределены — они перечислены здесь. Это все операторы, контрольные конструкции, символ TRUE/FALSE и так далее. Но здесь заметьте разницу: имеется в виду TRUE без обратных кавычек.

Следующей важной конструкцией являются операторы. Операторы — это унарные, бинарные или тернарные функции. У операторов особая запись. Для унарного оператора мы сначала записываем оператор, потом аргумент. У бинарного: один аргумент, бинарный оператор, второй аргумент. Можно также определить в языке свой оператор. Для этого нужно его имя заключить в проценты. Например, оператор минус — это унарный оператор. Мы минус применили к вектору, и видим, что минус для логических значений отсутствует. Есть для натуральных значений, поэтому здесь произошло приведение типов TRUE к единице, FALSE к нулю и, соответственно, -1. Здесь в векторе С приведены примеры операторов, уже заведенных в системе: плюс, умножить, остаток от деления, возведение в степень и деление на целые. Например, определяем новый оператор: + + с помощью такой функции. Стоит отметить также, что выполнение функции — это тоже оператор. То есть в этом операторе у нас есть первый аргумент (это имя функции) и второй аргумент — то, что передается как аргумент внутрь функции. Все операции исполняются в определенном порядке, приоритет этих операций можно посмотреть с помощью специальной функции ?base::Syntax.

В общем виде можно сказать, что сначала происходит вызов функции, группировка выражений, затем индексы и обращения к массивам, затем арифметические операции, операции сравнения, формулы, присвоения и помощь. Давайте отдельно остановимся на присвоении: каким образом оно происходит. Присвоение — это приписывание символу объекта. Присвоить можно тремя видами операторов: стрелочка в одну сторону, стрелочка в другую сторону и равенство. Равенство эквивалентно стрелочке влево. Есть также присвоение с модификацией. Можно переопределять присвоение. Но давайте посмотрим на примеры. В первом случае мы используем стрелочку влево, чтобы присвоить константу «учиться» символу x. Символу y мы присвоим вправо. Символу z опять равенство — это как присвоение влево. Дальше мы можем присваивать элементу векторы и изменять какие-то отдельные элементы векторов, матрицы и списков. Можем присваивать через функцию: есть такая очень удобная конструкция, когда мы хотим изменить длину элемента s, мы присваиваем длине s новое значение. Каким это образом происходит, как это действует? Мы можем определить функцию f как x-1 и определить новую операцию присвоения через функцию f. Для этого мы берем функцию: один аргумент (как и была функция с одним аргументом) и второй аргумент — это значение, которое будет присваиваться. Например, f от функции длины s. Мы ему присваиваем тройку. В первом случае s у нас, как помните, длиной было шесть. Функция f от шестерки отнимает единицу, получается 5. Но если мы используем функцию f уже с присвоением и присваиваем тройку, то что происходит? Значит, у нас была длина 6, от шестерки отнимаем тройку и присваиваем это length(s). То есть мы придем эквивалентно тому, если бы мы length(s)присвоили тройку. И действительно, мы видим, что у нас длина этого вектора уменьшилась до трех.

Следующим элементом языка является группировка выражений. Одно от другого выражения могут отделяться переводом строки, могут отделяться точкой с запятой, могут быть записаны в круглых, фигурных скобках. Вот примеры: соответственно, мы переводом строки записываем разные выражения через точку запятой в одной строке, в круглых скобках, и про фигурные мы уже говорили, что возвращается последнее значение. Если мы здесь перечислили x, y и z, запустили это выражение, то выведется у нас только последнее z. Если бы мы убрали здесь фигурные скобки, то у нас вывелись бы все: 1, 2 и 3.

Теперь рассмотрим условные операторы. Как мы уже знаем, условный оператор — это функция. Нужно понимать, что первый аргумент в этой функции (проверка условия) – это не векторная операция. Практически везде в языке используются векторные операции, но вот условия здесь не вектор. Причем язык об этом будет предупреждать. Если вы попытаетесь использовать векторный вид, например, вектор от 1 до 50 больше двух. Вот оператор «больше» здесь означает, что мы будем весь вектор сравнивать: единичка больше двух – нет, значит, FALSE. Двойка больше двух – нет, значит, FALSE. Тройка больше — TRUE, и так далее. Получается, здесь будет вектор из FALSE, FALSE, TRUE, TRUE, TRUE и так далее. Но здесь у нас язык при исполнении предупреждает, что длина условия больше единицы, но использовано только одно — первое, соответственно, единица больше 2 — нет, хотя он почему-то написал да. Это надо проверить. Если хочется использовать векторную операцию if, то нужно использовать функцию ifelse. Здесь ifelse, мы видим, что три значения — TRUE, TRUE, FALSE. Соответственно, и здесь у нас тоже векторы. Получается, для первого TRUE у нас будет взят элемент из первого вектора, для второго TRUE элемент из первого вектора и для FALSE из второго вектора.

Кроме условного оператора можно воспользоваться также и выбором. Выбор осуществляется конструкцией switch, в которой мы перечисляем. В качестве первого аргумента приводится тот элемент, относительно которого будет выбор, и через запятую мы пишем некоторые объекты. Дальше пишем равенства и выражение, которое будет исполняться, если у нас первый аргумент будет равен этому объекту. Соответственно, если мы передаем «раз», мы из всех этих вариантов берем «раз» и возвращаем единицу, то есть эта конструкция будет возвращать единицу, здесь двойку. Если мы приводим в качестве первого элемента то, что не совпадает ни с одним, то берется назначение по умолчанию – то, которое не имеет имени.

Следующем специальным оператором являются циклы. Циклы могут быть записаны тремя вариантами: repeat, while и for. На этих примерах вы можете посмотреть, какая запись короче получается. Все эти программы делают одно и то же, при этом все эти циклы изменяют переменные, находящиеся за их пределами. Получается, если мы i в начале программы присвоили единичку, то мы видим, что в конце, после выполнения каждого из этих циклов, i у нас изменяется. Соответственно, оператор repeat — после него должно тело цикла следовать в фигурных скобках, но если это на одной строке в виде одного выражения, то фигурные скобки не обязательны. Выходом из цикла repeat является только break, то есть, если нигде break не объявлен, то этот цикл будет исполняться бесконечно. While имеет заданное ограничение. For — тут понятно, что перебор идет в рамках какого-то ограниченного вектора. Следующая операция осуществляется оператором next, если мы хотим перескочить через один цикл.

Ну и последнее, о чем я хотел бы сказать, это доступ к структурам данных. Он осуществляется одним из четырех следующих способов. Для векторов и списков мы используем просто квадратные скобочки и указываем соответствующий индекс. Индекс может быть как числовым, так и буквенным вектором, то есть мы можем не только одно число указать, но и можем целый вектор указать. Соответственно, у нас из вектора будет извлечён подвектор с соответствующими индексами. Если у нас двойные квадратные скобки, то мы должны извлечь единственный элемент, который соответствует этому индексу. Но допускается также частичное соответствие. Если мы укажем опцию exact=FALSE, тогда мы можем только часть имени индекса привести, и нам будет выдан тот элемент, который подпадает под этот индекс. Также можно обратиться к элементу списка по имени и к свойству объекта. Если у нас объект типа S4, тогда мы можем с помощью @ добраться до свойств этого объекта. Еще раз рекомендую познакомиться с книгой Джозефа Адлера «R in a Nutshell», там достаточно понятно все изложено. Есть программа, на которой можете сами проверить. Но также вы можете зайти на сайт tryr.codeschool.com от O'reilly и прямо на сайте испытать язык R, при этом не устанавливая ничего у себя на компьютере. Спасибо.

Вернуться к учебному плану