2013-06-05 3 views
0

По сути, я хочу создать функцию, которая берет списки списков списков ... где в конечном итоге самые дальние вложенные списки будут иметь вектор как один элемент, а каждый список, вложенный в него, будет иметь вектор в качестве последнего элемента.Рекурсия в R, функция не работает и не знаю почему

Что я хочу, чтобы функция выполнялась, чтобы посмотреть на каждый из нижних уровней вложенных элементов и подсчитать, сколько их есть.

Например: 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) 
} 
+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

Смежные вопросы