【问题标题】:Why does foreach combine with cbind on one element return a vector not a matrix? [closed]为什么 foreach 在一个元素上与 cbind 结合返回向量而不是矩阵? [关闭]
【发布时间】:2026-01-20 00:55:01
【问题描述】:
foreach(i=seq_len(1), .combine = cbind) %do% c(1,2,3)

给出数字向量c(1,2,3),而为了与其他序列长度保持一致,它应该给出一个 3x1 矩阵。特别是

cbind( c(1,2,3) )

给出一个矩阵,而不是一个向量。为什么是这样?

【问题讨论】:

  • 感谢那些将其标记为主要基于意见的人的建设性批评,而不是最初的两个没有说明他们为什么投反对票的反对票。我已经编辑了这个问题,希望对您有所帮助。

标签: r foreach


【解决方案1】:

抱歉,这可能应该是评论而不是答案,但我还不能评论,所以在这里解决您的问题。我会说这不是一个错误。 foreach 中的 cbind 正在做一些不同的事情。它结合了迭代之间的结果,但你的原始语句中只有一个,所以没有什么可以 cbind。

foreach(i=seq_len(1), .combine = 'cbind') %dopar% c(1,2,3)

产生你的结果:

[1] 1 2 3

但如果迭代不止一次,

foreach(i=seq_len(2), .combine = 'cbind') %dopar% c(1,2,3)

     result.1 result.2
[1,]        1        1
[2,]        2        2
[3,]        3        3

在迭代之间与 cbind 正确组合。如果你绝对必须在一轮中,那么 cbind 将不得不进入语句

foreach(i=seq_len(1)) %dopar% cbind( c(1,2,3) )
[[1]]
     [,1]
[1,]    1
[2,]    2
[3,]    3

请注意,根据文档,结果以列表形式返回。

【讨论】:

  • 感谢您的回答。我知道如果序列长于长度 1,我会得到一个矩阵。我的实际问题是,这是一个序列长度不同的内部循环:按照目前的工作方式,我必须将 length==1 作为特殊情况处理。
  • NP。明白了。那么讨厌。是的,为特殊情况包装一个条件是我能想到的唯一选择——据我所知,没有与 drop=F 类型的参数等效的迭代间
  • 是的,它让我想起了 drop=F 的很多问题。即使这不是很令人满意,我也给了你一个赞成,因为你费心去看它,而不是仅仅反对这个问题(不管那是谁!)。
最近更新 更多