Вы можете использовать семейство функций cross
, например, cross_df
, чтобы сгенерировать набор списков продуктов в ситуациях, когда вы хотите выполнить итерацию по всем комбинациям.Это позволяет затем использовать map
функции как обычно:
library(tidyverse)
myfun = function(a,b){
return(a*b)
}
xvalues = c(1,2,3)
yvalues = c(10,20,30,40)
cross_df(list(x = xvalues, y = yvalues)) %>%
mutate(z = map2_dbl(x, y, myfun))
#> # A tibble: 12 x 3
#> x y z
#> <dbl> <dbl> <dbl>
#> 1 1 10 10
#> 2 2 10 20
#> 3 3 10 30
#> 4 1 20 20
#> 5 2 20 40
#> 6 3 20 60
#> 7 1 30 30
#> 8 2 30 60
#> 9 3 30 90
#> 10 1 40 40
#> 11 2 40 80
#> 12 3 40 120
Конечно, в этом случае myfun
векторизовано, поэтому использование map
не совсем необходимо.
cross_df(list(x = xvalues, y = yvalues)) %>%
mutate(z = myfun(x, y))
#> # A tibble: 12 x 3
#> x y z
#> <dbl> <dbl> <dbl>
#> 1 1 10 10
#> 2 2 10 20
#> 3 3 10 30
#> 4 1 20 20
#> 5 2 20 40
#> 6 3 20 60
#> 7 1 30 30
#> 8 2 30 60
#> 9 3 30 90
#> 10 1 40 40
#> 11 2 40 80
#> 12 3 40 120
Создано в 2019-06-28 пакетом Представ (v0.3.0)