展平递归嵌套列表结构

时间:2013-11-06 04:40:42

标签: r list foreach

在编写foreach循环时,我犯了一个愚蠢的错误。循环的每次迭代都返回一个矩阵,除了我给它参数.combine=list

library(foreach)
nested <- foreach(i = 1:4, .combine=list) %do% {
  matrix(i, 2, 2)
}

结果是一个递归嵌套的列表结构:nested[[2]]给我第四个矩阵,nested[[1]][[2]]给我第三个矩阵,nested[[1]][[1]][[2]]给我第二个矩阵,最后{{1}给我第一个矩阵:

nested[[1]][[1]][[1]]

这是一个小例子来展示我的问题是什么样的;我的实际结果是一个更深层嵌套的列表。如果没有> nested [[1]] [[1]][[1]] [[1]][[1]][[1]] [,1] [,2] [1,] 1 1 [2,] 1 1 [[1]][[1]][[2]] [,1] [,2] [1,] 2 2 [2,] 2 2 [[1]][[2]] [,1] [,2] [1,] 3 3 [2,] 3 3 [[2]] [,1] [,2] [1,] 4 4 [2,] 4 4 参数再次运行我的foreach循环,是否有一种简单的方法可以将其展平为单个列表,其中每个元素都是一个矩阵?

1 个答案:

答案 0 :(得分:1)

我遇到了一个名为LinearizeNestedList的函数和saved it as a Gist

它听起来像你想要的那样:

## Make sure you are using the development version of "devtools"
## devtools::install_github("devtools")

library(devtools)
source_gist("https://gist.github.com/mrdwab/4205477")
# Sourcing https://gist.github.com/mrdwab/4205477/raw/1bd86c697b89de9941834882f1085c8312076e38/LinearizeNestedList.R
# SHA-1 hash of file is dde479195258dbad9367274ceedbd5a68251478a
LinearizeNestedList(nested)
# $`1/1/1`
#      [,1] [,2]
# [1,]    1    1
# [2,]    1    1
# 
# $`1/1/2`
#      [,1] [,2]
# [1,]    2    2
# [2,]    2    2
# 
# $`1/2`
#      [,1] [,2]
# [1,]    3    3
# [2,]    3    3
#
# $`2`
#      [,1] [,2]
# [1,]    4    4
# [2,]    4    4