2013-01-02 52 views
4

考虑下面的代码:递归列出

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

因此,一个确实是一个列表的列表。当我拨打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

你可以试试'a < - list(b = b,c = c)'。你可以做'一个$ b'和'一个$ c'。 –

+3

由于显而易见的原因,您应该避免创建列表对象“c”。 –

回答

4

$索引操作符的索引列表。如果您想从未命名列表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" 

首先是包括两个数值和列表的列表,该第二已平坦化到名为数值向量。

+0

但是,它们似乎基本上是相同的东西,只是名称不同。 – Damien

+0

不,第二个已经变平:尝试'str'来查看结构(依靠印刷表示总是危险的......) –

3

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

使用$形式适用于递归的对象,如列表和成对列表 。它只允许一个文字字符串或一个符号作为索引号 。也就是说,索引是不可计算的:对于其中 需要评估表达式以查找索引的情况,请使用x [[expr]]。

所以,你可以改变你的距离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 

在原因,我们得到HH

如果递归= TRUE,则函数递归地列出 (成对列表和)下降结合他们的所有元素为载体的载体从?(3)