Consider the following code:
b <- list(u=5,v=12)
c <- list(w=13)
a <- list(b,c)
So a is really a list of lists. When I call a$b
, or a$c
, why is NULL
returned? Likewise if I call a$u
, a$v
, or a$w
, NULL
is returned.
Also is there a difference between the following:
c(list(a=1,b=2,c=list(d=5,e=9)))
and
c(list(a=1,b=2,c=list(d=5,e=9)), recursive=T)
The $
indexing operator indexes the lists by name. If you want to get the first element from the unnamed list a
, you need a[[1]]
.
You can make a function that automatically adds names if they are not specified, similar to the way data.frame
works (this version is all-or-nothing -- if some arguments are named, it won't name the remaining, unnamed ones).
nlist <- function(...) {
L <- list(...)
if (!is.null(names(L))) return(L)
n <- lapply(match.call(),deparse)[-1]
setNames(L,n)
}
b <- c <- d <- 1
nlist(b,c,d)
nlist(d=b,b=c,c=d)
For your second question, the answer is "yes"; did you try it ???
L <- list(a=1,b=2,c=list(d=5,e=9))
str(c(L))
## List of 3
## $ a: num 1
## $ b: num 2
## $ c:List of 2
## ..$ d: num 5
## ..$ e: num 9
str(c(L,recursive=TRUE))
## Named num [1:4] 1 2 5 9
## - attr(*, "names")= chr [1:4] "a" "b" "c.d" "c.e"
The first is a list including two numeric values and a list, the second has been flattened into a named numeric vector.
For the first part of the question , we have in The R language definition document
The form using $ applies to recursive objects such as lists and pairlists. It allows only a literal character string or a symbol as the index. That is, the index is not computable: for cases where you need to evaluate an expression to find the index, use x[[expr]].
So you can change your a from a <- list(b,c)
to a <- list(b=b,c=c)
a$b = a[['b']] ## expression
$u
[1] 5
$v
[1] 12
For the second part of the question , you can try for example to apply the $
operator, to see the difference.
> kk <- c(list(a=1,b=2,c=list(d=5,e=9))) ## recursive objects
> hh <- c(list(a=1,b=2,c=list(d=5,e=9)), recursive=T) ## atomic objects
> kk$a
[1] 1
> hh$a
Error in hh$a : $ operator is invalid for atomic vectors
In reason we get a vector the from ?c for hh
If recursive = TRUE, the function recursively descends through lists (and pairlists) combining all their elements into a vector.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With