Paul Johnson wrote > 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)))) > > It appears to me that 2/3 of the as.name usages are not needed, at > least not in R 2.15 on Debian Linux. > > This works just as well > > plot(0, main=bquote(.(x)^.(as.name(power))/.(y)))
The return value of bquote is different in those 2 cases (with and without the as.name): > bquote(.(as.name(x))^.(as.name(power))/.(as.name(y))) `Waist Size (cm)`^gamma/`Weight (kg)` > bquote(.(x)^.(as.name(power))/.(y)) "Waist Size (cm)"^gamma/"Weight (kg)" However, plotmath doesn't print the quotes around a string like "Weight (kg)", nor the backticks around a weird name like `Weight (kg)`, so you don't notice the difference when using bquote's output for plotmath. If you were constructing a formula for lm() then you would notice the difference. Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com > -----Original Message----- > From: Paul Johnson [mailto:pauljoh...@gmail.com] > Sent: Saturday, May 19, 2012 11:16 AM > To: William Dunlap > Cc: r-help > Subject: Re: [R] Names of Greek letters stored as character strings; plotmath. > > On Sat, May 19, 2012 at 11:07 AM, William Dunlap <wdun...@tibco.com> wrote: > > 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 > > > Bill's point is on the money here. We should aim to teach one way that > works always. But finding that one way is the hard part for me. > > Lately, I'm bothered that R (or computers in general?) allows too many > ways to do the same thing that work SOME of the time. Without a very > deep understanding of the terminology, users are bewildered. > > Go read ?plotmath. Do we see "as.name"? NO. Why does the idiom > expression(paste()) work as well? (Don't answer, that's a rhetorical > question). > > There are too many ways to do the same thing. Or, well, too many of us > know one way that works sometime and don't find out it doesn't always > work until, as Bill says, it is buried in the bottom of some big > function that behaves erratically. > > Gabor notes this works (sometimes): > > plot(0, xlab = parse(text = xNm)) > > Bert observes this works (sometimes) > > xnm <- quote(gamma) > ## makes xnm the name gamma not the string "gamma" > plot(0,xlab = bquote( .(xnm)) > > Bill observes this works: > xnm <- "gamma" > plot(0,xlab = bquote(.(as.name(xnm)))) > > In line with that, Bill suggests: > > 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)))) > > It appears to me that 2/3 of the as.name usages are not needed, at > least not in R 2.15 on Debian Linux. > > This works just as well > > plot(0, main=bquote(.(x)^.(as.name(power))/.(y))) > > > Is there any important reason to wrap x and y in this command with as.name? > > It does work, maybe I be in the general habit of wrapping as.name > around variables in bquotes? I'm more confused. > > The good new for me is that I cannot find any replacements for the > usage of "as.name" in that particular expression. So there is just one > way. > > Oh, wait, I spoke too soon. as.symbol is identical to as.name. > > plot(0, main=bquote(.(x)^.(as.symbol(power))/.(y))) > > And then, logically, this works: > > plot(0, main=bquote(.(x)^.(as.vector(power, "symbol"))/.(y))) > > I personally think "as.symbol" is more likely to be understood by > students, I may stick to that. So I think the most succinct, best > approach is > > > plot(0, main=bquote(.(x)^.(as.symbol(power))/.(y))) > > or perhaps the most consistent-looking strategy is: > > power <- as.symbol("gamma") ; x <- "Waist Size (cm)" ; y <- "Weight (kg)" > plot(0, main=bquote(.(x)^.(power)/.(y))) > > Speaking of commands that have identical results and exist separately > for no apparently good reason: > > library(help=rockchalk) > > help(package=rockchalk) > > pj > > > > >> -----Original Message----- > >> From: r-help-boun...@r-project.org [mailto:r-help-boun...@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 > >> <ggrothendi...@gmail.com> wrote: > >> > On Sat, May 19, 2012 at 1:18 AM, Rolf Turner <rolf.tur...@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)) > >> > > >> > -- > >> > Statistics & Software Consulting > >> > GKX Group, GKX Associates Inc. > >> > tel: 1-877-GKX-GROUP > >> > email: ggrothendieck at gmail.com > >> > > >> > ______________________________________________ > >> > 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. > >> > >> > >> > >> -- > >> > >> 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 > >> > >> ______________________________________________ > >> 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. > > > > ______________________________________________ > > 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. > > > > -- > Paul E. Johnson > Professor, Political Science Assoc. Director > 1541 Lilac Lane, Room 504 Center for Research Methods > University of Kansas University of Kansas > http://pj.freefaculty.org http://quant.ku.edu ______________________________________________ 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.