Menu
CoddyTech

Map 和 mapply

本课属于 Coddy R 学习旅程的“逻辑与流程”单元。第 33 课,共 64 课。

Map(f, xs, ys)会同步遍历两个或更多向量,并为每组元素调用一次f:先传入第一个元素,然后传入第二个元素,以此类推。它会返回一个列表:

totals <- Map(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5))
print(length(totals))
print(totals[[3]])

输出:

[1] 3
[1] 7.5

mapply() 是简化版,类似于适用于多个向量的 sapply()。unlist() 也会把 Map() 返回的列表展平为向量:

print(mapply(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5)))
print(unlist(Map(function(a, b) a + b, 1:3, 4:6)))

输出:

[1]  8.0 12.0  7.5
[1] 5 7 9

向量按位置进行匹配,因此它们的长度必须相同。mapply() 会根据第一个向量为文本结果命名;USE.NAMES = FALSE 会移除这些名称:

items <- c("tea", "jam")
qty <- c(2, 3)
labels <- mapply(function(i, q) paste(q, "x", i), items, qty, USE.NAMES = FALSE)
print(labels)

输出:

[1] "2 x tea" "3 x jam"

当每一对都需要一个 if 时,编写一个带有多个参数的函数,并将它传递给 mapply()。这样,条件就会针对每一对运行一次:

describe <- function(name, age) {
  group <- if (age < 18) "minor" else "adult"
  paste0(name, " (", group, ")")
}
print(mapply(describe, c("Ada", "Tim"), c(36, 12), USE.NAMES = FALSE))

输出:

[1] "Ada (adult)" "Tim (minor)"
challenge icon

挑战

简单

完成 order_lines(items, qty, prices)。每件商品返回一行,2 x tea = 8.00:数量、 x 、商品、 = ,以及数量乘以价格的结果,保留两位小数。使用 mapply() 或 Map()。

提供的代码会将商品、数量和价格作为三行逗号分隔的数据读取,并打印返回的每一行。

亲手试试

order_lines <- function(items, qty, prices) {
  # 在这里编写你的代码
  character(0)
}

# 提供的输入和输出代码:保持原样
input <- suppressWarnings(readLines(file("stdin")))
cat(order_lines(strsplit(input[1], ",")[[1]], as.numeric(strsplit(input[2], ",")[[1]]), as.numeric(strsplit(input[3], ",")[[1]])), sep = "\n")
quiz icon自我测试

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

逻辑与流程中的所有课

自己练习: R 在线编译器