2012-10-05 6 views
5

Je suis en train de créer une liste avec la structure suivante (imbriquée):Répliquer une liste pour créer une liste-of-listes

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 

Je voudrais le faire via rep ou similaire, comme je Je crée tout un tas de listes vierges que je vais remplir plus tard. (Je suis conscient que je peux simplement développer une liste en se référant à son index suivant, mais cela ne fonctionne pas lors de l'indexation de deux profondeurs).

Je pensais que rep travaillé pour cela, mais il ne semble pas. ?rep donne l'exemple suivant:

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

qui retourne:

> 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 d'autres termes, il aplatit la liste.

J'ai également essayé list(rep(fred,5)) qui échoue également.

Comment répliquer une liste de listes?

Répondre

8

Je pense que cela a à voir avec le comportement de représentant, vous voulez nid avant rep:

rep(list(fred),5) 

La sortie str:

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

Est-ce juste moi ou est-ce horriblement non-intuitif? Merci pour la solution. –

+2

@ AriB.Friedman - Cela peut être plus logique si vous comparez rep (1: 2, 5) 'et' rep (list (1: 2), 5) 'en gardant à l'esprit qu'une liste ** est vraiment ** un type de vecteur. Est ce que ça aide? –

+0

@ JoshO'Brien Ouais, c'est vrai. –

4

Vous pouvez utiliser replicate:

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

Connaissez-vous un moyen de répliquer la structure d'un objet existant? Par exemple. J'ai une liste, qui contient plusieurs niveaux d'imbrication, je voudrais une version vide pour stocker les résultats, en utilisant les mêmes noms pour chaque élément imbriqué. Peut-être existe-t-il un moyen de supprimer toutes les données de l'objet entier, en ne laissant que la structure et les noms de ses éléments? –

Questions connexes