迭代列表的子元素

时间:2015-02-06 15:29:37

标签: r github

我有一个我要迭代的列表:

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
}

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

我做错了什么?如何正确返回列表?

1 个答案:

答案 0 :(得分:1)

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

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

这是因为在大多数情况下

obj$prop
obj[["prop"]]

返回相同的内容,但后一种形式允许您为要提取的值传递字符值,因为使用$语法动态提取不同的值更难。因此,基本上我们会在每个[[值上调用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的第一个索引,然后是结果列表的第二个索引,然后是结果列表的第一个索引,等等。&#34;递归&#34; ;部分正在形成。