R:重新列出平面列表

Posted

技术标签:

【中文标题】R:重新列出平面列表【英文标题】:R: relisting a flat list 【发布时间】:2014-05-28 04:18:06 【问题描述】:

This question 有一个很好的扁平化列表解决方案,同时保留了它们的数据类型(unlist 没有):

flatten = function(x, unlist.vectors=F) 
    while(any(vapply(x, is.list, logical(1)))) 
        if (! unlist.vectors)
            x = lapply(x, function(x) if(is.list(x)) x else list(x))
        x = unlist(x, recursive=F)
    
    x

如果我给它下面的列表,它会按预期运行:

> a = list(c(1,2,3), list(52, 561), "a")
> flatten(a)
[[1]]
[1] 1 2 3

[[2]]
[1] 52

[[3]]
[1] 561

[[4]]
[1] "a"

现在我想重组像a 这样的平面列表。 relist 惨败:

> relist(flatten(a), skeleton=a)
[[1]]
[[1]][[1]]
[1] 1 2 3

[[1]][[2]]
[1] 52

[[1]][[3]]
[1] 561

[[2]]
[[2]][[1]]
[[2]][[1]][[1]]
[1] "a"

[[2]][[2]]
[[2]][[2]][[1]]
NULL

[[3]]
[[3]][[1]]
NULL

现在,我当然可以使用relist(unlist(b), a),但这会再次丢失数据类型。重组平面列表的好方法是什么?

如果正确处理与unlist.vectors 类似的属性,则会获得奖励积分。

【问题讨论】:

我想知道你为什么需要这个。 同上@Roland 的评论,另外建议查看rapply 我想要这样做的原因是对使用 BatchJobs 对列表列表进行操作的函数调用进行负载平衡。 rapply 将不起作用,因为它对待向量和列表相同。 往其他方向发展:1) 为什么不保持“扁平化”?重建原有结构有什么好处? 接受的答案here 适用于这个问题中的简化示例。 【参考方案1】:

一种方法是:

relist2 = function(x, like, relist.vectors=F) 
    if (! relist.vectors) 
        like = rapply(a, function(f) NA, how='replace')
    lapply(relist(x, skeleton=like), function(e) unlist(e, recursive=F))

这会保留类并区分列表和向量:

> relist2(flatten(a), like=a)
[[1]]
[1] 1 2 3

[[2]]
[[2]][[1]]
[1] 52

[[2]][[2]]
[1] 561

[[3]]
[1] "a"

> relist2(flatten(a, unlist.vectors=T), like=a, relist.vectors=T)
[[1]]
[1] 1 2 3

[[2]]
[[2]][[1]]
[1] 52

[[2]][[2]]
[1] 561

[[3]]
[1] "a"

【讨论】:

以上是关于R:重新列出平面列表的主要内容,如果未能解决你的问题,请参考以下文章

使用 Redux 添加更多数据时,带有分页结果的平面列表会导致重新渲染

使用 angularjs 列出重新排序动画

Djongo重新定义了ArrayModelField的结构

列出重新加载动画故障

如何处理非规范化数据以传递给平面列表?

为 R 中的列表长度分析重新组织数据集