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

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

В лекции излагаются базовые сведения о языке программирования R: его назначение, история создания и место среди аналитических инструментов. Далее материал выстраивается вокруг ключевой парадигмы языка: всё в R является объектом, а любая операция — функцией. Рассматривается структура программ (выражения, символы, среда), поведение объектов при присваивании, концепция неизменяемости. Затем вводятся основные типы данных и специальные константы (NA, NULL, NaN). Завершается лекция разбором механизма динамической типизации и правил автоматического приведения типов.

Основные мысли

В результате изучения лекции слушатель будет способен:
1. Объяснить назначение языка R и его отличие от языков со статической типизацией.
2. Описать базовую структуру программы на R, состоящую из выражений и функций.
3. Различать понятия «объект», «символ», «функция» и «среда» в контексте R.
4. Анализировать поведение объектов при присваивании и копировании.
5. Использовать базовые функции, такие как c(), и операторы доступа к элементам вектора.
6. Интерпретировать значение специальных констант (NA, NULL, NaN, Inf) в данных.
7. Прогнозировать результат автоматического приведения одних типов данных к другим.
Показывать лекцию целиком
Краткое изложение

Презентацию к лекции 10 Вы можете скачать здесь.

Введение в язык R

Язык R --- это язык с динамической типизацией, основанный на языке C. Он предназначен для статистической обработки данных. Название языка происходит от первых букв имен его создателей --- Росса Айхэка (Ross Ihaka) и Роберта Джентльмена (Robert Gentleman) из Оклендского университета. Работа над языком началась в 1993 году и активно продолжается до сих пор.

Согласно опросам, R является одним из самых популярных инструментов в области аналитики и интеллектуального анализа данных (data mining). Это одна из главных причин для его детального изучения.

Структура языка

Программы на языке R состоят из выражений (expressions). Сами выражения состоят из объектов (objects) и функций (functions). Имена объектов и функций называются символами (symbols). Набор символов, которым сопоставлены определенные объекты, образует среду (environment). Если символ не связан ни с каким объектом, попытка обратиться к нему вызовет ошибку.

Функции --- это объекты, которые на основе одних объектов возвращают новые. Особый класс функций составляют операторы (operators): унарные, бинарные и тернарные. Привычная операторная запись является удобной формой вызова функции. Любая операция, записанная в операторном виде, при выполнении преобразуется языком в функциональную форму. Даже условный оператор if обрабатывается как функция, однако он является специальной функцией: вычисление его второго и третьего аргументов происходит не всегда, а только при выполнении условия.

Поведение объектов

Объекты в R в основном неизменяемы (immutable). Это означает, что при присваивании, как правило, происходит копирование объекта, а не передача ссылки на него.

text

x <- 3
y <- x
x <- 2

В этом примере значение y останется равным 3, так как было скопировано само значение, а не указатель на переменную x.

Присваивание нового объекта символу внутри функции действует только в рамках контекста этой функции и не влияет на глобальную среду.

Объекты и среда

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

Связка «символ --- объект» сохраняется в рамках среды. Среда создается контекстом программы или функции.

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

Основные функции и специальные значения

Основная работа в R ведется с векторами. Функция c() (от англ. combine --- комбинировать) формирует вектор из переданных аргументов. Важная особенность c() --- при объединении двух векторов она «схлопывает» их в один плоский вектор, теряя исходную вложенную структуру.

Доступ к элементам вектора и их изменение осуществляются с помощью оператора [ ] (квадратные скобки), который является двухместной функцией.

В языке R используются специальные константы для обозначения особых состояний данных:

  • NA (Not Available) --- обозначает пропущенные или недоступные данные. Присваивается, если обратиться к элементу вектора с индексом, выходящим за его пределы.
  • Inf / -Inf --- обозначает положительную и отрицательную бесконечность. Бесконечностью считаются числа, превышающие по модулю 2 в степени 1024.
  • NaN (Not a Number) --- обозначает неопределенность, возникающую, например, при делении ноля на ноль.
  • NULL --- объект, указывающий на отсутствующий аргумент. Если в функцию не передано значение, оно все равно передается в виде NULL.

Приведение типов

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

Язык всегда пытается привести типы к более общему, чтобы сохранить всю информацию. Например, если к вектору целых чисел добавить строку, весь вектор будет преобразован в строковый (символьный) тип.

