R-两个向量的外积,使用自定义FUN返回列表

时间:2019-01-17 14:27:06

标签: r vector

我有两个序列,我正在尝试使用外部联接来合并,但返回列表

例如

s1 <- seq(1,3)
s2 <- seq(4,6)

并且我试图以这样一个列表矩阵结尾:

c(1,4)c(2,4)c(3,4)
c(1,5)c(2,5)c(3,5)
c(1,6)c(2,6)c(3,6)

所以我试图将外部乘积函数与自定义函数一起使用

listify <- function(a,b){
   lst <- cbind(a,b)
 }

outer(h1,h2,FUN = "listify")

这应该可以执行我想要的操作,但是我似乎无法使其正常工作。我已经读过这个question,它暗示了cbind的用法,但是正如我所说,我没有得到任何结果。我刚得到一个错误:

Error in dim(robj) <- c(dX, dY) : 
  dims [product 121] do not match the length of object [242]

1 个答案:

答案 0 :(得分:1)

我可以很接近(或者一直到那边?)(a)使您的函数返回list,并(b)将其向量化。来自?outer

  

FUN ...必须是向量化函数(或名称),至少要有两个参数,并返回与第一个(和第二个)长度相同的值。

listify <- function(a,b){
   list(a,b)
}

lv = Vectorize(listify)

s1 <- seq(1,3)
s2 <- seq(4,6)

result = t(outer(s1,s2,FUN = lv))
result
#      [,1]      [,2]      [,3]     
# [1,] Integer,2 Integer,2 Integer,2
# [2,] Integer,2 Integer,2 Integer,2
# [3,] Integer,2 Integer,2 Integer,2

result[1, 1]
# [[1]]
#      a b
# [1,] 1 4

result[2, 1]
# [[1]]
#      a b
# [1,] 1 5

请注意,矩阵的每个元素都是长度为1的列表。

正如评论中指出的那样,没有更多信息,我看不到将这些单元素列表放在矩阵中的任何优势。大型expand.grid表或3维数组似乎都可能更易于使用。