Herhaal lijstobject n keer

Dit lijkt een makkelijke (en dat is het waarschijnlijk ook), maar omdat ik hersendraad ben, ben ik klaar om op de schande te gaan staan.

Hoe een lijstobject n tijden te kopiëren en daarna in een lijst te sluiten? Iets zoals dit:

list(foo = "", bar = 0)

om te krijgen:

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


NOTITIE: for loops are considered cheating

25

4 antwoord

Nou, rep werkt (en is "vectorized") als je de lijst eenvoudig in een andere lijst wikkelt ...

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

Die truc kan ook worden gebruikt om NULL toe te wijzen aan een element in een lijst:

x[2] <- list(NULL)
35
toegevoegd

Hier is een script met twee regels dat doet wat u wilt:

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

Merk op dat dit voor ELK object "el" zal werken, niet alleen een lijst. Het gebruikt de truc van het indexeren van een lijst zoals een vector, met single-bracket [] notatie (en herhaalde indexen).

9
toegevoegd

Soms is een lus de eenvoudigste:

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

If you need individual names you can allocate them at-once with names(lx) <- ..., or otherwise build the list from an empty one and index into it for each addition lx[[i]] - that is less efficient than pre-allocation.

Een iets lastiger manier is om een ​​vector met lengte n aan te lappen:

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

Voer eenvoudig een dummy j in voor elk element en retourneer uw variabele triviaal (met dubieuze aannames over het bereik).

4
toegevoegd

Misschien repliceren ? Zoiets als:

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