Reduce
本课属于 Coddy R 学习旅程的“逻辑与流程”单元。第 35 课,共 64 课。
Reduce(f, x) 会将 x 的元素合并成一个值:它先对前两个元素调用 f,然后对得到的结果和第三个元素调用 f,以此类推。使用 + 可以把所有元素相加:
print(Reduce(function(acc, x) acc + x, c(3, 5, 10)))
print(Reduce(`+`, 1:5))输出:
[1] 18
[1] 15像 + 这样的运算符也是函数。用反引号括起来后,`+` 可以像其他函数一样传递。当没有用于组合的内置函数时,Reduce() 最有用,例如从两个单词中保留较长的那个:
longer <- function(a, b) if (nchar(b) > nchar(a)) b else a
print(Reduce(longer, c("fig", "banana", "kiwi", "cherry")))输出:
[1] "banana"第三个参数 init 是起始值。它会用作第一个 acc,如果 x 为空,它也会作为结果:
print(Reduce(`+`, c(), 0))
print(Reduce(function(acc, w) paste0(acc, toupper(substr(w, 1, 1))), c("portable", "network", "graphics"), ""))输出:
[1] 0
[1] "PNG"accumulate = TRUE 会返回每个中间结果,而不只是最后一个结果,从而得到累计总额:
deposits <- c(100, -30, 50, -80)
print(Reduce(`+`, deposits, accumulate = TRUE))输出:
[1] 100 70 120 40挑战
简单完成 running_balance(start, changes)。从 start 开始,按顺序应用每项更改。每项更改后返回一行余额,after 1: 70,最后一行返回 lowest: ,后面跟上达到的最低余额(包括 start)。
提供的代码会读取起始余额和一行以逗号分隔的更改,并打印返回的每一行。
亲手试试
running_balance <- function(start, changes) {
# 在这里编写你的代码
character(0)
}
# 已提供的输入输出代码:保持原样
input <- suppressWarnings(readLines(file("stdin")))
cat(running_balance(as.numeric(input[1]), as.numeric(strsplit(input[2], ",")[[1]])), sep = "\n")
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: R 在线编译器