I come from a Python background but have to learn R for a job, and I am confused about lists.
I understand named lists can be (roughly) equivalent to Python dictionaries, and I can look up elements either by index using example_list[[1]]
or example_list$name
if I know the name of the key.
example_list <- list(a=1, b=3, c="d", f=list(1:4))
example_list$c #"d"
example_list$f #[[1]] [1] 1 2 3 4
example_list$f[[1]] # [1] 1 2 3 4
example_list[["f"]][[1]][[1]] # [1] 1
When I was playing around, I noticed to get "1" from f
, I had to use [[1]]
twice? I was expecting f
to be [1, 2, 3, 4]
but it seems to be [[1,2,3,4]]
, am I understanding this correctly?
Keep in mind the distinction in R between lists and vectors. In R, 1:4
is a vector. list(1:4)
is a list of length 1 that contains a vector of length 4. as.list(1:4)
is a list of length 4 where each element contains a vector of length 1.
Consider these alternatives
example_list <- list(a=1, b=3, c="d", f=1:4)
example_list[["f"]][1]
# [1] 1
example_list$f[1]
# [1] 1
or
example_list <- list(a=1, b=3, c="d", f=as.list(1:4))
example_list$f[[1]]
# [1] 1
example_list[["f"]][[1]]
# [1] 1
or
example_list <- list(a=1, b=3, c="d", f=list(1,2,3,4))
example_list$f[[1]]
# [1] 1
example_list[["f"]][[1]]
# [1] 1
In your case you added an extra level of nesting with the list()
call which you wouldn't normally use if just storing a vector. list(1:4)
is different than list(1,2,3,4)
If it makes it easier to understand, you can also look at the JSON representation to see the extra layer of nesting
example_list <- list(a=1, b=3, c="d", f=list(1:4))
jsonlite::toJSON(example_list, auto_unbox = TRUE)
# {"a":1,"b":3,"c":"d","f":[[1,2,3,4]]}