遍历列表的子元素

Iterating through subelements of a list

我有一个要循环访问的列表:

library(RCurl)
data <- getURL("https://gist.githubusercontent.com/aronlindberg/b6b934b39e3c3378c3b2/raw/9b1efe9340c5b1c8acfdc90741260d1d554b2af0/data")
pull <- dget(textConnection(data))

我可以像这样访问单个元素:

pull$content[[1]]$filename

但我想访问所有元素(例如 [[2]]@filename[[3]]$filename 等)。我认为应该这样做:

n <- list(1:length(pull$content))
output <- list(1:length(n))
for (i in n){
  output[[i]] <- pull$content[[i]]$filename
}

但是,它 returns Error in pull$content[[n]] : recursive indexing failed at level 3

我做错了什么?我怎样才能 return 正确地列出列表?

提取所有 filename 值的更惯用的方法是

sapply(pull$content, "[[", "filename")

这是因为在大多数情况下

obj$prop
obj[["prop"]]

return 相同,但后一种形式允许您为要提取的值传递字符值,因为使用 $ 语法很难动态提取不同的值。所以基本上我们在每个 content 值上调用 [[ 提取函数并请求 filename 值。

但是由于您已将索引放入列表中,所以会生成您的特定错误消息

n <- list(1:length(pull$content))
length(n)
# [1] 1

请注意,这是一个长度为 1 的列表,其中包含向量 1:30。这意味着您的循环只会迭代一次,当它迭代时,i 将是 1:30。这意味着它将尝试做

pull$content[[1:30]]$filename

抛出递归索引错误。这是因为当您将向量传递给 [[ 时,它不会提取多个列表,而是下降列表列表以查找特定索引。例如

a <- list(list(9,list(list(7,6,list(4)), 8), 10))
a[[1]][[2]][[1]][[3]][[1]]
# [1] 4
a[[c(1,2,1,3,1)]]
# [1] 4

所以它需要 a 的第一个索引,然后是结果列表的第二个索引,然后是结果列表的第一个索引,等等。这就是 "recursive" 部分的形式.