[R] Help needed understanding eval,quote,expression

Joerg van den Hoff j.van_den_hoff at fz-rossendorf.de
Thu Jun 29 10:48:05 CEST 2006


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']])

joerg



More information about the R-help mailing list