R中的递归,功能不起作用,不知道为什么

时间:2013-06-05 08:19:58

标签: r recursion

本质上,我想设计一个函数来获取列表的列表......其中最远的嵌套列表最终会有一个向量作为单个元素,而嵌入的每个列表都会有一个向量作为其最后一个元素。

我希望函数做的是查看每个最底层的嵌套元素并计算它们的数量。

例如:Say 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)
}

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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