返回函数
本课属于 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"挑战
简单完成 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 = "")
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: R 在线编译器