library(purrr)Warning: package 'purrr' was built under R version 4.3.2
numbers <- list(1, 2, 3, 4)
squares <- map(numbers, ~ .x ^ 2)
squares[[1]]
[1] 1
[[2]]
[1] 4
[[3]]
[1] 9
[[4]]
[1] 16
map函数通过对列表或原子向量的每个元素应用一个函数,并返回与输入长度相同的对象,来转换它们的输入。
map() 总是返回一个列表。如果需要返回与输入类型相同的对象,可以参考 modify() 系列函数。map_lgl(), map_int(), map_dbl() 和 map_chr() 返回指定类型的原子向量(如果无法完成则会出错)。对于这些函数,.f 必须返回适当类型的长度为1的向量。map_vec() 简化为输出的共同类型。它适用于大多数类型的简单向量,如Date、POSIXct、因子等。walk() 为了其副作用而调用 .f,并返回输入的 .x。map(.x, .f, ..., .progress = FALSE)
map_lgl(.x, .f, ..., .progress = FALSE)
map_int(.x, .f, ..., .progress = FALSE)
map_dbl(.x, .f, ..., .progress = FALSE)
map_chr(.x, .f, ..., .progress = FALSE)
map_vec(.x, .f, ..., .ptype = NULL, .progress = FALSE)
walk(.x, .f, ..., .progress = FALSE).x
一个列表或原子向量。
.f
以以下几种方式之一指定的函数:
mean。\(x) x + 1 或 function(x) x + 1。~ .x + 1。必须使用 .x 来引用第一个参数。仅在需要与R的旧版本兼容时推荐使用。"idx"、1 或 list("idx", 1),它们分别是 \(x) pluck(x, "idx")、\(x) pluck(x, 1) 和 \(x) pluck(x, "idx", 1) 的简写。如果索引元素为 NULL 或不存在,可以选择性地提供 .default 以设置默认值。...
传递给映射函数的额外参数。
我们现在通常不建议使用 ... 来传递 .f 的额外(常量)参数。相反,使用简写匿名函数:
# 代替
x |> map(f, 1, 2, collapse = ",")
# 使用:
x |> map(\(x) f(x, 1, 2, collapse = ",")).progress
是否显示进度条。使用 TRUE 打开基本进度条,使用字符串来命名,或查看 progress_bars 获取更多详情。
.ptype
如果为 NULL(默认值),输出类型是结果元素的共同类型。否则,提供一个”原型”以指定期望的输出类型。
输出的长度由输入的长度决定。输出的名称由输入的名称决定。输出类型由后缀决定:
.f() 可以返回任何内容。_lgl()、_int()、_dbl()、_chr() 分别返回逻辑向量、整数向量、双精度向量或字符向量;.f() 必须返回长度为1的兼容原子向量。_vec() 返回原子或S3向量,即 .f 返回的类型。.f 可以返回几乎任何类型的向量,只要其长度为1。walk() 返回输入的 .x(不可见)。这使得在管道中使用它变得容易。.f() 的返回值被忽略。.f 抛出的任何错误都会被封装在一个带有类 purrr_error_indexed 的错误中。
map_if() 用于仅对满足指定条件的 .x 的元素应用函数。
其他映射变体:imap(), lmap(), map2(), map_depth(), map_if(), modify(), pmap()
使用 map() 应用函数: 假设你有一个数字列表,你想计算每个数字的平方。使用 purrr 的 map() 函数可以轻松实现:
library(purrr)Warning: package 'purrr' was built under R version 4.3.2
numbers <- list(1, 2, 3, 4)
squares <- map(numbers, ~ .x ^ 2)
squares[[1]]
[1] 1
[[2]]
[1] 4
[[3]]
[1] 9
[[4]]
[1] 16
这段代码将对列表中的每个元素应用平方函数,并返回新的列表。
使用 map_dbl() 保持输出类型一致: 如果你希望输出的结果是一个双精度向量,可以使用 map_dbl():
squares_dbl <- map_dbl(numbers, ~ .x ^ 2)
squares_dbl[1] 1 4 9 16
这样可以确保输出结果是双精度向量,而不是列表。
使用 reduce() 合并数据: 假设你有多个向量,你想将它们合并为一个向量。使用 reduce() 函数可以轻松完成:
vectors <- list(c(1, 2), c(3, 4), c(5, 6))
combined <- reduce(vectors, c)
combined[1] 1 2 3 4 5 6
这段代码将所有向量合并为一个。
使用 map_if() 进行条件映射: 如果你只想对列表中满足特定条件的元素应用函数,可以使用 map_if():
mixed_list <- list(1, "a", 3, "b")
only_numbers_squared <- map_if(mixed_list, is.numeric, ~ .x ^ 2)
only_numbers_squared[[1]]
[1] 1
[[2]]
[1] "a"
[[3]]
[1] 9
[[4]]
[1] "b"
这段代码仅对列表中的数字元素应用平方函数。
通过这些示例可以看出,purrr 提供了一种灵活、直观的方式来处理列表和向量,特别是在需要对数据集的每个元素应用函数或条件逻辑时。这使得数据分析和处理更加高效和简洁。
devtools::session_info()─ Session info ───────────────────────────────────────────────────────────────
setting value
version R version 4.3.1 (2023-06-16 ucrt)
os Windows 11 x64 (build 22621)
system x86_64, mingw32
ui RTerm
language (EN)
collate Chinese (Simplified)_China.utf8
ctype Chinese (Simplified)_China.utf8
tz Asia/Hong_Kong
date 2023-11-12
pandoc 3.1.9 @ C:/Users/HANWAN~1/AppData/Local/Pandoc/ (via rmarkdown)
─ Packages ───────────────────────────────────────────────────────────────────
package * version date (UTC) lib source
cachem 1.0.8 2023-05-01 [1] CRAN (R 4.3.1)
callr 3.7.3 2022-11-02 [1] CRAN (R 4.3.1)
cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.1)
crayon 1.5.2 2022-09-29 [1] CRAN (R 4.3.1)
devtools 2.4.5 2022-10-11 [1] CRAN (R 4.3.2)
digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.1)
ellipsis 0.3.2 2021-04-29 [1] CRAN (R 4.3.1)
evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.1)
fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.1)
fs 1.6.3 2023-07-20 [1] CRAN (R 4.3.1)
glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.1)
htmltools 0.5.5 2023-03-23 [1] CRAN (R 4.3.1)
htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.1)
httpuv 1.6.11 2023-05-11 [1] CRAN (R 4.3.1)
jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.1)
knitr 1.43 2023-05-25 [1] CRAN (R 4.3.1)
later 1.3.1 2023-05-02 [1] CRAN (R 4.3.1)
lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.3.1)
magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.1)
memoise 2.0.1 2021-11-26 [1] CRAN (R 4.3.1)
mime 0.12 2021-09-28 [1] CRAN (R 4.3.0)
miniUI 0.1.1.1 2018-05-18 [1] CRAN (R 4.3.1)
pkgbuild 1.4.2 2023-06-26 [1] CRAN (R 4.3.1)
pkgload 1.3.2.1 2023-07-08 [1] CRAN (R 4.3.1)
prettyunits 1.1.1 2020-01-24 [1] CRAN (R 4.3.1)
processx 3.8.2 2023-06-30 [1] CRAN (R 4.3.1)
profvis 0.3.8 2023-05-02 [1] CRAN (R 4.3.1)
promises 1.2.0.1 2021-02-11 [1] CRAN (R 4.3.1)
ps 1.7.5 2023-04-18 [1] CRAN (R 4.3.1)
purrr * 1.0.2 2023-08-10 [1] CRAN (R 4.3.2)
R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.1)
Rcpp 1.0.11 2023-07-06 [1] CRAN (R 4.3.1)
remotes 2.4.2.1 2023-07-18 [1] CRAN (R 4.3.1)
rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.1)
rmarkdown 2.23 2023-07-01 [1] CRAN (R 4.3.1)
rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.1)
sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.1)
shiny 1.7.4.1 2023-07-06 [1] CRAN (R 4.3.1)
stringi 1.7.12 2023-01-11 [1] CRAN (R 4.3.0)
stringr 1.5.0 2022-12-02 [1] CRAN (R 4.3.1)
urlchecker 1.0.1 2021-11-30 [1] CRAN (R 4.3.1)
usethis 2.2.2 2023-07-06 [1] CRAN (R 4.3.1)
vctrs 0.6.3 2023-06-14 [1] CRAN (R 4.3.1)
xfun 0.39 2023-04-20 [1] CRAN (R 4.3.1)
xtable 1.8-4 2019-04-21 [1] CRAN (R 4.3.1)
yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)
[1] C:/Users/Han Wang/AppData/Local/R/win-library/4.3
[2] C:/Program Files/R/R-4.3.1/library
──────────────────────────────────────────────────────────────────────────────