Menu

Переменные и присваивание в R: <-, = и assign()

Как создавать переменные в R стрелкой <-, когда вместо неё обязателен =, правила именования и как выводить и удалять переменные с помощью ls() и rm().

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Как создать переменную в 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 для датафреймов»), поэтому новый код их избегает.
  • Никаких венгерских префиксов, никакого camelCasecamelCase встречается в старых пакетах, но экосистема остановилась на 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, из-за чего имена с точками читаются неоднозначно.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