Ari B. Friedman
Ari B. Friedman

Reputation: 72731

Replicate a list to create a list-of-lists

I am trying to create a list with the following (nested) structure:

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

I'd like to do this via rep or similar, as I'm creating a whole bunch of blank lists which I will later fill in. (I'm aware that I can just expand a list via referring to its next index, but that doesn't work when indexing two-deep).

I thought that rep worked for this, but it does not appear to. ?rep gives the following example:

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

Which returns:

> 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"

In other words, it flattens the list.

I've also tried list( rep(fred,5) ) which similarly fails.

How do I replicate a list-of-lists?

Upvotes: 16

Views: 5469

Answers (2)

Joshua Ulrich
Joshua Ulrich

Reputation: 176648

You can use replicate:

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

Upvotes: 5

Andy
Andy

Reputation: 4659

I think this has to do with rep behavior, you want to nest before you rep:

rep(list(fred),5)

The str output:

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"

Upvotes: 20

Related Questions