Menu
CoddyTech

匿名函数

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

在 R 中,函数是一种值,就像数字或字符串一样。function(x) x * 2 会创建一个不带名称的函数,最后一个表达式的值就是它的返回值:

double <- function(x) x * 2
print(double(21))
print((function(x) x + 1)(9))

输出:

[1] 42
[1] 10

R 4.1 新增了一种简写形式:\(x) 和 function(x) 的意思相同。如果函数体需要写多行,就使用花括号:

square <- \(x) x^2
label <- function(x) {
  size <- if (x > 10) "big" else "small"
  paste(x, "is", size)
}
print(square(4))
print(label(12))

输出:

[1] 16
[1] "12 is big"

由于函数是值,列表可以用名称保存多个函数。ops[["inc"]] 是一个函数,所以 ops[["inc"]](5) 会调用它:

ops <- list(inc = \(x) x + 1, neg = \(x) -x)
print(ops[["inc"]](5))
print(names(ops))

输出:

[1] 6
[1] "inc" "neg"

函数可以接受多个参数,并为其中一些参数设置默认值,这与命名函数完全相同:

area <- \(w, h = w) w * h
print(area(3))
print(area(3, 5))

输出:

[1] 9
[1] 15
challenge icon

挑战

简单

用三个单参数匿名函数补全列表 ops:

  • double 返回参数乘以 2 的结果
  • square 返回参数与自身相乘的结果
  • negate 返回符号翻转后的参数

提供的代码会读取一个操作名称和一个数字,从 ops 中调用对应的函数,并打印结果。

亲手试试

ops <- list(
  # 在这里编写你的代码
  double = function(x) x
)

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

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

逻辑与流程中的所有课

自己练习: R 在线编译器