【问题标题】:Using outer to produce an array of lists使用外部生成列表数组
【发布时间】: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 正在尝试使我的列表变平,而我希望它们完好无损。似乎没有用于控制此的参数(与sapplysimplify 不同)。你会提出什么建议?我唯一的要求是至少保留两个维度以用于索引目的。

【问题讨论】:

  • 这对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 两者都很好。你知道为什么这个看似多余的listc 包装器会改变outer 的行为吗?
  • @tonytonov outer 输出是一个矩阵,其维数等于两个向量长度的乘积。即这里的25。当我们使用list(x=1, y=1) 时,它的长度为 2,对于所有组合,长度将为 50。因此,您需要将其包装成 25。list 会将其包装在 25 的列表中跨度>

标签: arrays r list


【解决方案1】:

你可以试试

outer(1:5, 1:5, Vectorize(function(x,y) list(c(x=x, y=y))))

输出一个包含 25 个元素的列表,每个元素都是一个命名向量

或另一种选择是将其包装在“列表”中以创建列表列表。

outer(1:5, 1:5, Vectorize(function(x,y) list(list(x=x, y=y)))) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-15
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 2017-03-05
    • 2020-01-12
    相关资源
    最近更新 更多