考虑到我有一个函数f(x,y)
,它有两个参数和两个列表
x_var = list('x','y','z')
y_var = list('a','b')
是否有purrr
函数允许我迭代x_var
中的一个元素和y_var
中的一个元素的每个组合?也就是说,执行f(x,a)
,f(x,b)
,f(y,a)
,f(y,b)
等。
通常的解决方案是写一个循环,但我想知道这里是否有更简洁(可能与purrr
。
谢谢!
答案 0 :(得分:10)
您可以使用其中一个cross*
功能以及map
:
map(cross2(x_var, y_var), unlist)
答案 1 :(得分:5)
基本R函数expand.grid
函数在这里工作
expand.grid(x=x_var, y=y_var) %>% {paste(.$x, .$y)}
答案 2 :(得分:4)
您可以将来电嵌套到map
library(purrr)
map(x_var, function(x) {
map(y_var, paste, x)
})
[[1]]
[[1]][[1]]
[1] "a x"
[[1]][[2]]
[1] "b x"
[[2]]
[[2]][[1]]
[1] "a y"
[[2]][[2]]
[1] "b y"
[[3]]
[[3]][[1]]
[1] "a z"
[[3]][[2]]
[1] "b z"
答案 3 :(得分:3)
如果x_var
和y_var
是原子向量或数组,并且函数返回已知长度的原子向量,则可以使用基本R函数outer
:
outer(x_var, y_var, FUN = f)
这将返回尺寸为c(dim(x_var), dim(y_var))
的数组。尺寸名称类似地组合在一起。例如:
x_var <- setNames(1:3, c("a", "b", "c"))
y_var <- setNames(4:5, c("d", "e"))
outer(x_var, y_var, '+')
# d e
# a 5 6
# b 6 7
# c 7 8