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

관련 문제