Повторить объект списка n раз

Это кажется легким (и, вероятно, это так), но, поскольку я - braindead, я готов попасть на стену стыда.

Как скопировать объект списка n раз, и затем завершить его в списке? Что-то вроде этого:

list(foo = "", bar = 0)

чтобы получить:

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


ПРИМЕЧАНИЕ: для петель считаются обманчивыми

Ответ 1

Ну, rep работает (и "векторизован"), если вы просто переносите список в другой список...

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

Этот трюк также можно использовать для назначения NULL элементу в списке:

x[2] <- list(NULL)

Ответ 2

Вот двухстрочный скрипт, который делает то, что вы хотите:

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

Обратите внимание, что это будет работать для ЛЮБОГО объекта "el", а не только для списка. Он использует трюк индексации списка, такого как вектор, с записью с одной скобкой [] (и повторяющимися индексами).

Ответ 3

Иногда цикл является самым простым:

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

Если вам нужны отдельные имена, вы можете выделить их один раз с names(lx) <-... или иначе построить список из пустого и проиндексировать его для каждого добавления lx[[i]] - это менее эффективно чем предварительное распределение.

Несколько более сложным способом является привязка к вектору длины n:

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

Просто вставьте фиктивный j для каждого элемента и возвращайте переменную тривиально (используя сомнительные предположения о сфере видимости).

Ответ 4

Возможно, replicate? Что-то вроде:

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

Ответ 5

Другая

lapply(1:n, function(x) list(foo = "", bar = 0))