向lapply的FUN传递了不止一个论点

时间:2019-05-22 11:28:00

标签: r list dataframe lapply mapply

我的问题基于另一个类似的问题: 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-05-22创建


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

1 个答案:

答案 0 :(得分:2)

您可以这样做:

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

如果您想坚持地图绘制,可以这样做:

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

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

这是SIMPLIFY = F与mapply的包装。