R Academy · Урок

Приоритет операторов и сложные выражения

Разберитесь в порядке вычисления и безопасно составляйте сложные выражения.

Урок 4 из 413 шагов

«Приоритет операторов и сложные выражения» — бесплатный урок R Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.

Что такое приоритет операторов?

Приоритет операторов определяет порядок вычисления операций в выражении. Как и в математике, умножение выполняется раньше сложения. В R используется чётко определённая таблица приоритетов.

# Precedence in action
result1 <- 2 + 3 * 4    # * before +
result2 <- (2 + 3) * 4  # parentheses override
cat('2 + 3 * 4 =', result1, '
')   # 14
cat('(2+3) * 4 =', result2, '
')   # 20

Таблица приоритетов R (от высокого к низкому)

R вычисляет операторы в следующем порядке (сначала операторы с наивысшим приоритетом):

  1. ^ — возведение в степень
  2. - (унарный) — смена знака
  3. : — последовательность
  4. %%, %/%, %*%, %in% — специальные инфиксные операторы
  5. *, / — умножение, деление
  6. +, - (бинарные) — сложение, вычитание
  7. <, >, <=, >=, ==, != — сравнение
  8. ! — NOT
  9. &, && — AND
  10. |, || — OR
  11. <-, = — присваивание
# Exponentiation before multiplication
cat('2 * 3 ^ 2 =', 2 * 3 ^ 2, '
')   # 2 * 9 = 18
cat('(2*3)^2 =', (2 * 3) ^ 2, '
')   # 6^2 = 36

# Unary minus applied after exponentiation
cat('-2 ^ 2 =', -2 ^ 2, '
')    # -(2^2) = -4
cat('(-2)^2 =', (-2) ^ 2, '
')  # 4

Приоритет оператора двоеточия

Оператор последовательности : имеет более высокий приоритет, чем + и -, что приводит к распространённой ошибке новичков: 1:n+1 читается как (1:n)+1, а не как 1:(n+1).

n <- 5

# Common mistake: colon before addition
cat('1:n+1 =', 1:n + 1, '
')   # (1:5)+1 = 2 3 4 5 6
cat('1:(n+1) =', 1:(n + 1), '
') # 1:6 = 1 2 3 4 5 6

# These are DIFFERENT results!
# Always use parentheses when the upper bound involves arithmetic

Приоритет специальных операторов

Специальные операторы, такие как %%, %/% и %in%, имеют более высокий приоритет, чем + и -, но более низкий, чем ^. Непонимание этого может привести к трудноуловимым ошибкам.

# %% has higher precedence than +
cat('10 + 7 %% 3 =', 10 + 7 %% 3, '
')   # 10 + (7%%3) = 10+1 = 11
cat('(10+7) %% 3 =', (10 + 7) %% 3, '
') # 17 %% 3 = 2

# %in% precedence
nums <- 1:5
cat('1 + 1 %in% nums =', 1 + 1 %in% nums, '
')  # (1+1) %in% nums? No! 1 + (1 %in% nums) = 2

Сначала сравнение, затем логические операции

Операторы сравнения (<, >, == и т. д.) вычисляются раньше логических операторов (!, &, |). Поэтому выражение x > 0 & y < 10 работает ожидаемым образом без дополнительных скобок.

x <- 5
y <- 8

# This works as intended: comparisons first, then &
cat('x > 0 & y < 10:', x > 0 & y < 10, '
')  # TRUE & TRUE = TRUE

# ! NOT has higher precedence than &
vec <- c(TRUE, FALSE, TRUE)
cat('!vec & TRUE:', !vec & TRUE, '
')  # (!vec) & TRUE, not !(vec & TRUE)
cat('!(vec & TRUE):', !(vec & TRUE), '
')

Коварная ошибка с приоритетом № 1

Распространённая ошибка: забыть, что ! имеет более низкий приоритет, чем сравнение. Поэтому !x == y читается как (!x) == y, а не как !(x == y).

x <- 5
y <- 5

# BUG: meant to check 'x is not equal to y'
bug_result <- !x == y      # reads as (!x) == y
cat('!x == y (bug):', bug_result, '
')   # !5 means FALSE, FALSE==5 is FALSE

# CORRECT: use != or !(x == y)
cat('x != y:', x != y, '
')             # FALSE (correct)
cat('!(x == y):', !(x == y), '
')       # FALSE (correct)

Коварная ошибка с приоритетом № 2

Ещё одна трудноуловимая ошибка: -1:5 создаёт последовательность -1, 0, 1, 2, 3, 4, 5 — унарный минус применяется только к 1, а не ко всему диапазону. Чтобы получить диапазон, начинающийся с отрицательного числа, используйте скобки.

# Misleading: looks like range from -1 to 5 starting at negative
seq1 <- -1:5
cat('-1:5 =', seq1, '
')  # -1 0 1 2 3 4 5 (correct here)

# But -2^2 is a trap:
cat('-2^2 =', -2 ^ 2, '
')    # -4 (not 4)
cat('(-2)^2 =', (-2) ^ 2, '
') # 4

# Always parenthesise to be safe
cat('(-1):5 =', (-1):5, '
')   # same as -1:5 but explicit

Использование скобок для ясности

Даже когда скобки не являются строго необходимыми, с ними код становится проще для чтения и менее подвержен ошибкам. Не полагайтесь на запоминание всей таблицы приоритетов — используйте скобки, чтобы ясно выразить своё намерение.

# Hard to read — requires knowing precedence
result_unclear <- 2 + 3 * 4 ^ 2 / 8 - 1

# Clear intent with parentheses
result_clear <- 2 + ((3 * (4 ^ 2)) / 8) - 1

cat('Unclear:', result_unclear, '
')
cat('Clear:  ', result_clear, '
')
cat('Same result?', result_unclear == result_clear, '
')

Присваивание в выражениях

Присваивание (<-) имеет очень низкий приоритет — ниже, чем большинство операторов. Поэтому результат любого сложного выражения можно присвоить в одной строке, но присваивание внутри выражений также может вести себя неожиданно.

# <- has very low precedence
# This assigns (3 + 4) to x, then evaluates (TRUE)
result <- x <- 3 + 4   # x gets 7, result gets 7
cat('x:', x, 'result:', result, '
')

# Be careful with == vs <- 
# x <- 5 is assignment
# x == 5 is comparison (always use == for testing)

Практика: как избежать ошибок приоритетов

Вот практическая стратегия написания корректных сложных выражений: разбивайте длинные выражения на именованные промежуточные шаги. Это также упрощает отладку, поскольку можно проверить каждый шаг.

# Complex formula: compound interest
principal <- 1000
rate <- 0.05
years <- 10

# Hard to verify in one line
bad <- principal * (1 + rate) ^ years

# Easier to verify step by step
growth_factor <- (1 + rate) ^ years
final_amount <- principal * growth_factor
cat('Growth factor:', round(growth_factor, 4), '
')
cat('Final amount: $', round(final_amount, 2), '
')

Приоритет логических AND и OR

& (AND) имеет более высокий приоритет, чем | (OR). Поэтому A | B & C вычисляется как A | (B & C). При одновременном использовании AND и OR всегда ставьте скобки, чтобы избежать трудноуловимых логических ошибок.

A <- TRUE
B <- FALSE
C <- TRUE

# & before | — may surprise you
cat('A | B & C:', A | B & C, '
')     # A | (B & C) = TRUE | FALSE = TRUE
cat('(A|B) & C:', (A | B) & C, '
')   # TRUE & TRUE = TRUE

# Different with:
A2 <- FALSE
cat('A2 | B & C:', A2 | B & C, '
')   # FALSE | (FALSE & TRUE) = FALSE
cat('(A2|B) & C:', (A2 | B) & C, '
') # (FALSE|FALSE) & TRUE = FALSE

Быстрая проверка

Во что вычисляется -3 ^ 2 в R?

Повторение: приоритет операторов

Превосходно! Вот основные выводы из этого урока:

  • Порядок приоритетов (от высокого к низкому): ^, унарный -, :, %%/%/%*%%in%, */, +-, сравнения, !, &, |, присваивание
  • -2^2 = -4, поскольку ^ имеет более высокий приоритет, чем унарный минус; для получения 4 используйте (-2)^2
  • 1:n+1 означает (1:n)+1; если нужен более длинный диапазон, используйте 1:(n+1)
  • & имеет более высокий приоритет, чем |; заключайте смешанную логику AND/OR в скобки
  • Если сомневаетесь, используйте скобки, чтобы явно выразить своё намерение и избежать ошибок
# Golden rule: parentheses for clarity
n <- 4
# Intended: sequence 1 to n+1
cat('Wrong : 1:n+1  =', 1:n + 1, '
')
cat('Correct: 1:(n+1)=', 1:(n + 1), '
')

# Intended: -(2^2)
cat('Correct: -2^2 = -(2^2) =', -2 ^ 2, '
')
Можно начать бесплатно

Изучай R с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
43
Уроки
159

Часто задаваемые вопросы

Урок «Приоритет операторов и сложные выражения» бесплатный?

Да — полный текст урока «Приоритет операторов и сложные выражения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.

Чему я научусь в уроке «Приоритет операторов и сложные выражения»?

Разберитесь в порядке вычисления и безопасно составляйте сложные выражения. Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать R Academy?

Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Приоритет операторов и сложные выражения»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке R Academy?

Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Арифметические операторы и операторы сравнения
  2. Логические операторы и булева логика
  3. Операторы присваивания и специальные операторы
  4. Приоритет операторов и сложные выражения
← Назад к R Academy