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)

3 Answers 3

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)
Sign up to request clarification or add additional context in comments.

Comments

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

Comments

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.

4 Comments

That doesn't work. You are missing an argument to tell substitute which variables to substitute. See my answer.
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.
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.
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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.