[R] Names of Greek letters stored as character strings; plotmath.

Bert Gunter gunter.berton at gene.com
Mon May 21 04:28:19 CEST 2012


Well, that's not very comforting, Duncan. It's like saying that you
have to read the engineering specs to drive the car successfully.

I am certainly ignorant of the internals, but I honestly believe
well-written documentation on these points would help. I learned a lot
when I read V&R's "S Programming" some years ago, so I think that's an
existence theorem.

Unfortunately, writing such documentation is hard, maybe harder than
writing the code even (my own experience documenting my own code). And
your logical response -- "Bert, R is open source and would welcome
your efforts" -- is not going to get much traction. Like you, I don't
have the time (nor, in my case, the smarts).

Nevertheless, I agree with Robert's sentiment that it could be done.
In particular, plotmath docs really should expand their explanation of
appropriate syntax, imho.

As always, I end by acknowledging the extraordinary efforts of R's
developers. Your success is what has led to such carping. A response
of "Aw shaddup" would therefore not be out of line.

Best,
Bert

On Sun, May 20, 2012 at 5:00 PM, Duncan Murdoch
<murdoch.duncan at gmail.com> wrote:
> On 12-05-20 6:53 PM, Robert Baer wrote:
>>
>> -----Original Message-----
>> From: William Dunlap
>> Sent: Saturday, May 19, 2012 11:07 AM
>> To: Rolf Turner
>> Cc: r-help
>> Subject: Re: [R] Names of Greek letters stored as character
>> strings;plotmath.
>>
>> parse(text=paste(...)) works in simple cases but not in others.  The
>> fortune about it is there because it is tempting to use but if you bury it
>> in a general purpose function it will cause problems when people
>> start using nonstandard names for variables.  bquote(), substitute(),
>> call(), and relatives work in all cases.  E.g.,
>>
>>   >  par(mfrow=c(2,1))
>>   >  power<- "gamma" ; x<- "Waist" ; y<- "Weight" # valid R variable names
>>   >  plot(0, main=bquote(.(as.name(x))^.(as.name(power))/.(as.name(y))))
>>   >  plot(0, main=parse(text=paste0(x, "^", power, "/", y))) # same as
>> previous
>>   >
>>   >  power<- "gamma" ; x<- "Waist Size (cm)" ; y<- "Weight (kg)" # invalid
>> R names
>>   >  plot(0, main=bquote(.(as.name(x))^.(as.name(power))/.(as.name(y))))
>>   >  plot(0, main=parse(text=paste0(x, "^", power, "/", y))) # whoops
>>   Error in parse(text = paste0(x, "^", power, "/", y)) :
>>     <text>:1:7: unexpected symbol
>>   1: Waist Size
>>            ^
>>
>> Now you might say that serves me right for using weird variable names,
>> but some of us use R as a back end to a GUI system (one not designed
>> around R) and don't want to inflict on users R's rules for names when
>> we do not have to.
>>
>> Bill Dunlap
>> Spotfire, TIBCO Software
>> wdunlap tibco.com
>>
>>
>>> -----Original Message-----
>>> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org]
>>> On Behalf
>>> Of Bert Gunter
>>> Sent: Saturday, May 19, 2012 7:24 AM
>>> To: Gabor Grothendieck
>>> Cc: r-help
>>> Subject: Re: [R] Names of Greek letters stored as character strings;
>>> plotmath.
>>>
>>> ... and here is another incantation that may be  informative.
>>>
>>> xnm<- as.name("gamma')  ## This does the parsing
>>> plot(0, xlab =bquote(.(xnm))
>>>
>>> The initial puzzle is that if you just set
>>> xnm<- "gamma"
>>>
>>> bquote will insert the string "gamma" rather than the symbol. After
>>> all, that's what plotmath sees for xnm. So the key is telling plotmath
>>> that it's a symbol, not a string. This can either be done before, as
>>> above, or inline, as you and Gabor showed. Unsurprisingly. this also
>>> does it, since as.name() is doing the parsing:
>>>
>>> xnm<- "gamma"
>>>  plot(0,xlab=bquote(.(as.name(xnm))))
>>>
>>> AND we are adhering to Thomas's dictum: bquote is a wrapper for
>>> substitute(), which is what he recommends as the preferable
>>> alternative to eval(parse(...)) . But, heck -- all such software
>>> principles are just guidelines. Whatever works (robustly).
>>>
>>> HTH.
>>>
>>> Cheers,
>>> Bert
>>>
>>> On Sat, May 19, 2012 at 3:17 AM, Gabor Grothendieck
>>> <ggrothendieck at gmail.com>  wrote:
>>>>
>>>> On Sat, May 19, 2012 at 1:18 AM, Rolf Turner<rolf.turner at xtra.co.nz>
>>>> wrote:
>>>>>
>>>>>
>>>>> I had such good luck with my previous question to r-help, (a few
>>>>> minutes
>>>>> ago) that I thought I would try again with the following query:
>>>>>
>>>>>> Suppose I have
>>>>>>
>>>>>>    xNm<- "gamma"
>>>>>>
>>>>>> I would like to be able to do
>>>>>>
>>>>>>    plot(1:10,xlab =<something involving xNm">)
>>>>>>
>>>>>> and get the x axis label to be the Greek letter gamma
>>>>>> (rather than the literal text string "gamma").
>>>>>>
>>>>>> Is this possible?  I've messed around with substitute()
>>>>>> and bquote() and got nowhere.
>>>>>
>>>>>
>>>>>
>>>>> Then, just before clicking on "Send", I had one more thimk, and blow
>>>>> me down, I got something that worked:
>>>>>
>>>>> plot(1:10,xlab=eval(expression(parse(text=xNm))))
>>>>>
>>>>
>>>> That can be shortened to:
>>>>
>>>> plot(0, xlab = parse(text = xNm))
>>
>>
>>
>> -- snip --
>>
>>
>> This discussion has been exceedingly helpful, sort of.
>>
>> Every time I try to do a task involving this I read the documentation for
>> bquote(), expression(), plotmath(), etc.,  over and over, and I still fail
>> to get the big picture of how R parses things under the hood.  Typically,
>> I
>> only succeed each time by frustrating trial and error.   Can I ask how you
>> guys got a handle on the bigger (besides your usual brilliance<G>)?
>>
>> Is there more comprehensive documentation in the developer literature or
>> is
>> there a user wiki that you would recommend for those who never quite get
>> the
>> big picture?  If not, this would be a worthy topic for an R Journal
>> article
>> if someone has knowledge and the time to do it.  Wish I were knowledgeable
>> enough to do it myself.
>
>
> I think you have to try writing C code to work with R objects to really
> understand what's going on.  Reading those sections of the Writing R
> Extensions manual will probably help, but actually writing C code to do it
> may be necessary.
>
> It's not really a very complicated system, it's just that things that are
> obviously different in C (e.g. the R symbol name "gamma" versus the string
> "gamma") look confusingly similar in R.
>
> You might be able to figure this out by studying the result of str(x) (or
> the low level .Internal(inspect(x))) for lots of different x objects, but I
> don't think it's going to make sense unless you know what's going on behind
> the curtain.
>
> Duncan Murdoch
>
> ______________________________________________
> 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.



-- 

Bert Gunter
Genentech Nonclinical Biostatistics

Internal Contact Info:
Phone: 467-7374
Website:
http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm



More information about the R-help mailing list