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

Общие сведения о языке R. Основные функции

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

 

Итак, сейчас мы открываем 3 модуль, основы языка R, и он начнётся с лекции самых базовых сведений об этом языке для того, чтобы составить представление о нем. Мы познакомимся с:

Но для того чтобы наиболее эффективно усвоить материалы этой лекции, я рекомендую ознакомиться с книгой Джози Фармера "R in a Nutsshell", и на начальном этапе изложение будет идти по ней, и установить сам язык R и среду для работы с ним. Параллельно прослушиванию лекции я рекомендую писать вот эти программы, которые будут на второй части слайда и заодно проверять, правильно ли все там написано.

Итак, язык R. Это язык с динамической типизацией основанной на языке S, предназначенный для статистической обработки данных. Называется так он в честь своих создателей: Росс Айхэк и Роберт Джентлмен из Окледского университета.

В 1993 году они начали работу над этим языком, и по сей день работа над ним продолжается.

В правой части слайда результаты опроса наиболее популярным инструментом в области аналитики Data Mining, это одна из причин изучать язык.

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

Функция - это такие объекты, которые возвращают по объектам новый объект. Таким образом, все элементы языка - это объекты, в основном работа происходит с ними.

Функции, как мы уже заметили, это некоторые объекты, но отдельно выделяется класс операторов: унарные, бинарные, тернарные. С операторами мы привыкли обращаться таким образом: наиболее удобно использовать запись. Мы видим, что здесь квадратные скобочки x - квадратная скобочка 2, - это обращение ко второму элементу массива x. В данном случае x представлены в виде вектор, функция С образует вектор и обращение ко второму элементу. Дальше следует стрелочка, то есть второму элементу этого вектора присвоили новое значение. На самом деле, это операторная запись. В следующей функции: трехместная функция - это квадратная скобка, и стрелочка присваивания. То есть эта строчка - в точности то же самое, что и вторая.

Символ присваивания - это тоже функция, которая берет первый, второй объект и возвращает третий. Но она возвращает в первый, то есть он меняет первый.

Операция плюс тоже может быть записана в функциональном виде. Вообще язык основан на функциональной записи, то есть любая функция которая записана в операторном виде в процессе обработки языком превращается в функциональную запись.

Даже оператор if может быть записан как функция и обрабатываться, как функция, с той лишь разницей что вычисления значения 2 и 3 аргумента не всегда происходит, поэтому эта функция специальная, то есть первый аргумент она всегда использует, вычисляет, а второй аргумент только при условии, что первый истинен.

Поведение объектов. В языке R все объекты в основном неизменяемые, это значит, что мы при присвоении фактически копируем объект каждый раз. В механике языка есть некоторые нюансы: не всегда идет копирование. Например, в этом случае, когда в такой программке мы иксу присваиваем 3, потом игреку - x, и x присваиваем 2. Чему равен y? Он равен 3, потому что здесь идет копирование объекта, а не указателя на объект.

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

Теперь некоторая информация о самих объектах. Объекты всегда представлены какими-то символом, и сами символы тоже являются объектами. Имена функций являются объектами, как и тела функции.

Например, f мы присвоили объект двойка то f - это тоже объектом. А если мы попытаемся к нему применить скобки, то есть вызвать функцию скобок, от объекта f объекта 2, то нам скажет, что нет такой функции. Если мы присвоим f функцию, то при попытке просто вывести f он выведет тело этой функции.

Это очень полезная функция чтобы узнать, что внутри за этим объектом. Но поскольку язык у нас с динамической типизацией, то нет необходимости объявлять типы. С одной стороны, это приводит к тому, что символы не привязаны каким-то типом. Как раз в этом примере мы сначала присвоили объект 2, потом присвоили объект типу функции. И поведение у них от одной и той же записи будет разным.

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

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

Ещё одна интересная особенность функции С: если мы комбинируем два вектора, то мы снова получаем один вектор, причем теряется сама структура. То есть если мы здесь вначале в новый вектор объединяли два других, то мы получили просто новый, в котором последовательно идут числа.

Это основные функции, с помощью которых мы формируем базовые элементы.

Специальные значения языка. Используются такие константы и объекты, которые обозначают, например NA обозначает пробелы в данных, то есть данные, которые не были доступны. Например, мы провели какой-то опрос, а кто-то нам что-то не ответил - вот и NA. Также NA присваивается тем индексом вектора, когда мы выходим за пределы обозначенных массивов. Например, если мы сделали вектор из трех элементов, пытаемся взять четверый, он нам скажет NA. Если мы расширим изначально вектора x: мы длине икса присвоили семерку, то есть расширили до 7, и смотрим: он расширился с помощью значения NA.

Tсть также специальные обозначения для бесконечности: плюс минус бесконечности, Inf. Бесконечность - числа больше чем 2 в степени 1024 или меньше чем -2 в степени 1024.

Есть константа NaN, она возвращается, когда у нас есть неопределенность, например, 0 делим на ноль или бесконечность складываем и вычитаем.

NULL - это объект, указывающий на отсутствующей аргумент. Если мы не передаем значение функции, то она все равно передается в виде NULL.

Еще одна важная особенность языка - это приведение типов. Язык как-то динамически преобразует одно в другое и всегда пытается привести типы, но к более общему типу.

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

Мы видим, что в этом примере если мы иксу присвоим сначала числа, тут будет нос вектор из чисел, они записываются без кавычек: тип икса иннтеджер, а если мы присвоим второму элементу вектора какое-то буквенное значение, то весь вектор преобразуется в букву. И тип икса состоит из букв.

Есть определенные правила приведения типов. Логические значения true/faulse приводятся к единице и нулю соответственно. Значение приводится к наиболее простому, то есть мы пытаемся потерять минимум информации при проведении.

Но в есть следующий порядок приведения: логические к числовым, к integer - числовым, числовые к комплексным, комплексные к буквенным, а дальше к спискам. В списке наиболее общий вид.

Объекты типа raw, то есть сырые загружены байтовые массивы не приводятся никаким другим типом, но и в общем случае свойства объектов теряется при проведении. На этом мы заканчиваем вводную часть языка, можете поупражняться.

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