# [R] access elements of a named list using a factor

Uwe Ligges ligges at statistik.tu-dortmund.de
Sat Oct 24 18:45:16 CEST 2009

```Robin, see below my inserted comments.

Robin Hankin wrote:
> Hello Dimitris
>
> thanks for this.   It works!  I guess I was fixated on the dollar sign.
>
> I must confess that I don't really understand any of the error
> messages below.  Can anyone help me interpret them?
>
> rksh
>
>
>
> Dimitris Rizopoulos wrote:
>> do you mean:
>>
>> f <- factor(c("pigs", "pigs", "slugs"))
>> jj <- list(pigs = 1:10, slugs = 1:3)
>>
>> jj[levels(f)[1]]
>> jj[[levels(f)[1]]]
>>
>>
>> Best,
>> Dimitris
>>
>>
>> Robin Hankin wrote:
>>> Hi
>>>
>>> I have a factor 'f' and a named list 'jj'.
>>>
>>> I want names(jj) to match up with levels(f).
>>>
>>> How do I use levels(f) to access elements of jj?
>>>
>>>
>>>  > f <- factor(c("pigs","pigs","slugs"))
>>>  > f
>>> [1] pigs  pigs  slugs
>>> Levels: pigs slugs
>>>  >
>>>  > jj <- list(pigs=1:10,slugs=1:3)
>>>
>>>
>>>
>>> My attempts to produce jj\$pigs all give errors:
>>>
>>>  > jj\$levels(f)[1]
>>> Error: attempt to apply non-function

jj\$levels(f): R's guess is that you want to apply some function
jj\$levels to f. Since jj\$levels is NULL, it is not a function and R
responds with the messages of the "attempt to apply a non-function".

>>>  > do.call("\$",jj,levels(f)[1])
>>> Error in if (quote) { : argument is not interpretable as logical

That's right: ?do.call tells us about the usage:
do.call(what, args, quote = FALSE, envir = parent.frame())

hence you asked to apply the function what = "\$" on the arguments given
in list  args = jj  (i.e. first arg is first element of jj and second
arg is second element of jj) and you wanted to use quote = levels(f)[1].

If you had rather used teh ugly

do.call("\$", list(jj,levels(f)[1]))

it should have work (all argumentes in a list). Dimitris already gave
the answer how to do it much better.

>>>  >  "\$"(jj,levels(f)[1])
>>> Error in jj\$levels(f)[1] : invalid subscript type 'language'

Here the call is constructed using levels(f)[1] rather than its value again.

Best wishes,
Uwe

>>>
>>>
>>>
>>>
>>>
>>
>
>

```