6

I am struggling trying to plot Greek symbols as axis labels. Due to for looping several plots with different scales, I would like to use a vector that contains the symbol name instead of using the symbol name within expression(), which works fine:

x <- rnorm(10, 5,6)
y <- rnorm(10, 2,1)
xlab <- expression(paste(mu, "mol/mol"))
plot(x,y, xlab = xlab)

For some reason, I can't replace "mu" with a vector containing the symbol name:

k <- "mu"
xlab <- expression(paste(get(k), "mol/mol"))
plot(x,y, xlab = xlab)

I found a similar question, but what worked for functions does not seem to work for Greek symbols:

ylab <- substitute(paste(nn, "mol/mol"), list(nn=k))
xlab <- bquote(.(k) * "mol/mol")

plot(x,y, ylab = ylab, xlab = xlab)

What do I do wrong? How to get a Greek symbol to axis label through a vector?

Community
  • 1
  • 1
Mikko
  • 7,530
  • 8
  • 55
  • 92
  • expression is a primitive function. It does not evaluate its arguments. – vinux May 16 '12 at 09:24
  • 1
    Does [this Q&A](http://stackoverflow.com/questions/10042258/generate-a-list-of-expression-literals-from-an-integer-sequence) help? – fotNelton May 16 '12 at 09:44
  • @fotNelton: This wouldn't work at least: ylab <- do.call("expression", lapply(k, function(i) substitute(k * "mol/mol", list(k = i)))) – Mikko May 16 '12 at 09:55
  • 2
    note that the problem really comes from the fact that `k = "mu"` is a character string that you want interpreted as an expression. If you had `k = quote(mu)`, then `xlab = bquote(.(k)*mol/mol)` works just fine. – baptiste May 16 '12 at 10:15
  • @Largh: There might be a slight misunderstanding. I meant to point you at the use of `parse`. – fotNelton May 16 '12 at 16:29

1 Answers1

6

Try this:

xlab = parse(text=paste(k, "*mol/mol"))
baptiste
  • 75,767
  • 19
  • 198
  • 294