问题
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?
回答1:
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"
回答2:
You can use replicate
:
l <- replicate(5, list(a=NA,b=NA), simplify=FALSE)
来源:https://stackoverflow.com/questions/12747234/replicate-a-list-to-create-a-list-of-lists