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