Существуют следующие правила приведения типов (от простого к общему):

  1. Логический (logical) -> Числовой (integer / numeric). Значения TRUE и FALSE преобразуются в 1 и 0 соответственно.
  2. Целочисленный (integer) -> Числовой (numeric).
  3. Числовой (numeric) -> Комплексный (complex).
  4. Комплексный (complex) -> Строковый (character).
  5. Строковый (character) -> Список (list).

Списки являются наиболее общим видом объектов. Сырые байтовые массивы (raw) не приводятся к другим типам. В общем случае при приведении объектов к более общему типу их специфические свойства теряются.

Краткие итоги

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

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

Особое внимание уделяется работе с неполными или аномальными данными. Введение специальных констант, таких как NA, NaN и Inf, --- это не просто синтаксическая особенность, а отражение практической направленности языка на статистику. Аналитик постоянно сталкивается с пропусками в опросах, ошибками измерений или выбросами. Язык R предоставляет встроенные механизмы для корректной обработки таких ситуаций, что позволяет не прерывать вычисления, а аккуратно помечать проблемные участки данных.

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

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

Введение

Язык R --- это язык с динамической типизацией, основанный на C и предназначенный для статистики. Назван в честь создателей --- Росса Айхэка и Роберта Джентльмена. Создан в 1993 году в Оклендском университете. R --- один из самых популярных инструментов аналитики и data mining.

Структура: Выражения, Функции, Среда

Программа на R состоит из выражений. Выражения состоят из объектов и функций. Имена объектов --- это символы. Набор символов, связанных с объектами, образует среду (environment).

Ключевая идея R: всё является объектом, а все операции --- функциями.

Поведение объектов и среда

Объекты неизменяемы (immutable). При присваивании (y <- x) значение копируется. Присваивание внутри функции локально и не влияет на глобальные переменные.

Символы не привязаны к типам. Можно сначала записать в переменную число 2, а потом --- функцию. Если вывести имя функции без скобок, мы увидим ее тело (код). Это способ узнать, что внутри объекта.

Фигурные скобки {} объединяют несколько выражений. Возвращается результат последнего.

Базовые типы и функции

Для работы с векторами используется функция c() (combine --- комбинировать).

Доступ к элементам вектора --- через оператор [ ].

Специальные значения

Приведение типов

R автоматически приводит типы к более общему виду, чтобы сохранить всю информацию. Иерархия типов (от простого к сложному):
logical -> integer -> numeric -> complex -> character -> list

Примеры:

Выводы

1. Язык R — это язык с динамической типизацией, созданный в 1993 году для статистической обработки данных.
2. R является одним из самых популярных инструментов в области аналитики и data mining.
3. Любая программа на R состоит из выражений, которые, в свою очередь, делятся на объекты и функции.
4. Среда (environment) — это хранилище, где символам (именам) сопоставляются конкретные объекты.
5. Все операции и даже условные операторы в R на внутреннем уровне представляют собой вызовы функций.
6. Объекты в R являются неизменяемыми, поэтому при присваивании происходит копирование значения, а не передача ссылки.
7. Присваивание новых значений символам внутри функции локально и не меняет объекты в глобальной среде.
8. Функция c() используется для создания векторов, «схлопывая» вложенные структуры в плоский список элементов.
9. Специальные константы NA, NULL, NaN и Inf служат для обработки пропусков, отсутствия аргументов и нечисловых результатов.
10. Приведение типов в R направлено от простых типов (логический, числовой) к более общим (строковый, список) для сохранения информации.
11. Добавление строкового значения к числовому вектору автоматически преобразует весь вектор в строковый тип.
12. Списки (list) являются наиболее общим типом объектов в R, в то время как сырые данные (raw) не подлежат приведению.

Вопросы для самопроверки

1. Каковы основные особенности языка R как языка с динамической типизацией?
2. Чем функция отличается от оператора в контексте языка R?
3. Что представляет собой «среда» (environment) и как она связывает символы и объекты?
4. Какой специальный объект возвращается при обращении к несуществующему (четвертому) элементу вектора из трех значений?
5. Почему условный оператор if считается «специальной» функцией в R?
6. Если вектор x содержит числа, а затем одному из его элементов присваивается строка, что произойдет с остальными элементами вектора?
7. Каким образом можно посмотреть исходный код функции, записанной в переменную?
8. Почему при присваивании y <- x; x <- 2 переменная y не изменяется?
9. В каком порядке происходит приведение типов от самого простого к самому общему?
10. Для чего в анализе данных используется константа NA?
11. Что произойдет со структурой данных при попытке объединить два вложенных вектора с помощью функции c()?
12. Чем значение NaN отличается от NA?
Вернуться к учебному плану