0

从本质上讲,我想设计一个函数,该函数采用...列表的列表,其中最终最远的嵌套列表将有一个向量作为单个元素,并且它嵌套的每个列表都将有一个向量作为其最后一个元素。

我想要这个函数做的是查看每个最底层的嵌套元素并计算有多少。

例如:假设 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)
}
4

2 回答 2

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
于 2013-06-05T10:26:59.410 回答
1
sum(rapply(Z, function(x){1}))
于 2013-06-05T10:46:44.970 回答