30

I'm trying to place the results of a regression (i.e., R2) in a graph, but can't seem to figure out how to call a variable from within an expression (it pastes the variable name).

Here is my code.

R2Val <- signif(summary(sMod_pre90)$r.squared[1], 2)
text(92, 4, expression(paste(R^2, " = ", R2Val)), adj = 0, cex = 0.85)
zx8754
  • 52,746
  • 12
  • 114
  • 209
sinclairjesse
  • 1,585
  • 4
  • 17
  • 29

3 Answers3

32

Use bquote(). Here is an example with dummy data:

set.seed(1)
DF <- data.frame(A = rnorm(100), B = rnorm(100))
mod <- lm(B ~ A, data = DF)
R2Val<-signif(summary(mod)$r.squared[1], 2)

The parts of the expression wrapped in .() get evaluated in the environment, i.e. the value of R2Val is substituted.

plot(B ~ A, data = DF)
text(1.5, 2, labels = bquote(R^2 == .(R2Val)), adj = 0, cex = 0.85)

Another potential solution is substitute, which works similarly:

plot(B ~ A, data = DF)
text(1.5, 2, labels = substitute(R^2 == A, list(A = R2Val)), adj = 0, cex = 0.85)
Gavin Simpson
  • 170,508
  • 25
  • 396
  • 453
1

To combine substitute() and paste(), I use the following code;

waic <-1;
chisquare <-2;
plot(x=1:2,y=1:2, 
     main =  substitute(paste(
    "chi^2 goodness of fit ", 
       chi^2*(D/theta) , "=",  chisquare ,
       ".  WAIC =",waic),


list(chisquare=chisquare,waic=waic)  
)
)

The result is the following;

enter image description here

Camford Oxbridge
  • 834
  • 8
  • 21
0

I've managed to put it together using the substitute function.

R2Val <- signif(summary(sMod_pre90)$r.squared[1], 2)
text(92, 4, substitute(R^2 ~ "=" ~ R2Val), adj = 0, cex = 0.85)

All is good.

Stibu
  • 15,166
  • 6
  • 57
  • 71
sinclairjesse
  • 1,585
  • 4
  • 17
  • 29
  • That doesn't work. You are missing an argument to tell `substitute` which variables to substitute. See my answer. – Gavin Simpson Dec 12 '10 at 18:30
  • I've managed to paste the text in the graph with the above solution; it appears to substitute variable calls, while evaluating the plot math as it should. I'm not sure why it didn't work for you. – sinclairjesse Dec 12 '10 at 18:44
  • 1
    Well, I've checked this on 2 machines with both R2.11-patched and R2.12-patched on Linux and your answer does not work on either. The `R2Val` is printed literally, rather than being interpreted, on the plot. I think `?substitute` is quite clear that unless you provide something for the `env` argument substitution will not take place in this example. – Gavin Simpson Dec 13 '10 at 13:34
  • 1
    I've tested out the code above on my linux box as well and I think I've figured out what the difference is. Running the above code directly in the console results in the variable being printed literally (i.e., R2Val), however, when I was running the code previously, it was wrapped in a function. If you wrap the model development and plotting code in a function, it will give the desired result. In this case the environment must be implied. I do accept you answer Gavin, as it's the best way to do it. I hope this clears it up. – sinclairjesse Dec 13 '10 at 15:30