递归列表

时间:2013-01-02 14:26:14

标签: r

请考虑以下代码:

b <- list(u=5,v=12)
c <- list(w=13)
a <- list(b,c)

所以a实际上是一个列表列表。当我致电a$ba$c时,为什么NULL会被退回?同样,如果我致电a$ua$va$w,则会返回NULL

以下内容之间也存在差异:

c(list(a=1,b=2,c=list(d=5,e=9))) 

c(list(a=1,b=2,c=list(d=5,e=9)), recursive=T)

2 个答案:

答案 0 :(得分:4)

$索引运算符通过 name 为列表编制索引。如果您想从未命名列表a获取第一个元素,则需要a[[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)

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

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"

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

答案 1 :(得分:3)

对于问题的第一部分,we have in The R language definition document

  

使用$的表单适用于递归对象,例如列表和   成对列表。它只允许文字字符串或符号   指数。也就是说,索引是不可计算的:对于你的情况   需要评估表达式以找到索引,使用x [[expr]]。

因此,您可以将a从a <- list(b,c)更改为a <- list(b=b,c=c)

 a$b =  a[['b']]   ## expression 
$u
[1] 5

$v
[1] 12

对于问题的第二部分,您可以尝试应用$运算符,以查看差异。

> kk <- c(list(a=1,b=2,c=list(d=5,e=9)))              ## recursive objects
> hh <- c(list(a=1,b=2,c=list(d=5,e=9)), recursive=T) ## atomic objects
> kk$a
[1] 1
> hh$a
Error in hh$a : $ operator is invalid for atomic vectors

我们得到一个向量来自?c的hh

  

如果recursive = TRUE,则函数以递归方式下降到列表中   (和pairlists)将所有元素组合成一个向量。