Ответ 1
Ну, rep
работает (и "векторизован"), если вы просто переносите список в другой список...
x <- list(foo = "", bar = 0)
rep(list(x), 2)
Этот трюк также можно использовать для назначения NULL
элементу в списке:
x[2] <- list(NULL)
Это кажется легким (и, вероятно, это так), но, поскольку я - braindead, я готов попасть на стену стыда.
Как скопировать объект списка n
раз, и затем завершить его в списке? Что-то вроде этого:
list(foo = "", bar = 0)
чтобы получить:
list(
list(foo = "", bar = 0),
list(foo = "", bar = 0)
)
Ну, rep
работает (и "векторизован"), если вы просто переносите список в другой список...
x <- list(foo = "", bar = 0)
rep(list(x), 2)
Этот трюк также можно использовать для назначения NULL
элементу в списке:
x[2] <- list(NULL)
Вот двухстрочный скрипт, который делает то, что вы хотите:
el <- list(foo = "", bar = 0)
dups <- list(el)[rep(1,N)]
Обратите внимание, что это будет работать для ЛЮБОГО объекта "el", а не только для списка. Он использует трюк индексации списка, такого как вектор, с записью с одной скобкой [] (и повторяющимися индексами).
Иногда цикл является самым простым:
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
для каждого элемента и возвращайте переменную тривиально (используя сомнительные предположения о сфере видимости).
Возможно, replicate
? Что-то вроде:
L <- list(foo = "", bar = 0)
W <- replicate(10, L, FALSE)
Другая
lapply(1:n, function(x) list(foo = "", bar = 0))