大列表结构

Structure of large list

这是一个可重现的例子:

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 深),示例 5 深:

[[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 returns:错误:is.response(x) 不是 TRUE

我知道访问每个列表的唯一方法是直接调用每个列表:

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

有什么关于如何在每个函数上调用函数 content 的建议吗?

我尝试了 rapplyunlist 中的内容,然后在错误消息中没有任何变化。

这是一个听起来有点像您的示例结构:

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>