Как именовать списки под списком при использовании lapply?

У меня есть два вложенных цикла, которые я хочу сделать с помощью lapply вместо циклов for. Я составил следующий простой пример:

a<-as.list(c(1,2))  
b<-as.list(c(6,7))  
results<-lapply(a, function(x) lapply(b, function(y) x+y))

> results  
[[1]]  
[[1]][[1]]  
[1] 7  

[[1]][[2]]  
[1] 8  


[[2]]  
[[2]][[1]]  
[1] 8

[[2]][[2]]  
[1] 9

как я могу присвоить имена этому списку, я могу присвоить имена первому уровню, используя имена (результат)‹-a, но я не знаю, как это сделать для второго уровня. Именование должно выполняться в цикле, так как в моей основной программе длина b может измениться. Я ценю, если кто-нибудь может дать мне подсказку.


person newbie    schedule 10.07.2015    source источник


Ответы (1)


Вы должны отметить, что lapply() сам по себе является просто оболочкой для хорошо построенного цикла for(), поэтому вы не получаете никакой эффективности, возможно, просто удобочитаемости. Кроме того, самый простой подход — добавить имена в списки, входящие в ваши вложенные вызовы lapply():

a<-as.list(c(1,2))
b<-as.list(c(6,7)) 
names(a) <- c("a","b")
names(b) <- c("c", "d")
results<-lapply(a, function(x) lapply(b, function(y) x+y))

Этот подход дает:

> results
$a
$a$c
[1] 7

$a$d
[1] 8


$b
$b$c
[1] 8

$b$d
[1] 9

Конечно, вы можете переименовать вложенные компоненты следующим образом:

> names(results$a) <- c("e","f")
> results$a
$e
[1] 7

$f
[1] 8
person Forrest R. Stevens    schedule 10.07.2015
comment
Спасибо за комментарий. Я хочу поместить имена (b) ‹-c (c, d) в lapply. Как я могу это сделать? Я не уверен, как я должен включить это в lapply - person newbie; 10.07.2015
comment
Можете ли вы объяснить, почему, или улучшить приведенный выше пример в отношении того, что вы действительно хотите увидеть в результате? - person Forrest R. Stevens; 11.07.2015
comment
@newbie, возможно, вам следует подумать о том, чтобы назвать b при его создании, иначе трудно понять, что вы хотели бы улучшить, без лучшего рабочего примера. - person MichaelChirico; 11.07.2015