是否可以使用 outer() 生成笛卡尔积?

Is it possible to use outer() to generate a Cartesian product?

要在 R 中获得笛卡尔积,我们可以使用

library(tidyr)
x <- 1:2
y <- 1:3
expand_grid(x, y)

输出:

# A tibble: 6 x 2
      x     y
  <int> <int>
1     1     1
2     1     2
3     1     3
4     2     1
5     2     2
6     2     3

但我希望输出类似于矩阵,如:

outer(x, y, FUN = "+")

给出输出:

     [,1] [,2] [,3]
[1,]    2    3    4
[2,]    3    4    5

outer() 是否有 FUN = 会产生笛卡尔积:

           [,1]       [,2]       [,3]
[1,]    c(1, 1)    c(1, 2)    c(1, 3)
[2,]    c(2, 1)    c(2, 2)    c(2, 3)

expand_grid中没有FUN。一种选择是使用 mutate 创建一个新列,然后使用 pivot_wider

重塑回 'wide'
library(dplyr)
library(tidyr)
expand_grid(x, y) %>% 
     mutate(out = x + y) %>% 
     pivot_wider(names_from = y, values_from = out) %>%
     select(-x) %>%
     as.matrix %>% 
     `dimnames<-`(., NULL)

-输出

      [,1] [,2] [,3]
[1,]    2    3    4
[2,]    3    4    5

关于第二个问题,OP 似乎想将 matrix 的每个元素存储为 list

out1 <- outer(x, y, FUN = Vectorize(function(x, y) list(c(x, y))))

-输出

out1
     [,1]      [,2]      [,3]     
[1,] integer,2 integer,2 integer,2
[2,] integer,2 integer,2 integer,2