2012-06-23 2 views
3

У меня есть список со списками как записи, например, так:рекурсивно извлечение объектов в Вернах в списке

A <- list(scores1 = list(a = "a", b = "b"), scores2 = list(a = "c", b = "d"), scores3 = list(a = "e", b = "f")) 
B <- list(scores1 = list(a = "aa", b = "bb"), scores2 = list(a = "cc", b = "dd"), scores3 = list(a = "ee", b = "ff")) 
C <- list(scores1 = list(a = "aaa", b = "bbb"), scores2 = list(a = "ccc", b = "ddd"), scores3 = list(a = "eee", b = "fff")) 
ABC <- list(A, B, C) 

я могу получить элементы scores1 следующим образом:

a1 <- lapply(ABC, "[", "scores1") 

, который дает мне

[[1]] 
[[1]]$scores1 
[[1]]$scores1$a 
[1] "a" 

[[1]]$scores1$b 
[1] "b" 

[[2]] 
[[2]]$scores1 
[[2]]$scores1$a 
[1] "aa" 

[[2]]$scores1$b 
[1] "bb" 

[[3]] 
[[3]]$scores1 
[[3]]$scores1$a 
[1] "aaa" 

[[3]]$scores1$b 
[1] "bbb" 

Теперь, что я действительно хочу, это то, что находится в объектах «a», поэтому я ищу вызов, который дает мне

"a" 
"aa" 
"aaa" 

Я могу сделать это в цикле, но это кажется довольно неэффективным. Как я могу извлечь эти значения? Я попытался

lapply(lapply(ABC, "[", "scores1"), "[", "a") 

но возвращает только

[[1]] 
[[1]]$<NA> 
NULL 

[[2]] 
[[2]]$<NA> 
NULL 

[[3]] 
[[3]]$<NA> 
NULL 

Что такое правильный способ сделать это?

ответ

4

Я думаю, что вы столкнулись с разницей между «[» и «[[". Используя «[[», вы получите содержимое элементов, проиндексированных «score1», а не подписок. Затем вы можете получить доступ к содержимому элементов с именем «a»:

a1 <- lapply(ABC, "[[", "scores1") 
sapply(a1, "[[", "a") 
#[1] "a" "aa" "aaa" 
+0

отличное, именно то, что мне нужно, спасибо за помощь и объяснение, это правильно! –

Смежные вопросы