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