2011-12-06 12 views
23

Esto parece fácil (y probablemente lo es), pero dado que soy un cerebro muerto, estoy listo para entrar en el muro de la vergüenza.Repite el objeto de la lista n veces

Cómo copiar un objeto de lista n veces, y luego envíelo en una lista? Algo como esto:

list(foo = "", bar = 0) 

con el fin de obtener:

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


NOTA: para los bucles son considerados trampa

Respuesta

32

Bueno, rep obras (y es "vectorizada") si simplemente se coloca la lista en otra lista ...

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

Ese truco también se puede utilizar para asignar NULL a un elemento de una lista:

x[2] <- list(NULL) 
4

A veces un bucle es el más simple:

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

Si necesita nombres individuales, puede asignarlos a la vez con names(lx) <- ..., o bien crear la lista de uno vacío e indexar en ella para cada adición lx[[i]], que es menos eficiente que la preasignación.

Una forma un poco más complicado es lapply en un vector de longitud n:

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

sólo hay que poner en un maniquí j para cada elemento y volver la variable de forma trivial (utilizando suposiciones cuestionables sobre el ámbito de aplicación).

2

Tal vez replicate? Algo así como:

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

Aquí está una escritura de dos líneas que hace lo que quiere:

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

Tenga en cuenta que esto funcionará para cualquier objeto "el", no sólo una lista. Utiliza el truco de indexar una lista como un vector, con la notación de un solo paréntesis [] (e índices repetidos).

Cuestiones relacionadas