Операторы присваивания и специальные операторы
Изучите >, %in% и оператор конвейера в R.
«Операторы присваивания и специальные операторы» — бесплатный урок R Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.
Присваивание в R
В R есть несколько способов присваивать значения переменным. Наиболее идиоматичный вариант — <-, именно его рекомендуется использовать. Вы также встретите = для присваивания, хотя в некоторых контекстах он ведёт себя немного иначе.
# Both assign a value, <- is preferred
name <- 'Alice'
age = 30
cat('Name:', name, '
')
cat('Age:', age, '
')Левая стрелка <- и знак равенства =
<- всегда создаёт переменную в текущем окружении. = также может выполнять присваивание, но внутри вызовов функций он задаёт именованные аргументы, а не создаёт переменную. Это различие важно.
# <- creates a variable outside function calls
x <- 42
# = inside function call sets argument, does NOT create x
mean(x = c(1, 2, 3)) # x is an arg here, not a variable
# But <- inside a function call DOES create a variable
mean(y <- c(1, 2, 3)) # y is now also in workspace
cat('y was created:', y, '
')Оператор присваивания справа ->
R также поддерживает присваивание справа налево с помощью ->. Он присваивает значение слева имени справа. Хотя такой синтаксис допустим, на практике его используют редко, поскольку он снижает читаемость.
# Right assignment operator
100 -> max_score
'R Programming' -> course_name
cat('Max score:', max_score, '
')
cat('Course:', course_name, '
')
# Same as:
# max_score <- 100
# course_name <- 'R Programming'Глобальное присваивание с помощью <<-
<<- присваивает значение переменной в родительском (охватывающем) окружении, а не в локальном окружении функции. Он используется внутри функций для изменения переменной, существующей за пределами функции.
counter <- 0
increment <- function() {
counter <<- counter + 1 # modifies the global counter
}
increment()
increment()
increment()
cat('Counter after 3 increments:', counter, '
')Оператор принадлежности %in%
%in% проверяет, встречается ли каждый элемент слева в векторе справа. Он возвращает логический вектор той же длины, что и левый операнд. Это самый удобный способ проверить принадлежность множеству в R.
fruits <- c('apple', 'banana', 'cherry', 'date', 'elderberry')
# Check membership
cat('Is mango in fruits?', 'mango' %in% fruits, '
')
cat('Is cherry in fruits?', 'cherry' %in% fruits, '
')
# Check multiple values at once
search <- c('banana', 'mango', 'date')
cat('Which are in fruits:', search %in% fruits, '
')Фильтрация с помощью %in%
%in% особенно полезен для фильтрации векторов или строк таблиц данных. Он позволяет выбрать элементы, принадлежащие заранее определённому множеству допустимых значений.
countries <- c('USA', 'UK', 'Canada', 'Germany', 'France', 'Japan')
populations <- c(331, 67, 38, 83, 67, 126) # millions
# Keep only G7 European members
g7_europe <- c('UK', 'Germany', 'France', 'Italy')
mask <- countries %in% g7_europe
cat('G7 Europe countries:', countries[mask], '
')
cat('Populations:', populations[mask], '
')Матричное умножение с помощью %*%
%*% выполняет настоящее матричное умножение (скалярное произведение), в отличие от *, который перемножает элементы попарно. Для двух матриц A (m x n) и B (n x p) результатом будет матрица размера (m x p).
A <- matrix(c(1, 2, 3, 4), nrow = 2, ncol = 2)
B <- matrix(c(5, 6, 7, 8), nrow = 2, ncol = 2)
cat('Matrix A:
')
print(A)
cat('Matrix B:
')
print(B)
cat('A %*% B (matrix mult):
')
print(A %*% B)
cat('A * B (element-wise):
')
print(A * B)Нативный конвейер |>
Представленный в R 4.1, нативный конвейер |> передаёт результат выражения слева как первый аргумент функции справа. Он делает цепочки операций гораздо более читаемыми.
# Without pipe
result1 <- round(sqrt(abs(-16)), 2)
cat('Without pipe:', result1, '
')
# With native pipe |>
result2 <- -16 |> abs() |> sqrt() |> round(2)
cat('With pipe:', result2, '
')
# Reading left to right: take -16, get abs, sqrt, then roundКонвейер с векторами
Нативный конвейер |> особенно полезен при работе с векторами и числовыми операциями. Вы можете объединять преобразования в цепочку, не создавая промежуточные переменные, благодаря чему код становится чище и понятнее.
scores <- c(88, 45, 92, 61, 73, 55, 84, 79)
# Chain: keep passing scores, then compute mean
passing_mean <- scores |> \(x) x[x >= 60] |> mean()
cat('Mean of passing scores:', round(passing_mean, 2), '
')
# Another chain: sort, reverse, take top 3
top3 <- scores |> sort(decreasing = TRUE) |> head(3)
cat('Top 3 scores:', top3, '
')Пользовательские инфиксные операторы
R позволяет определять пользовательские инфиксные операторы с помощью синтаксиса %name%. Именно так пакеты вроде dplyr определяют конвейер %>%. Вы можете создавать собственные операторы для предметно-ориентированных операций.
# Define a custom infix operator for 'not in'
'%notin%' <- function(x, table) !(x %in% table)
cities <- c('Paris', 'London', 'Berlin', 'Tokyo', 'Sydney')
exclude <- c('Tokyo', 'Sydney')
cat('Cities not in exclude list:', cities[cities %notin% exclude], '
')Краткий справочник по операторам
Ниже приведено краткое описание специальных операторов, рассмотренных в этом уроке:
<-— стандартное присваивание (предпочтительный вариант)=— присваивание (также используется для аргументов функций)<<-— присваивание в глобальном или родительском окружении%in%— проверка принадлежности%*%— матричное умножение|>— нативный конвейер (R 4.1 и новее)%name%— синтаксис пользовательского инфиксного оператора
# Demonstrate %in% as a filter
all_nums <- 1:20
special <- c(3, 6, 9, 12, 15, 18)
cat('Multiples of 3 up to 20:', all_nums[all_nums %in% special], '
')
# Demonstrate pipe
1:10 |> mean() |> cat('
')Быстрая проверка
Что возвращает оператор %in% при использовании в выражении c(2, 4, 6) %in% c(1, 2, 3)?
Повторение: специальные операторы
Отлично! Вот основные выводы из этого урока:
- Используйте
<-для присваивания — это соглашение, принятое в R =работает для присваивания, но внутри вызовов функций может быть неоднозначным<<-изменяет переменную в родительском (глобальном) окружении изнутри функции%in%— самый удобный способ проверить принадлежность множеству в R%*%выполняет матричное умножение, а не поэлементное- Нативный конвейер
|>(R 4.1 и новее) объединяет вызовы функций слева направо, делая код более читаемым - Пользовательские операторы используют шаблон
%name%
# Pipe + %in% combined
data <- c(5, 12, 3, 8, 15, 7, 20, 1)
valid_range <- 5:15
result <- data |> \(x) x[x %in% valid_range] |> sort()
cat('Values in range 5-15:', result, '
')Часто задаваемые вопросы
Урок «Операторы присваивания и специальные операторы» бесплатный?
Да — полный текст урока «Операторы присваивания и специальные операторы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.
Чему я научусь в уроке «Операторы присваивания и специальные операторы»?
Изучите >, %in% и оператор конвейера в R. Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать R Academy?
Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Операторы присваивания и специальные операторы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке R Academy?
Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Арифметические операторы и операторы сравнения
- Логические операторы и булева логика
- Операторы присваивания и специальные операторы
- Приоритет операторов и сложные выражения