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
______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.