R语言匿名函数 #
一、匿名函数概述 #
匿名函数是没有名称的函数,通常用于一次性操作或作为参数传递。
二、基本语法 #
2.1 传统匿名函数 #
r
function(x) x ^ 2
(function(x) x ^ 2)(5)
2.2 R 4.1+ 简写语法 #
r
\(x) x ^ 2
(\(x) x ^ 2)(5)
三、在apply函数中使用 #
3.1 sapply #
r
x <- 1:10
sapply(x, function(i) i ^ 2)
sapply(x, \(i) i ^ 2)
3.2 lapply #
r
my_list <- list(a = 1:5, b = 6:10, c = 11:15)
lapply(my_list, function(x) mean(x))
lapply(my_list, \(x) mean(x))
3.3 apply #
r
m <- matrix(1:12, nrow = 3, ncol = 4)
apply(m, 1, function(row) sum(row))
apply(m, 1, \(row) sum(row))
四、在向量操作中使用 #
4.1 条件转换 #
r
x <- c(10, 20, 30, 40, 50)
sapply(x, function(i) if (i > 25) i * 2 else i)
4.2 字符串处理 #
r
names <- c("张三", "李四", "王五")
sapply(names, function(name) paste("Hello,", name))
4.3 复杂计算 #
r
x <- 1:10
sapply(x, function(i) {
if (i %% 2 == 0) {
i ^ 2
} else {
sqrt(i)
}
})
五、多参数匿名函数 #
5.1 使用mapply #
r
x <- c(1, 2, 3)
y <- c(10, 20, 30)
mapply(function(a, b) a + b, x, y)
mapply(\(a, b) a + b, x, y)
5.2 使用Map #
r
x <- c(1, 2, 3)
y <- c(10, 20, 30)
Map(function(a, b) a * b, x, y)
Map(\(a, b) a * b, x, y)
5.3 使用outer #
r
x <- 1:3
y <- 1:3
outer(x, y, function(a, b) a + b)
outer(x, y, \(a, b) a + b)
六、在purrr包中使用 #
6.1 map函数 #
r
library(purrr)
x <- list(a = 1:5, b = 6:10)
map(x, function(x) mean(x))
map(x, \(x) mean(x))
map_dbl(x, \(x) mean(x))
6.2 map2函数 #
r
library(purrr)
x <- list(1, 2, 3)
y <- list(10, 20, 30)
map2(x, y, function(a, b) a + b)
map2(x, y, \(a, b) a + b)
6.3 pmap函数 #
r
library(purrr)
params <- list(
a = c(1, 2, 3),
b = c(10, 20, 30),
c = c(100, 200, 300)
)
pmap(params, function(a, b, c) a + b + c)
pmap(params, \(a, b, c) a + b + c)
七、匿名函数与管道 #
7.1 使用管道符 #
r
library(magrittr)
1:10 %>%
sapply(function(x) x ^ 2) %>%
sum()
1:10 %>%
sapply(\(x) x ^ 2) %>%
sum()
7.2 原生管道符 #
r
1:10 |>
(\(x) x ^ 2)() |>
sum()
1:10 |>
(\(x) mean(x[x > 5]))()
八、实践示例 #
8.1 数据标准化 #
r
normalize <- function(data) {
sapply(data, function(x) {
(x - min(x)) / (max(x) - min(x))
})
}
df <- data.frame(
a = c(10, 20, 30, 40, 50),
b = c(100, 200, 300, 400, 500)
)
normalize(df)
8.2 批量文件处理 #
r
files <- c("file1.csv", "file2.csv", "file3.csv")
lapply(files, function(f) {
if (file.exists(f)) {
read.csv(f)
} else {
NULL
}
})
8.3 分组统计 #
r
data <- data.frame(
group = c("A", "A", "B", "B", "A"),
value = c(10, 20, 30, 40, 50)
)
tapply(data$value, data$group, function(x) {
c(mean = mean(x), sd = sd(x))
})
8.4 自定义聚合 #
r
aggregate_data <- function(data, group_var, value_var, func) {
tapply(data[[value_var]], data[[group_var]], func)
}
aggregate_data(data, "group", "value", mean)
aggregate_data(data, "group", "value", \(x) quantile(x, 0.75))
九、总结 #
本章学习了:
- 匿名函数的基本语法
- R 4.1+ 的简写语法 \
- 在apply函数族中使用
- 多参数匿名函数
- 在purrr包中使用
- 与管道操作结合
匿名函数是函数式编程的重要工具,使代码更加简洁!
最后更新:2026-03-27