2012-10-05 40 views
5

Estoy tratando de crear una lista con la siguiente estructura (anidada):Replicar una lista para crear una lista de listas

l <- list() 
for(i in seq(5)) l[[i]] <- list(a=NA,b=NA) 
> str(l) 
List of 5 
$ :List of 2 
    ..$ a: logi NA 
    ..$ b: logi NA 
$ :List of 2 
    ..$ a: logi NA 
    ..$ b: logi NA 
$ :List of 2 
    ..$ a: logi NA 
    ..$ b: logi NA 
$ :List of 2 
    ..$ a: logi NA 
    ..$ b: logi NA 
$ :List of 2 
    ..$ a: logi NA 
    ..$ b: logi NA 

me gustaría hacerlo a través de rep o similares, como lo Estoy creando un montón de listas en blanco que luego rellenaré (soy consciente de que puedo expandir una lista haciendo referencia a su siguiente índice, pero eso no funciona cuando indico dos profundidades).

Pensé que rep funcionaba para esto, pero parece que no. ?rep da el siguiente ejemplo:

fred <- list(happy = 1:10, name = "squash") 
rep(fred, 5) 

que devuelve:

> str(rep(fred, 5)) 
List of 10 
$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10 
$ name : chr "squash" 
$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10 
$ name : chr "squash" 
$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10 
$ name : chr "squash" 
$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10 
$ name : chr "squash" 
$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10 
$ name : chr "squash" 

En otras palabras, se aplana la lista.

También he intentado list(rep(fred,5)) que también falla.

¿Cómo puedo replicar una lista de listas?

Respuesta

8

Creo que esto tiene que ver con el comportamiento representante, que desee anidar antes de representante:

rep(list(fred),5) 

El str de salida:

List of 5 
$ :List of 2 
    ..$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10 
    ..$ name : chr "squash" 
$ :List of 2 
    ..$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10 
    ..$ name : chr "squash" 
$ :List of 2 
    ..$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10 
    ..$ name : chr "squash" 
$ :List of 2 
    ..$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10 
    ..$ name : chr "squash" 
$ :List of 2 
    ..$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10 
    ..$ name : chr "squash" 
+1

¿Es solo yo o es terriblemente no intuitivo? Gracias por la solución. –

+2

@ AriB.Friedman - Puede tener más sentido si compara 'rep (1: 2, 5)' y 'rep (lista (1: 2), 5)' teniendo en cuenta que una lista ** realmente es ** un tipo de vector. ¿Eso ayuda? –

+0

@ JoshO'Brien Sí, eso realmente. –

4

Usted puede utilizar replicate:

l <- replicate(5, list(a=NA,b=NA), simplify=FALSE) 
+0

¿Conoces una manera de replicar la estructura de un objeto existente? P.ej. Tengo una lista, que contiene varios niveles de anidamiento, me gustaría una versión vacía para almacenar resultados, usando los mismos nombres para cada elemento anidado. Tal vez haya una manera de eliminar todos los datos del objeto completo, dejando solo la estructura y los nombres de los elementos. –