Menu
Coddy logo textTech

Арифметика и ресайклинг векторов

Часть раздела Основы путешествия по R на Coddy — урок 69 из 78.

Когда вы выполняете арифметические операции между двумя векторами одинаковой длины, R применяет операцию поэлементно:

a <- c(1, 2, 3)
b <- c(10, 20, 30)
print(a + b)

Вывод:

[1] 11 22 33

Но что происходит, когда векторы имеют разную длину? R использует поведение, называемое recycling (переиспользование). Более короткий вектор повторяется, чтобы соответствовать длине более длинного:

numbers <- c(1, 2, 3, 4, 5, 6)
multiplier <- c(10, 100)
print(numbers * multiplier)

Вывод:

[1]  10 200  30 400  50 600

Здесь multiplier был дополнен (recycled), чтобы стать c(10, 100, 10, 100, 10, 100) перед умножением. Это особенно полезно при работе с одиночным значением:

prices <- c(10, 20, 30)
print(prices * 1.1)

Вывод:

[1] 11 22 33

Одиночное значение 1.1 повторяется (recycled), чтобы соответствовать длине prices. Будьте осторожны, когда длина более длинного вектора не кратна длине более короткого, так как R все равно выполнит операцию, но может вывести предупреждение о частичном повторении (partial recycling).

challenge icon

Задание

Легко

Вы получите две строки входных данных:

  1. Список чисел, разделенных запятыми, представляющий базовые значения (например, 10,20,30,40,50,60)
  2. Список множителей, разделенных запятыми (например, 2,5)

Используя векторную арифметику и механизм циклического повторения (recycling):

  1. Создайте числовой вектор из базовых значений
  2. Создайте числовой вектор из множителей
  3. Умножьте базовые значения на множители (R автоматически применит recycling к более короткому вектору)
  4. Выведите результат умножения
  5. Добавьте 100 к каждому элементу исходных базовых значений (recycling одиночного значения)
  6. Выведите результат сложения
  7. Вычтите вектор множителей из вектора базовых значений
  8. Выведите результат вычитания

Например, если входные данные:

5,10,15,20,25,30
3,7

Вывод должен быть следующим:

[1]  15  70  45 140  75 210
[1] 105 110 115 120 125 130
[1]  2  3 12 13 22 23

Объяснение:

  • Умножение: Множители c(3, 7) циклически повторяются до c(3, 7, 3, 7, 3, 7), что дает 5*3, 10*7, 15*3, 20*7, 25*3, 30*7
  • Сложение: Одиночное значение 100 циклически повторяется для добавления к каждому элементу
  • Вычитание: Множители снова циклически повторяются, что дает 5-3, 10-7, 15-3, 20-7, 25-3, 30-7

Шпаргалка

При выполнении арифметических операций между векторами разной длины R использует recycling (циклическое повторение) — более короткий вектор повторяется до тех пор, пока его длина не совпадет с длиной более длинного вектора:

numbers <- c(1, 2, 3, 4, 5, 6)
multiplier <- c(10, 100)
print(numbers * multiplier)

Вывод:

[1]  10 200  30 400  50 600

Вектор multiplier циклически повторяется до c(10, 100, 10, 100, 10, 100) перед выполнением умножения.

Повторение одного значения особенно полезно:

prices <- c(10, 20, 30)
print(prices * 1.1)

Вывод:

[1] 11 22 33

Значение 1.1 повторяется до соответствия длине вектора prices.

Примечание: R может выдать предупреждение, если длина более длинного вектора не является кратной длине более короткого.

Попробуйте сами

# Чтение входных данных
con <- file("stdin", "r")
base_input <- suppressWarnings(readLines(con, n = 1))
multipliers_input <- suppressWarnings(readLines(con, n = 1))
close(con)

# Разбор значений, разделенных запятыми, в числовые векторы
base_values <- as.numeric(strsplit(base_input, ",")[[1]])
multipliers <- as.numeric(strsplit(multipliers_input, ",")[[1]])

# TODO: Напишите свой код ниже
# 1. Умножьте base_values на multipliers (переиспользование элементов произойдет автоматически)
# 2. Выведите результат умножения
# 3. Добавьте 100 к каждому элементу base_values
# 4. Выведите результат сложения
# 5. Вычтите multipliers из base_values
# 6. Выведите результат вычитания
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы