将多个参数传递给 lapply 的 FUN

Posted

技术标签:

【中文标题】将多个参数传递给 lapply 的 FUN【英文标题】:passing more than one argument to FUN of lapply 【发布时间】:2019-05-22 11:27:59 【问题描述】:

我的问题建立在另一个类似的问题之上: passing several arguments to FUN of lapply (and others *apply)

我有一个创建data.frame 的自定义函数。目标是为每个新输入变量检索data.frames 列表(我想对几个输入变量进行排序以创建新的data.frames)。

如果只有一个输入变量发生变化,我可以做到我想要的:

fn <- function(a, b)
        data.frame(res = c(a, b, a + b),
                   text = c("a", "b", "total"))

fn(1, 2)
#>   res  text
#> 1   1     a
#> 2   2     b
#> 3   3 total

lapply(1:3, FUN = fn, b = 1)
#> [[1]]
#>   res  text
#> 1   1     a
#> 2   1     b
#> 3   2 total
#> 
#> [[2]]
#>   res  text
#> 1   2     a
#> 2   1     b
#> 3   3 total
#> 
#> [[3]]
#>   res  text
#> 1   3     a
#> 2   1     b
#> 3   4 total

但是,一旦我也更改了第二个输入变量 (b),我就会收到一条错误消息。

lapply(1:3, FUN = fn, b = 1:3)

data.frame(res = c(a, b, a + b), text = c("a", "b", "total")) 中的错误:参数暗示不同的行数:7、3

上述问题(见链接)中的建议方法是使用mapply。这有效,但是 返回一个matrix,我将其解释为列表列表(如果我错了,请纠正我)。

x <- mapply(fn, b = 1:3, a = 1:3)
x
#>      [,1]      [,2]      [,3]     
#> res  Integer,3 Integer,3 Integer,3
#> text factor,3  factor,3  factor,3

要获得我想要的data.frames 列表,我可以再次使用apply

apply(x, 2, data.frame)
#> [[1]]
#>   res  text
#> 1   1     a
#> 2   1     b
#> 3   2 total
#> 
#> [[2]]
#>   res  text
#> 1   2     a
#> 2   2     b
#> 3   4 total
#> 
#> [[3]]
#>   res  text
#> 1   3     a
#> 2   3     b
#> 3   6 total

由reprex package (v0.2.1) 于 2019 年 5 月 22 日创建


问题:有没有办法避免 mapply 后跟 apply 在自定义函数中设置多个输入变量?

【问题讨论】:

【参考方案1】:

你可以这样做:

library(purrr)

map2(1:3, 1:3, fn)

[[1]]
  res  text
1   1     a
2   1     b
3   2 total

[[2]]
  res  text
1   2     a
2   2     b
3   4 total

[[3]]
  res  text
1   3     a
2   3     b
3   6 total

如果你想坚持使用 mapply,你可以这样做:

x <- mapply(fn, b = 1:3, a = 1:3, SIMPLIFY = F)

x <- Map(fn, b = 1:3, a = 1:3)

这是一个带有SIMPLIFY = F的mapply包装器。

【讨论】:

以上是关于将多个参数传递给 lapply 的 FUN的主要内容,如果未能解决你的问题,请参考以下文章

将参数传递给R中的多个match_fun函数fuzzyjoin::fuzzy_join

如何将多个重复的参数传递给 CUDA 内核

将多个参数传递给后端 API reactjs

如何将带有 args 的成员函数作为参数传递给另一个成员函数?

在 extjs MVC 架构中如何将参数传递给函数

回调函数