大清单的结构

时间:2015-03-20 16:38:58

标签: r list httr

这是一个可重复的例子:

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返回:错误:is.response(x)不为TRUE

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

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

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

我在rapplyunlist内尝试了内容,然后内容没有更改错误消息。

1 个答案:

答案 0 :(得分: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>