[R] Help needed understanding eval,quote,expression

Prof Brian Ripley ripley at stats.ox.ac.uk
Thu Jun 29 11:06:50 CEST 2006


On Thu, 29 Jun 2006, Joerg van den Hoff wrote:

> Prof Brian Ripley wrote:
>> You are missing eval(parse(text=)). E.g.
>> 
>>> x <- list(y=list(y1="hello",y2="world"),z=list(z1="foo",z2="bar"))
>> (what do you mean by the $ at the start of these lines?)
>>> eval(parse(text="x$y$y1"))
>> [1] "hello"
>> 
>> However, bear in mind
>> 
>>> fortune("parse")
>> 
>> If the answer is parse() you should usually rethink the question.
>>     -- Thomas Lumley
>>        R-help (February 2005)
>> 
>> In your indicated example you could probably use substitute() as 
>> effectively.
>> 
>> 
>> On Wed, 28 Jun 2006, toby_marks at americancentury.com wrote:
>> 
>>> I am trying to build up a quoted or character expression representing a
>>> component in a list  in order to reference it indirectly.
>>> For instance, I have a list that has data I want to pull, and another list
>>> that has character vectors and/or lists of characters containing the names
>>> of the components in the first list.
>>> 
>>> It seems that the way to do this is as evaluating expressions, but I seem
>>> to be missing something.  The concept should be similar to the snippet
>>> below:
>>> 
>>> 
>>> For instance:
>>> 
>>> $x = list(y=list(y1="hello",y2="world"),z=list(z1="foo",z2="bar"))
>>> $y = quote(x$y$y1)
>>> $eval(y)
>>> [1] "hello"
>>> 
>>> 
>>> but, I'm trying to accomplish this by building up y as a character and
>>> then evaluating it, and having no success.
>>> 
>>> $y1=paste("x$y$","y1",sep="")
>>> $y1
>>> [1] "x$y$y1"
>>> 
>>> 
>>> How can I evaluate y1 as I did with y previously?  or can I?
>>> 
>>> 
>>> Much Thanks !
>>> 
>>> 
>
> if I understand you correctly you can achieve your goal much easier than with 
> eval, parse, substitute and the like:
>
> x <- list(y=list(y1="hello",y2="world"),z=list(z1="foo",z2="bar"))
>
> s1 <- 'y'
> s2 <- 'y1'
>
> x[[s1]][[s2]]
>
> i.e. using `[[' instead of `$' for list component extraction allows to use 
> characters for indexing (in other words: x$y == x[['y']])


But what he actually asked for was

>>> I am trying to build up a quoted or character expression representing a
>>> component in a list  in order to reference it indirectly.

You just typed in x[[s1]][[s2]], not 'built [it] up'.  Suppose the 
specification had been

r <- "x"
s <- c("y", "y1")

and s was of variable length?  Then you need to construct a call similar 
to x[["y"]][["y1"]] from r and s.

[There was another reason for sticking with $ rather than using [[: the 
latter makes unnecessary copies in released versions of R.]


-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



More information about the R-help mailing list