递归列表

Dam*_*ien 5 r

考虑以下代码:

b <- list(u=5,v=12)
c <- list(w=13)
a <- list(b,c)
Run Code Online (Sandbox Code Playgroud)

因此,a实际上是列表列表。当我致电a$b或时a$c,为什么NULL返回?同样,如果我呼叫a$ua$va$wNULL则返回。

以下内容之间也有区别:

c(list(a=1,b=2,c=list(d=5,e=9))) 
Run Code Online (Sandbox Code Playgroud)

c(list(a=1,b=2,c=list(d=5,e=9)), recursive=T)
Run Code Online (Sandbox Code Playgroud)

Ben*_*ker 4

索引运算符按名称$对列表进行索引。如果你想从未命名列表中获取第一个元素,你需要.aa[[1]]

您可以创建一个函数,在未指定名称的情况下自动添加名称,类似于data.frame工作方式(此版本是全有或全无 - 如果某些参数被命名,它将不会命名其余的未命名参数)。

nlist <- function(...) {
    L <- list(...)
    if (!is.null(names(L))) return(L)
    n <- lapply(match.call(),deparse)[-1]
    setNames(L,n)
}

b <- c <- d <- 1

nlist(b,c,d)
nlist(d=b,b=c,c=d)
Run Code Online (Sandbox Code Playgroud)

对于你的第二个问题,答案是“是”;你尝试过吗???

L <- list(a=1,b=2,c=list(d=5,e=9))
str(c(L)) 
## List of 3
##  $ a: num 1
##  $ b: num 2
##  $ c:List of 2
##   ..$ d: num 5
##   ..$ e: num 9
str(c(L,recursive=TRUE))
##  Named num [1:4] 1 2 5 9
##  - attr(*, "names")= chr [1:4] "a" "b" "c.d" "c.e"
Run Code Online (Sandbox Code Playgroud)

第一个是包含两个数值和一个列表的列表,第二个已被展平为命名的数值向量。