Menu
CoddyTech

向量运算与循环补齐

本课属于 Coddy R 学习旅程的“基础知识”单元。第 69 课,共 78 课。

对两个长度相同的向量执行算术运算时,R 会逐个元素应用运算:

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

输出:

[1] 11 22 33

但是,当向量的长度不同时会发生什么?R 会使用一种称为循环补齐的行为。较短的向量会重复,以匹配较长向量的长度:

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 仍会执行运算,但可能会发出关于不完全循环补齐的警告。

challenge icon

挑战

简单

你将收到两行输入:

  1. 一个以逗号分隔、表示基数值的数字列表(例如,10,20,30,40,50,60)
  2. 一个以逗号分隔的乘数列表(例如,2,5)

使用向量运算和循环补齐:

  1. 根据基数值创建一个数值向量
  2. 根据乘数创建一个数值向量
  3. 将基数值乘以乘数(R 会循环使用较短的向量)
  4. 打印乘法结果
  5. 将原始基数值中的每个元素加上 100(单个值会循环使用)
  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

亲手试试

# 读取输入
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. 给 base_values 的每个元素加上 100
# 4. 输出加法结果
# 5. 从 base_values 中减去 multipliers
# 6. 输出减法结果
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: R 在线编译器