这是一个可重复的例子:
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
的任何建议吗?
我在rapply
和unlist
内尝试了内容,然后内容没有更改错误消息。
答案 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>