[R] strange list structure question

Deepayan Sarkar deepayan.sarkar at gmail.com
Tue Nov 4 04:22:55 CET 2008


On 11/3/08, markleeds at verizon.net <markleeds at verizon.net> wrote:
> my problem is more complex than below but I think below can suffice. i have
> a list and the name of it at the top level is GGG.  so, if i do an lapply
> and operate on lower components in the sublist, then I can do as shown in
> EXAMPLE 1 and what will come back will be named GGG at the top level.
>
>  but, suppose that , the function inside the lapply function was more
> complex and i wanted to actually use "GGG" in the function but also return
> it at the top level. I can't figure a way to do both things:
>
>  A) return the name GGG  from the lapply
>
>  and
>
>  B) use the name GGG  in the function that is called inside the lapply ?
>
>  Thanks for any suggestions on doing both ? I always think that I understand
> lists and then I always end up finding a new problem that i hadn't seen
> before.
>
>
>  # EXAMPLE ONE
>
>  dummylist <- list(list(x=1,y=2,z=3))
>  names(dummylist) <- "GGG"
>  print(dummylist)
>  print(str(dummylist))
>
>  # THIS RETURNS THE NAME GGG AT THE TOP LEVEL
>  one <- lapply(dummylist, function(.sublist) {
>         lapply(1:3, function(.index) {  # could use a for loop here or
> whatever. it doesn't matter
>                .sublist[[.index]] + 2
>              })
>       })
>
>  print(one)
>  print(str(one))
>  print(names(one))
>
>  # EXAMPLE TWO
>
>  # THIS LETS ME USE THE NAME BUT THEN IT DOESN"T GET RETURNED
>  two <- lapply(1:length(dummylist[[1]]),function(.index) {
>              temp <- dummylist[[1]][[.index]] + 2
>              names(temp) <- names(dummylist)   # DUMB USAGE JUST TO SHOW
> USAGE
>              temp
>            })

Why not add

names(two) <- names(dummylist)

after this step? You cannot really expect lapply to magically figure
out that it should take the names of the result from what is an
essentially arbitrary object in the context of the lapply call.

If you are happy with your first approach as long as you have the
top-level name available inside your function, you could pass that as
an extra argument:

one <- lapply(dummylist,
     function(.sublist, .name) {
       lapply(1:3, function(.index) {
              temp <- .sublist[[.index]] + 2
              names(temp) <- .name
              temp
            })
     }, .name = names(dummylist))

-Deepayan



More information about the R-help mailing list