Menu
CoddyTech

返回函数

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

函数也可以返回一个函数。make_multiplier(3)会返回一个新函数,将它的参数乘以 3:

make_multiplier <- function(n) {
  function(x) x * n
}
triple <- make_multiplier(3)
print(triple(5))
print(make_multiplier(10)(5))

输出:

[1] 15
[1] 50

返回的函数会记住创建它时使用的值。函数和它周围的变量结合在一起,称为闭包。每次调用创建函数都会生成一个独立的闭包:

make_greeter <- function(greeting) {
  function(name) paste0(greeting, ", ", name, "!")
}
hello <- make_greeter("Hello")
hola <- make_greeter("Hola")
print(hello("Ada"))
print(hola("Ada"))

输出:

[1] "Hello, Ada!"
[1] "Hola, Ada!"

工厂函数可以把几个设置转换成一个现成的工具,例如单位换算器:

make_converter <- function(factor, offset = 0) {
  function(x) x * factor + offset
}
c_to_f <- make_converter(1.8, 32)
km_to_miles <- make_converter(0.621)
print(c_to_f(100))
print(km_to_miles(10))

输出:

[1] 212
[1] 6.21

函数可以组合成新的函数。compose(f, g) 会返回一个先运行 f 再运行 g 的函数:

compose <- function(f, g) function(x) g(f(x))
clean <- compose(trimws, toupper)
print(clean("  hi there "))

输出:

[1] "HI THERE"
challenge icon

挑战

简单

完成 make_formatter(prefix, digits)。它会返回一个函数,该函数接收一个数字,并返回 prefix 后接保留 digits 位小数的数字:make_formatter("$", 2)(3.5) 会返回 $3.50。

sprintf("%.*f", digits, x) 会将 x 格式化为保留 digits 位小数的数字。

提供的代码会读取前缀、小数位数以及以逗号分隔的数字列表。它会创建一个格式化函数,并为每个数字打印格式化结果。

亲手试试

make_formatter <- function(prefix, digits) {
  # 在这里编写你的代码
  function(x) ""
}

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

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

逻辑与流程中的所有课

自己练习: R 在线编译器