大列表结构
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
的建议吗?
我尝试了 rapply
和 unlist
中的内容,然后在错误消息中没有任何变化。
这是一个听起来有点像您的示例结构:
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>
这是一个可重现的例子:
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
的建议吗?
我尝试了 rapply
和 unlist
中的内容,然后在错误消息中没有任何变化。
这是一个听起来有点像您的示例结构:
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>