[R] expressions (nesting, substitution, 2-stage evaluation)

David Winsemius dwinsemius at comcast.net
Fri Feb 28 07:20:21 CET 2014


On Feb 27, 2014, at 9:55 PM, Bert Gunter wrote:

> 1. I don't think this is the right way to go about this. I would think
> about making pieces of your title arguments and assembling them in
> your call.
> 
> ... But be that as it may...
> 
> 2. The problem is that in your loop, ii is already an expression -- a
> language object. Pasting to it is meaningless.  So you need to deparse
> it first to a character string and paste to that. Then parse the
> result:
> 
> vectorA <- c( quote(TNF-*alpha), quote(IFN-*gamma) )
> 
> for(ii in vectorA)  {
>   plot(0:1,0:1)
>  ex <- paste("abcd*~~",deparse(ii),sep="")
>   title(main = (parse(text=ex)))
> }
> 
> 
> 3. There may well be more elegant ways to do this. But discovering
> them exceeds my capabilities.
> 

What about just using `substitute`?

vectorA = c( bquote("TNF-"*alpha), bquote("IFN-"*gamma) )

for(ii in vectorA)  {
   plot(0:1,0:1)
   title(main = substitute("asdfsadf"*x, list(x=ii)) )
}

-- 
David.

> 
> Cheers,
> Bert
> 
> Bert Gunter
> Genentech Nonclinical Biostatistics
> (650) 467-7374
> 
> "Data is not information. Information is not knowledge. And knowledge
> is certainly not wisdom."
> H. Gilbert Welch
> 
> 
> 
> 
> On Thu, Feb 27, 2014 at 5:37 PM, Daryl Morris <darylm at uw.edu> wrote:
>> Hi,
>> 
>> Both your code and my code work when I don't combine things.  The problem is
>> when I want to combine an expression (or a bquote in your example) with
>> something else
>> 
>> e.g. this doesn't work:
>> 
>> vectorA = c( bquote("TNF-"*alpha), bquote("IFN-"*gamma) )
>> 
>> for(ii in vectorA)  {
>>   plot(0:1,0:1)
>>   title(main = paste("asdfsadf",ii))
>> }
>> 
>> because as soon as I've made an expression, I can no longer append it to
>> something else.  While in this example I could have had the "asdfsadf" in
>> the original bquote, there are reasons I need to build the ultimate label at
>> a separate point than I define the labels (I mix and match things multiple
>> ways inside the code).
>> 
>> So, the thing I'm really trying to do is a 2-stage evaluation of an
>> expression, aka a nested expression evaluation, or a substition of
>> expressions.  I've tried things like deparse, but so far haven't found the
>> magic.
>> 
>> thanks, Daryl
>> 
>> 
>> On 2/27/14 5:17 PM, David Winsemius wrote:
>> 
>> On Feb 27, 2014, at 3:17 PM, Bert Gunter wrote:
>> 
>>> ?plotmath
>>> 
>>> -- Bert
>> 
>> Daryl;;
>> 
>> I think what Bert was hoping you would do was read the plotmath page and
>> figure it out on your own but that can be a bit tricky when working with
>> expression object vectors. Here is (perhaps) a step forward:
>> 
>> vectorA = c( bquote("TNF-"*alpha), bquote("IFN-"*gamma) )
>> 
>> for(ii in vectorA)  {
>>  plot(0:1,0:1)
>>  title(main = ii)
>> }
>> 
>> Now as Jim Holtman is fond of saying... what problem were you (really)
>> trying to solve?
>> 
>> --
>> David.
>> 
>>> 
>>> Bert Gunter
>>> Genentech Nonclinical Biostatistics
>>> (650) 467-7374
>>> 
>>> "Data is not information. Information is not knowledge. And knowledge
>>> is certainly not wisdom."
>>> H. Gilbert Welch
>>> 
>>> 
>>> 
>>> 
>>> On Thu, Feb 27, 2014 at 2:58 PM, Daryl Morris <darylm at uw.edu> wrote:
>> 
>>>> Hi,
>>>> 
>>>> I have a function which generates many plots.  To keep it simple, let's
>>>> say
>>>> I want to set the main title based on where we are in nested loops.
>>>> 
>>>> So, something like
>>>> 
>>>> vectorA = c("a","b","c")
>>>> vectorB = c("a","b","c")
>>>> 
>>>> for(ii in vectorA) { for(jj in vectorB) {
>>>> plot(0:1,0:1)
>>>> title(main = paste(ii,jj))
>>>> }
>>>> 
>>>> that part is easy!   The question is what if I wanted vectorA to be an
>>>> expression?
>>>> 
>>>> I'd like to be able to set vectorA =
>>>> c(expression(paste("TNF-",alpha)),expression(paste("IFN-",gamma))), and
>>>> have
>>>> the plot title show the greek letters.
>>>> 
>>>> Obviously, in the for-loop I could build the expression all at once, but
>>>> there are lots of programmatic reasons I'd like to be able to have this
>>>> program structure.  Is there a solution which modifies either/both (1)
>>>> the
>>>> setting of main in the loop (2) how I define the vector outside of the
>>>> loop?
>>>> 
>>>> 
>>>> thanks, Daryl
>>>> 
>>>> ______________________________________________
>>>> R-help at 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.
>> 
>>> 
>>> ______________________________________________
>>> R-help at 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.
>> 
>> David Winsemius
>> Alameda, CA, USA
>> 
>> 

David Winsemius
Alameda, CA, USA




More information about the R-help mailing list