将嵌套列表转换为一维列表。

7
我得到了以下的嵌套列表:

y

x1=c(12,54,2)
x2=c(2,88,1)
x3=c(4,8)

y=list()
y[[1]]=x1
y[[2]]=list(x2,x3)

y
[[1]]
[1] 12 54  2

[[2]]
[[2]][[1]]
[1]  2 88  1

[[2]][[2]]
[1] 4 8

我希望提取嵌套列表中的所有元素,并将它们放入一个单层列表中,因此我的预期结果应该是:
y_one_level_list
[[1]]
[1] 12 54  2

[[2]]
[1]  2 88  1

[[3]]
[1] 4 8

显然我的实际问题涉及更深层嵌套的列表,你会如何解决它?我尝试了rapply但失败了。


1
使用 这个 - d.b
@d.b 很遗憾,我确实查看了这篇帖子,但它并没有产生预期的结果。 - hans glick
1
@d.b 是的,你的第一篇帖子确实有效!!非常感谢!! - hans glick
这些解决方案也可以工作,并更好地保留了我的数据结构。 - Simone
2个回答

19

尝试将 lapply rapply 结合使用:

lapply(rapply(y, enquote, how="unlist"), eval)

#[[1]]
#[1] 12 54  2

#[[2]]
#[1]  2 88  1

#[[3]]
#[1] 4 8

对于更深层的列表也不起作用。


1
太棒了,这也可以实现,更加优雅的方式,谢谢。 - hans glick
优秀的解决方案!FYI。https://www.r-bloggers.com/rapply-function-explanation-and-examples/ - Grec001
eval 在结尾处是做什么的? - WestCoastProjects
一些解释也会很好。@989中的enquoteeval是什么? - PM0087
?enquote states that: enquote is a simple one-line utility which transforms a call of the form Foo(....) into the call quote(Foo(....)). Then, eval(quote(c(4,8))), for instance, returns a vector containing 4,8 - 989
谢谢。其他的solutions对我没有用。 - Simone

8
您可以尝试以下方法:
flatten <- function(lst) {
    do.call(c, lapply(lst, function(x) if(is.list(x)) flatten(x) else list(x)))
}

flatten(y)

#[[1]]
#[1] 12 54  2

#[[2]]
#[1]  2 88  1

#[[3]]
#[1] 4 8

1
有趣,我认为这个更简单。 - WestCoastProjects

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接