【问题标题】:R: Relisting non-recursive named nested listsR:重新列出非递归命名嵌套列表
【发布时间】:2020-10-06 19:21:50
【问题描述】:

函数relist()(默认)在列表没有递归展平时不会重新列出。例如

> my_list=list(a=list(aa=c(1,2),ab=2),b=list(ba=1,bb=2))
> flat=unlist(as.relistable(my_list),recursive=FALSE)
Warning message:
In unlist.relistable(x, recursive, use.names) :
  relist() requires recursively unlisted objects.

>relist(flat)
$a
$a$aa
$a$aa[[1]]
[1] 1 2

$a$aa[[2]]
[1] 2

$a$ab
$a$ab[[1]]
[1] 1

$b
$b$ba
$b$ba[[1]]
[1] 2

$b$bb
$b$bb[[1]]
NULL

我想出了一个部分答案,似乎可行,但有更好更完整的方法吗?

【问题讨论】:

    标签: r list flatten


    【解决方案1】:

    使用您的非递归未列出列表,您可以再次创建unlist,并将存储的骨架用于relist

    relist(unlist(flat), attr(flat,"skeleton"))
    #$a
    #$a$aa
    #[1] 1 2
    #
    #$a$ab
    #[1] 2
    #
    #
    #$b
    #$b$ba
    #[1] 1
    #
    #$b$bb
    #[1] 2
    #
    #
    #attr(,"class")
    #[1] "relistable" "list"      
    

    【讨论】:

    • 好用或relist
    【解决方案2】:

    这似乎工作并处理 unlist() 的递归输出,它不是完全递归的(没有破坏数组或矩阵)

    my_relist <- function(x){
        y=list()
        x=as.list(x)
        for (name in names(x)){
            split=strsplit(name,'.',fixed=TRUE)[[1]]
            char='y'
            for (str in split){
                char=paste(char,'$',str,sep="")
            }
        char=paste(char,'= x[[name]]',sep="")
        eval(parse(text=char))
        }
        return(y)
    }
    

    【讨论】:

      猜你喜欢
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 2018-12-22
      • 2016-06-04
      • 2020-12-06
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多