Повторите объект списка n раз - PullRequest
28 голосов
/ 07 декабря 2011

Это кажется легким (и, вероятно, так), но, поскольку я умник, я готов встать на стену позора.

Как скопировать объект списка n раза, а затем обернуть его списком? Примерно так:

list(foo = "", bar = 0)

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

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

<ч /> Примечание: за петли считаются читы

Ответы [ 4 ]

43 голосов
/ 07 декабря 2011

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

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

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

x[2] <- list(NULL)
11 голосов
/ 07 декабря 2011

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

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

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

4 голосов
/ 07 декабря 2011

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

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 для каждого элемента и верните свою переменную тривиально (используя сомнительные предположения о области действия).

2 голосов
/ 07 декабря 2011

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

L <- list(foo = "", bar = 0)
W <- replicate(10, L, FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...