2013-01-02 51 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)