Презентацию к лекции 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(), может существовать несколько вариантов реализации для разных типов аргументов. При выполнении программы выбирается реализация, соответствующая типам переданных объектов.
Язык всегда пытается привести типы к более общему, чтобы сохранить всю информацию. Например, если к вектору целых чисел добавить строку, весь вектор будет преобразован в строковый (символьный) тип.
Существуют следующие правила приведения типов (от простого к общему):
- Логический (logical) -> Числовой (integer / numeric). Значения
TRUE и FALSE преобразуются в 1 и 0 соответственно.
- Целочисленный (integer) -> Числовой (numeric).
- Числовой (numeric) -> Комплексный (complex).
- Комплексный (complex) -> Строковый (character).
- Строковый (character) -> Список (list).
Списки являются наиболее общим видом объектов. Сырые байтовые массивы (raw) не приводятся к другим типам. В общем случае при приведении объектов к более общему типу их специфические свойства теряются.
Краткие итоги
Изучение основ языка R требует переосмысления привычных подходов к программированию, характерных для процедурных или строго типизированных языков. Ключевая идея, пронизывающая весь материал, --- унификация всех сущностей языка. В R нет разделения на «код» и «данные» в традиционном понимании: и переменные, и операторы, и даже управляющие конструкции являются функциями, которыми можно оперировать как объектами. Это открывает широкие возможности для метапрограммирования и создания гибких аналитических скриптов.
Понимание принципа неизменяемости объектов критически важно для написания эффективного кода. Осознание того, что при каждой операции присваивания создается копия, а не ссылка, позволяет избегать ошибок при управлении памятью и объясняет поведение переменных внутри пользовательских функций. Это напрямую влияет на то, как следует проектировать архитектуру программ для обработки больших объемов данных, характерных для задач интеллектуального анализа.
Особое внимание уделяется работе с неполными или аномальными данными. Введение специальных констант, таких как NA, NaN и Inf, --- это не просто синтаксическая особенность, а отражение практической направленности языка на статистику. Аналитик постоянно сталкивается с пропусками в опросах, ошибками измерений или выбросами. Язык R предоставляет встроенные механизмы для корректной обработки таких ситуаций, что позволяет не прерывать вычисления, а аккуратно помечать проблемные участки данных.
Механизм автоматического приведения типов демонстрирует стремление языка к минимизации потерь информации, но требует от пользователя высокой осознанности. С одной стороны, это ускоряет написание кода и упрощает интерактивную работу в среде. С другой --- таит в себе риск неожиданного изменения структуры данных, особенно при смешивании чисел и строк. Понимание иерархии типов позволяет прогнозировать результат таких операций.
В совокупности эти базовые принципы формируют фундамент, на котором строится вся дальнейшая работа с языком. Владение пониманием того, как R хранит объекты, как связывает их с символами в среде и как трансформирует типы, позволяет эффективно использовать более сложные инструменты анализа, писать воспроизводимые отчеты и автоматизировать исследовательские процессы.
Введение
Язык R --- это язык с динамической типизацией, основанный на C и предназначенный для статистики. Назван в честь создателей --- Росса Айхэка и Роберта Джентльмена. Создан в 1993 году в Оклендском университете. R --- один из самых популярных инструментов аналитики и data mining.
Структура: Выражения, Функции, Среда
Программа на R состоит из выражений. Выражения состоят из объектов и функций. Имена объектов --- это символы. Набор символов, связанных с объектами, образует среду (environment).
Ключевая идея R: всё является объектом, а все операции --- функциями.
- Операторы (+, -,
[ ], <-) --- это удобная форма записи функций.
- Условный оператор
if --- тоже функция. Ее особенность в «ленивых» вычислениях: второй и третий аргументы вычисляются только при выполнении условия.
Поведение объектов и среда
Объекты неизменяемы (immutable). При присваивании (y <- x) значение копируется. Присваивание внутри функции локально и не влияет на глобальные переменные.
Символы не привязаны к типам. Можно сначала записать в переменную число 2, а потом --- функцию. Если вывести имя функции без скобок, мы увидим ее тело (код). Это способ узнать, что внутри объекта.
Фигурные скобки {} объединяют несколько выражений. Возвращается результат последнего.
Базовые типы и функции
Для работы с векторами используется функция c() (combine --- комбинировать).
c(1, 2, 3) создает вектор.
- При комбинировании двух векторов
c(c(1,2), c(3,4)) получается плоский вектор c(1, 2, 3, 4). Вложенность теряется.
Доступ к элементам вектора --- через оператор [ ].
Специальные значения
- NA (Not Available): Пропуски в данных. Присваивается при выходе за границы вектора.
- Inf / -Inf: Бесконечность (числа больше 21024).
- NaN (Not a Number): Неопределенность (например,
0/0).
- NULL: Отсутствующий аргумент функции.
Приведение типов
R автоматически приводит типы к более общему виду, чтобы сохранить всю информацию. Иерархия типов (от простого к сложному):
logical -> integer -> numeric -> complex -> character -> list
Примеры:
- Смешивание числа и строки делает весь вектор строковым (character).
- Логические
TRUE/FALSE превращаются в 1/0 в числовых операциях.
- Тип
raw (сырые байты) не приводится ни к чему.
- Списки (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?