将多个参数传递给 lapply 的 FUN
passing more than one argument to FUN of lapply
我的问题基于另一个类似的问题:
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)
Error in data.frame(res = c(a, b, a + b), text = c("a", "b", "total")): arguments imply differing number of rows: 7, 3
上述问题中的一个建议方法(参见 link)是使用 mapply
。这行得通,但是
returns a 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
在自定义函数中设置多个输入变量?
你可以这样做:
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)
which is a wrapper for mapply with SIMPLIFY = F
.
我的问题基于另一个类似的问题: 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)
Error in data.frame(res = c(a, b, a + b), text = c("a", "b", "total")): arguments imply differing number of rows: 7, 3
上述问题中的一个建议方法(参见 link)是使用 mapply
。这行得通,但是
returns a 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
在自定义函数中设置多个输入变量?
你可以这样做:
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)
which is a wrapper for mapply with SIMPLIFY = F
.