遍历列表的子元素
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" 部分的形式.
我有一个要循环访问的列表:
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" 部分的形式.