【发布时间】:2015-04-02 09:55:47
【问题描述】:
我在一个返回列表的函数上运行outer,我希望它返回一个列表数组,因为文档是这样说的:
数组 X 和 Y 的外积是数组 A 的维数 c(dim(X), dim(Y)) 其中元素 A[c(arrayindex.x, arrayindex.y)] = FUN(X[arrayindex.x], Y[arrayindex.y], ...).
但是,下面的代码会抛出错误:
outer(1:5, 1:5, Vectorize(function(x, y) list(x=x, y=y)))
#Error in outer(1:5, 1:5, Vectorize(function(x, y) list(x = x, y = y))) :
# dims [product 25] do not match the length of object [50]
似乎outer 正在尝试使我的列表变平,而我希望它们完好无损。似乎没有用于控制此的参数(与sapply 的simplify 不同)。你会提出什么建议?我唯一的要求是至少保留两个维度以用于索引目的。
【问题讨论】:
-
这对
outer(1:5, 1:5, Vectorize(function(x,y) list(c(x=x, y=y))))有帮助吗?或者可能是outer(1:5, 1:5, Vectorize(function(x,y) list(list(x=x, y=y)))) -
这是什么语言?
-
@akrun 两者都很好。你知道为什么这个看似多余的
list或c包装器会改变outer的行为吗? -
@tonytonov
outer输出是一个矩阵,其维数等于两个向量长度的乘积。即这里的25。当我们使用list(x=1, y=1)时,它的长度为 2,对于所有组合,长度将为 50。因此,您需要将其包装成 25。list会将其包装在 25 的列表中跨度>