Реплицируйте список, чтобы создать список списков


Я пытаюсь создать список со следующей (вложенной) структурой:

l <- list()
for(i in seq(5)) l[[i]] <- list(a=NA,b=NA)
> str(l)
List of 5
 $ :List of 2
  ..$ a: logi NA
  ..$ b: logi NA
 $ :List of 2
  ..$ a: logi NA
  ..$ b: logi NA
 $ :List of 2
  ..$ a: logi NA
  ..$ b: logi NA
 $ :List of 2
  ..$ a: logi NA
  ..$ b: logi NA
 $ :List of 2
  ..$ a: logi NA
  ..$ b: logi NA

Я хотел бы сделать это через rep или аналогично, так как я создаю целую кучу пустых списков, которые я позже заполню. (Я знаю, что могу просто расширить список, обратившись к его следующему индексу, но это не работает при индексации на два уровня).

Я думал, что rep работает для этого, но это не похоже. ?rep приводит следующий пример:

fred <- list(happy = 1:10, name = "squash")
rep(fred, 5)

Который возвращает:

> str(rep(fred, 5))
List of 10
 $ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10
 $ name : chr "squash"
 $ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10
 $ name : chr "squash"
 $ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10
 $ name : chr "squash"
 $ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10
 $ name : chr "squash"
 $ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10
 $ name : chr "squash"

В другими словами, он выравнивает список.

Я также пробовал list( rep(fred,5) ), который также терпит неудачу.

Как мне скопировать список списков?

2 7

2 ответа:

Я думаю, что это имеет отношение к поведению репа, вы хотите гнездиться, прежде чем репа:

rep(list(fred),5)

Выход str:

List of 5
 $ :List of 2
  ..$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10
  ..$ name : chr "squash"
 $ :List of 2
  ..$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10
  ..$ name : chr "squash"
 $ :List of 2
  ..$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10
  ..$ name : chr "squash"
 $ :List of 2
  ..$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10
  ..$ name : chr "squash"
 $ :List of 2
  ..$ happy: int [1:10] 1 2 3 4 5 6 7 8 9 10
  ..$ name : chr "squash"

Вы можете использовать replicate:

l <- replicate(5, list(a=NA,b=NA), simplify=FALSE)