我有一个我要迭代的列表:
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
。
我做错了什么?如何正确返回列表?
答案 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; ;部分正在形成。