2015-03-20 4 views
1

Вот воспроизводимый пример:Структура большого списка

a <- list(list(LETTERS[1:3],LETTERS[1:3]),list(LETTERS[4:6])) 
a 
# [[1]] 
# [[1]][[1]] 
# [1] "A" "B" "C" 
# 
# [[1]][[2]] 
# [1] "A" "B" "C" 
# 
# [[2]] 
# [[2]][[1]] 
# [1] "D" "E" "F" 

Может кто-нибудь объяснить логику нумерации списка?

У меня есть очень большой список списков ... (223 глубокие), пример-глубоко:

[[1]] 
[[1]][[1]] 
[[1]][[1]][[1]] 
[[1]][[1]][[1]][[1]] 
[[1]][[1]][[1]][[1]][[1]] 
list() 

[[1]][[1]][[1]][[1]][[2]] 
[[1]][[1]][[1]][[1]][[2]][[1]] 
Response [https://api.livechatinc.com/v2/chats?/date_from=2014-03-22&page=1] 
Date: 2015-03-20 15:41 
Status: 200 
Content-Type: application/json; charset=utf-8 
Size: 166 kB 

вниз:

[[2]] 
[[2]][[1]] 
Response [https://api.livechatinc.com/v2/chats?/date_from=2014-03-22&page=5] 
Date: 2015-03-20 15:41 
Status: 200 
Content-Type: application/json; charset=utf-8 
Size: 133 kB 

И хотят извлечь содержимое с помощью HTTR-х функций контента , Использование lapply возвращается: Ошибка: is.response (х) не ИСТИНА

Единственный способ я знаю, чтобы получить доступ к каждому, чтобы позвонить каждый список непосредственно:

content(listName[[1]][[2]][[1]]) 

Любые предложения, как я могу назвать функцию content на каждом из них?

Я пробовал контент в пределах rapply, а также unlist, то контент без изменений в сообщении об ошибке.

+2

Может 'rapply' бы полезнее ...? – joran

+2

Или, возможно, использовать 'unlist'? –

+3

ставьте небольшой воспроизводимый пример, как структурирован ваш список? Все листы - это списки? –

ответ

0

Вот пример структуры, которая звучит вроде как ваша:

library("httr") 
u <- "http://www.google.com" 
g <- GET(u) 
a <- list() 
a[[1]] <- g 
a[[2]] <- list(g, g) 
a[[3]] <- list(g, list(g)) 
a[[4]] <- list(list(g, list(list(g, g)))) 
str(a, 1) 
# List of 4 
# $ :List of 9 
# ..- attr(*, "class")= chr "response" 
# $ :List of 2 
# $ :List of 2 
# $ :List of 1 

Вы можете написать функцию, которая или извлекает содержимое запроса или, если неприменимо, пытается рекурсивно извлечь содержимое из узлов ниже на дерево списка. Тогда lapply что функция в список:

extract <- function(x) { 
    if(inherits(x, "response")) { 
     return(content(x)) 
    } else if(length(x)){ 
     lapply(x, extract) # apply `extract` recursively 
    } 
} 

out <- unlist(lapply(a, extract)) 

Результат представляет собой список извлекаемого содержания:

str(out) 
# List of 8 
# $ :Classes 'HTMLInternalDocument', 'HTMLInternalDocument', 'XMLInternalDocument', 'XMLAbstractDocument' <externalptr> 
# $ :Classes 'HTMLInternalDocument', 'HTMLInternalDocument', 'XMLInternalDocument', 'XMLAbstractDocument' <externalptr> 
# $ :Classes 'HTMLInternalDocument', 'HTMLInternalDocument', 'XMLInternalDocument', 'XMLAbstractDocument' <externalptr> 
# $ :Classes 'HTMLInternalDocument', 'HTMLInternalDocument', 'XMLInternalDocument', 'XMLAbstractDocument' <externalptr> 
# $ :Classes 'HTMLInternalDocument', 'HTMLInternalDocument', 'XMLInternalDocument', 'XMLAbstractDocument' <externalptr> 
# $ :Classes 'HTMLInternalDocument', 'HTMLInternalDocument', 'XMLInternalDocument', 'XMLAbstractDocument' <externalptr> 
# $ :Classes 'HTMLInternalDocument', 'HTMLInternalDocument', 'XMLInternalDocument', 'XMLAbstractDocument' <externalptr> 
# $ :Classes 'HTMLInternalDocument', 'HTMLInternalDocument', 'XMLInternalDocument', 'XMLAbstractDocument' <externalptr> 
+0

Выглядит многообещающе - это не сработало на первом проходе, но я дам ему еще один выход и обратную связь (с первой недели выходной). Приветствия. – felixmc

+0

Я не использовал это, поскольку понял, что цикл вложенных циклов получит мои результаты, но я полагаю, что это Q & A стоит сохранить как достойный пример. – felixmc

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