2013-06-05 59 views
0

本質上,我想設計一個函數,該函數使用列表的列表...其中最遠的嵌套列表將具有一個向量作爲單個元素,並且每個它的嵌套列表將有一個向量作爲它的最後一個元素。在R中遞歸,函數不工作,不知道爲什麼

我想要的功能是查看每個最底層的嵌套元素並計算其中有多少。例如:假設A是16個向量的列表,B是10個向量的列表,C是12個向量的列表,並且D是8個向量的列表。 X是包含A,B和向量的列表,Y是包含C,D和向量的列表。 Z是X,Y和一個向量的列表。

該函數需要Z,並給出46(16 + 10 + 12 + 8)的輸出。

這是我現在使用的代碼:

listreader <- function(listoflists) 
{ 
    nlist = listoflists 
    ini = 0 
    its = 0 
    if(length(nlist) > 1) 
    { 
    for (i in 1:(length(nlist))) 
    { 
     listreader(nlist[[i]]) 
    } 
    } 
    else 
    { 
    ini = ini+1 
    } 
    return(ini) 
} 
+1

ITYM遞歸,而不是迴歸。 –

+1

你能詳細闡述一下爲什麼你想這樣做嗎?我有一種感覺,列表的列表等只有一個元素在每個樹分支結束並不是最好的解決方案,但我可能是錯的。此外,讓你的例子可重現也會有很大幫助。 –

+0

你可以添加一個可重複的例子,特別是澄清你的意思是「向量列表」,或者至少添加'str(your_list'來獲取你的數據結構。 – agstudy

回答

3

如果我理解正確的話,只不包含列表應該貢獻自己的長度,以總名單。這似乎工作:

v <- 1:10        # a vector 
A <- replicate(16, v, simplify = FALSE) # a list of vectors 
B <- replicate(10, v, simplify = FALSE) # a list of vectors 
C <- replicate(12, v, simplify = FALSE) # a list of vectors 
D <- replicate(8, v, simplify = FALSE) # a list of vectors 
X <- list(A, B, v)      # a mixed list 
Y <- list(C, D, v)      # a mixed list 
Z <- list(X, Y, v)      # a mixed list 

listreader <- function(x) { 
    if (is.list(x)) { 
    if (!any(sapply(x, is.list))) { 
     return(length(x)) # list of vectors 
    } else { 
     return(sum(sapply(x, listreader))) # recursion 
    } 
    } else { 
    return(0L) # not a list 
    } 
} 

listreader(Z) 
# [1] 46 
+0

我認爲我的問題是我沒有添加遞歸值,我只是讓它返回,但是這樣做也是一樣的。謝謝你! – riders994

1
sum(rapply(Z, function(x){1})) 
+0

+1 - 智能但不是:OP數據中的列表項(鬆散向量)不應該被計數看到他的例子,我再現了你得到了49,我得到了46 – flodel

+0

是的,我在OP的第二次閱讀中看到了這一點;) – user1609452

相關問題