2011-12-06 10 views
23

Questo sembra un compito facile (e probabilmente lo è), ma dal momento che sono braindead, sono pronto a salire sul muro della vergogna.Repeat list object n times

Come copiare un oggetto di elenco n volte e ricomporlo in un elenco in seguito? Qualcosa di simile a questo:

list(foo = "", bar = 0) 

al fine di ottenere:

list(
    list(foo = "", bar = 0), 
    list(foo = "", bar = 0) 
    ) 


NOTA: cicli for sono considerati barare

risposta

32

Beh, rep opere (ed è "vettorizzati") se semplicemente avvolgere la lista in un altro elenco ...

x <- list(foo = "", bar = 0) 
rep(list(x), 2) 

Questo trucco può anche essere utilizzato per assegnare NULL ad un elemento in un elenco:

x[2] <- list(NULL) 
4

A volte un ciclo è il più semplice:

x <- list(foo = "", bar = 0) 
lx <- vector("list", 2) 
for (i in 1:length(lx)) lx[[i]] <- x 

Se sono necessari singoli nomi, è possibile assegnarli contemporaneamente con names(lx) <- ... oppure creare l'elenco da uno vuoto e indicizzarlo per ogni aggiunta. lx[[i]] - meno efficiente della pre-allocazione.

Un modo un po 'più complicato è quello di lapply su un vettore di lunghezza n:

lapply(1:2, function(j) x) 

appena messo in un manichino j per ogni elemento e tornare la variabile banalmente (sulla base di ipotesi discutibili sulla portata).

2

Forse replicate? Qualcosa di simile:

L <- list(foo = "", bar = 0) 
W <- replicate(10, L, FALSE) 
8

Ecco uno script di due righe che fa quello che si vuole:

el <- list(foo = "", bar = 0) 
dups <- list(el)[rep(1,N)] 

Si noti che questo funziona per qualsiasi oggetto "el", non solo una lista. Utilizza il trucco di indicizzare un elenco come un vettore, con notazione a parentesi singola [] e indici ripetuti.

Problemi correlati