Арифметика и ресайклинг векторов
Часть раздела Основы путешествия по 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).
Задание
ЛегкоВы получите две строки входных данных:
- Список чисел, разделенных запятыми, представляющий базовые значения (например,
10,20,30,40,50,60) - Список множителей, разделенных запятыми (например,
2,5)
Используя векторную арифметику и механизм циклического повторения (recycling):
- Создайте числовой вектор из базовых значений
- Создайте числовой вектор из множителей
- Умножьте базовые значения на множители (R автоматически применит recycling к более короткому вектору)
- Выведите результат умножения
- Добавьте
100к каждому элементу исходных базовых значений (recycling одиночного значения) - Выведите результат сложения
- Вычтите вектор множителей из вектора базовых значений
- Выведите результат вычитания
Например, если входные данные:
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. Выведите результат вычитанияВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
4Операторы. Часть 2
Логические операторы (AND, OR)Логические операторы. Часть 2 (NOT)Повторение: простая логикаВекторизованная логика. Часть 1Векторизованная логика. Часть 27Калькулятор разделения счета
Приветственное сообщениеПолучение пользовательского ввода13Векторы: продвинутый уровень
Срезы и индексация векторовЛогическая индексацияАрифметика и ресайклинг векторовОператор %in%2Переменные и типы данных
Числовой тип данныхЦелочисленный тип данныхСимвольный тип данныхЛогический тип данныхПроверка типов данныхПравила именованияПропущенные значения: NAИтоги — создание переменных5Принятие решений
Оператор ifКонструкция if - elseПовторение: Простой калькуляторВложенные конструкции if - else8Циклы
Цикл ForЦикл WhileBreakNext (Continue)Повторение: ФакториалГенерация последовательностей (seq, :)Вложенные циклыПовторение: Динамический ввод3Операторы. Часть 1
Арифметические операторыЦелочисленное деление и остаток от деленияОператоры присваиванияПовторение: простая математикаОператоры сравнения6Основы ввода-вывода
Вывод через printКоманда cat для выводаВывод с переменнымиЧтение ввода через readline()Основы преобразования типовПовторение — Калькулятор возрастаПовторение — Истина или ложь9Функции
Объявление функцииАргументы функцииВозвращаемые значенияПовторение — функция SigmaПовторение — функция валидацииЗначения параметров по умолчанию12Итерация по последовательностям
Итерация по элементам вектораИспользование seq_along()Итерация по символам (strsplit)Функции для работы со строками