当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R purrr lmap 将函数应用于列表的列表元素


lmap()lmap_at()lmap_if()map()map_at()map_if() 类似,只不过它们不是映射到 .x[[i]] ,而是映射到 .x[i]

这有几个优点:

  • 它使得使用专门使用列表的函数成为可能。

  • 它允许 .f 访问封装列表的属性,如 names()

  • 它允许 .f 返回比它接收到的更大或更小的列表,从而更改输出的大小。

用法

lmap(.x, .f, ...)

lmap_if(.x, .p, .f, ..., .else = NULL)

lmap_at(.x, .at, .f, ...)

参数

.x

列表或 DataFrame 。

.f

一个函数,它接受一个长度为 1 的列表并返回一个列表(任意长度)。

...

传递给映射函数的附加参数。

我们现在通常建议不要使用 ... 将附加(常量)参数传递给 .f 。相反,使用简写匿名函数:

# Instead of
x |> map(f, 1, 2, collapse = ",")
# do:
x |> map(\(x) f(x, 1, 2, collapse = ","))

这使得更容易理解哪些参数属于哪个函数,并且往往会产生更好的错误消息。

.p

单个谓词函数、说明此类谓词函数的公式或与 .x 长度相同的逻辑向量。或者,如果 .x 的元素本身是对象列表,则为指示内部列表中逻辑元素名称的字符串。只有.p 计算结果为TRUE 的元素才会被修改。

.else

应用于 .x 元素的函数,其中 .p 返回 FALSE

.at

给出要选择的元素的逻辑向量、整数向量或字符向量。或者,函数接受名称向量,并返回要选择的元素的逻辑向量、整数向量或字符向量。

[Deprecated]:如果安装了 tidyselect 软件包,则可以使用vars()和 tidyselect 帮助器来选择元素。

列表或 DataFrame ,匹配 .x 。对于长度没有任何保证。

也可以看看

其他Map变体: imap()map2()map_depth()map_if()map()modify()pmap()

例子

set.seed(1014)

# Let's write a function that returns a larger list or an empty list
# depending on some condition. It also uses the input name to name the
# output
maybe_rep <- function(x) {
  n <- rpois(1, 2)
  set_names(rep_len(x, n), paste0(names(x), seq_len(n)))
}

# The output size varies each time we map f()
x <- list(a = 1:4, b = letters[5:7], c = 8:9, d = letters[10])
x |> lmap(maybe_rep) |> str()
#> List of 6
#>  $ b1: chr [1:3] "e" "f" "g"
#>  $ b2: chr [1:3] "e" "f" "g"
#>  $ b3: chr [1:3] "e" "f" "g"
#>  $ c1: int [1:2] 8 9
#>  $ c2: int [1:2] 8 9
#>  $ d1: chr "j"

# We can apply f() on a selected subset of x
x |> lmap_at(c("a", "d"), maybe_rep) |> str()
#> List of 4
#>  $ b : chr [1:3] "e" "f" "g"
#>  $ c : int [1:2] 8 9
#>  $ d1: chr "j"
#>  $ d2: chr "j"

# Or only where a condition is satisfied
x |> lmap_if(is.character, maybe_rep) |> str()
#> List of 5
#>  $ a : int [1:4] 1 2 3 4
#>  $ b1: chr [1:3] "e" "f" "g"
#>  $ b2: chr [1:3] "e" "f" "g"
#>  $ c : int [1:2] 8 9
#>  $ d1: chr "j"
源代码:R/lmap.R

相关用法


注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Apply a function to list-elements of a list。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。