R:重新列出非递归命名嵌套列表

R: Relisting non-recursive named nested lists

函数 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

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

这似乎有效并处理了 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)
}

使用非 递归 未列出的列表,您可以再次创建一个 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"