2013-06-05 61 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

相关问题