Menu
CoddyTech

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
challenge icon

挑战

简单

完成 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")
quiz icon自我测试

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

逻辑与流程中的所有课

自己练习: R 在线编译器