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.