Как создать переменную в R
Переменная в R — это имя, привязанное к значению. Вы создаёте её стрелкой присваивания <-: имя идёт перед стрелкой, значение — после.
Три переменные, три разных вида значений и ни одного объявления типа — R выводит тип из самого значения (подробнее в статье про типы данных). Как только переменная существует, вы используете её везде, где использовали бы значение:
Переприсваивание работает так же. Переменная спокойно переключается на новое значение — даже другого типа — в момент нового присваивания:
R не возмутился тем, что строка стала числом. Такая гибкость удобна, но если смысл переменной меняется посреди скрипта, это обычно сигнал взять новое имя.
Почему в R используют <-, а не =
Вот вопрос, который задают все: age = 30 тоже работает, так почему каждая книга по R, каждое руководство по стилю и каждый пакет используют стрелку?
Потому что = в R — это две разные вещи в зависимости от того, где он стоит. На верхнем уровне он присваивает. Внутри вызова функции он сопоставляет аргумент по имени и не создаёт переменную:
Если бы вы написали mean(values, na.rm <- TRUE), вы бы случайно создали глобальную переменную с именем na.rm и передали TRUE по позиции — законно, неправильно и трудно заметить. Соглашение, которое держит всё это читаемым, простое:
<-всегда означает присваивание.=всегда означает «этот аргумент получает это значение» внутри вызова функции.
Соблюдайте это разделение — и каждая прочитанная строка R сразу скажет вам, что-то создаётся или передаётся. Это самое универсальное стилевое правило в мире R — RStudio даже выделил <- отдельное сочетание клавиш (Alt+-).
Редкие родственники: ->, = и assign()
В R есть ещё два способа присваивания, и оба стоит уметь узнавать, даже если вы их почти не пишете.
Обратная стрелка -> присваивает в другом направлении — сначала значение, потом имя:
Иногда её можно встретить в конце длинного конвейера («вычислить всё это, а потом сохранить»), но большинство руководств по стилю советуют её избегать: читатели ищут определяемое имя в начале строки.
assign() создаёт переменную из строки, то есть имя можно собрать во время выполнения:
Выглядит остроумно и почти всегда оказывается неподходящим инструментом — набор пронумерованных переменных на самом деле переодетый вектор или список. Беритесь за assign() только тогда, когда имя действительно должно вычисляться; его напарник get("score") читает переменную по строковому имени.
Правила именования
R принимает имена, которые:
- Содержат буквы, цифры, точки (
.) и подчёркивания (_). - Начинаются с буквы или с точки, за которой не идёт цифра.
- Не являются зарезервированными словами (
if,for,TRUE,NULL,functionи ещё несколько).
Так что все эти имена корректны:
А эти — нет:
2nd_user— нельзя начинать с цифры._temp— с подчёркивания тоже нельзя (в отличие от Python).user-name— дефис это вычитание, а не символ имени.TRUE— зарезервированное слово.
Имена чувствительны к регистру: total, Total и TOTAL — три никак не связанные переменные, и R не предупредит вас, когда вы создадите одну из них опечаткой.
Просмотр и удаление: ls() и rm()
Каждая созданная вами переменная попадает в рабочее пространство (глобальное окружение). ls() показывает, что там есть, а rm() удаляет:
Две детали, которые стоит знать. Во-первых, rm(list = ls()) стирает всё рабочее пространство — удобно в начале разведочной сессии, разрушительно в любом другом месте. Во-вторых, имена, начинающиеся с точки (например, .cache), скрыты от ls(), если не вызвать ls(all.names = TRUE) — то же соглашение, что и у скрытых файлов в Unix.
Соглашения об именовании: используйте snake_case
Помимо жёстких правил, современное сообщество R (и руководство по стилю tidyverse) сошлось на соглашениях:
lower_snake_caseдля переменных и функций:retry_count,fit_model.- Точки в именах законны, но устарели: базовый R полон имён эпохи
data.frameвродеmy.data, но точка ещё и несёт смысл в системе методов S3 (print.data.frame— это «метод print для датафреймов»), поэтому новый код их избегает. - Никаких венгерских префиксов, никакого camelCase —
camelCaseвстречается в старых пакетах, но экосистема остановилась на snake_case. - В R нет настоящих констант; соглашение — называть потенциальные константы заглавными (
MAX_RETRIES <- 5) и просто не переприсваивать их.
Выбирайте описательные имена и будьте последовательны. avg_score стоит на четыре нажатия клавиш больше, чем as, и экономит каждому будущему читателю поход обратно вверх по скрипту.
Что вы уносите с собой
name <- valueсоздаёт переменную;=сообщество оставляет для аргументов функций.->иassign()существуют; читать их вам придётся чаще, чем писать.- Имена состоят из букв, цифр, точек и подчёркиваний; они не могут начинаться с цифры или подчёркивания и чувствительны к регистру.
ls()показывает рабочее пространство,rm()его очищает.- Пишите в
snake_case— и ваш код будет выглядеть как тот R, который сегодня пишут все остальные.
Дальше: какие именно значения хранят эти переменные — numeric, integer, character и logical.
Часто задаваемые вопросы
Как создать переменную в R?
Напишите имя, стрелку присваивания <- и значение: age <- 30. Тип R выведет из значения — шага объявления нет. age = 30 тоже работает на верхнем уровне, но соглашение сообщества — это <-.
В чём разница между <- и = в R?
На верхнем уровне скрипта они делают одно и то же. Внутри вызова функции — нет: mean(x, na.rm = TRUE) использует =, чтобы сопоставить аргумент по имени, а не чтобы создать переменную. Поскольку = играет обе роли в зависимости от контекста, руководства по стилю R закрепляют <- за присваиванием, а = — за аргументами.
Как удалить переменную в R?
rm(x) удаляет переменную x из рабочего пространства. rm(list = ls()) удаляет всё — полезно для чистого старта и опасно посреди анализа. ls() показывает, что существует сейчас.
Могут ли имена переменных в R содержать точки?
Да — my.data вполне законное имя, и в старом коде на R точки встречаются повсюду. Современный стиль предпочитает подчёркивания (my_data), потому что точка также имеет смысл в системе методов S3, из-за чего имена с точками читаются неоднозначно.