包含点的嵌套列表的名称(例如“c.2)

seq*_*oia 8 r list

如何获取嵌套列表(包含数据框)的叶子的名称

p <- list(a=1,b=list(b1=2,b2=3),c=list(c1=list(c11='a',c12='x'),c.2=data.frame("t"=1)))
Run Code Online (Sandbox Code Playgroud)

成矢量格式:

[[1]]
[1] "a"
[[2]]
[1] "b" "b1"
[[3]]
[1] "b" "b2"
[[4]]
[1] "c" "c1" "c11"
[[5]]
[1] "c" "c1" "c12"
[[6]]
[1] "c" "c.2"
Run Code Online (Sandbox Code Playgroud)

问题是我的列表包含带点的名称(例如“c.2”)。通过使用 unlist,一个 get"c.c.2"并且我(或可能strsplit)无法判断该点是 unlist 的分隔符还是名称的一部分。这就是这个问题的不同之处。

它应该忽略 data.frames。到目前为止,我的方法是从这里改编的,但在以下方面遇到了困难unlist

listNames = function(l, maxDepth = 2) {
  n = 0
  listNames_rec = function(l, n) {
    if(!is.list(l) | is.data.frame(l) | n>=maxDepth) TRUE
    else { 
      n = n + 1
      # print(n)
      lapply(l, listNames_rec, n)
    }
  }
  n = names(unlist(listNames_rec(l, n)))
  return(n)
}
listNames(p, maxDepth = 3)
[1] "a"        "b.b1"     "b.b2"     "c.c1.c11" "c.c1.c12" "c.c.2"  
Run Code Online (Sandbox Code Playgroud)

GKi*_*GKi 2

一种方法可能是:

listNames = function(l, n, N) {
  if(!is.list(l) | is.data.frame(l) | n<1) list(rev(N))
  else unlist(Map(listNames, l, n=n-1, N=lapply(names(l), c, N)), FALSE, FALSE)
}

listNames(p, 3, NULL)
#[[1]]
#[1] "a"
#
#[[2]]
#[1] "b"  "b1"
#
#[[3]]
#[1] "b"  "b2"
#
#[[4]]
#[1] "c"   "c1"  "c11"
#
#[[5]]
#[1] "c"   "c1"  "c12"
#
#[[6]]
#[1] "c"   "c.2"
Run Code Online (Sandbox Code Playgroud)