Thanks, Bill.
This is a subtlety I certainly did not understand.
Bert
On Fri, Apr 8, 2022 at 10:08 AM Bill Dunlap <williamwdunlap at gmail.com>
wrote:>
> plotmath also accepts names and calls, which it treats as though they were
single-element expressions. That is why quote() generally works.
quote("string") or quote(123) does not invoke plotmath, as quote
returns a literal string or number when given such a thing.
>
> plot(0:1,0:1,type="n")
> text(.2, .6, expression(phi^epsilon))
> text(.2, .4, quote(phi^epsilon))
> text(.7, .6, expression(1234567890123456))
> text(.7, .4, quote(1234567890123456))
>
> -Bill
>
> On Fri, Apr 8, 2022 at 9:49 AM Bert Gunter <bgunter.4567 at
gmail.com> wrote:
>>
>> Yes, I also find it somewhat confusing. Perhaps this will help. I
>> apologize beforehand if I have misunderstood and you already know all
>> this.
>>
>> The key is to realize that plotmath works with **expressions**,
>> unevaluated forms that include special plotmath keywords, like
'atop',
>> and symbols. So...
>>
>> ## simple example with plotmath used in plot's title
>>
>> ## This will produce an error, as 'atop' is not an R function:
>> plot(1,1, main = atop(x,y))
>>
>> ## to make this work, we need an expression on the rhs of 'main
=' . A
>> simple way to do this is to use quote():
>>
>> plot(1,1,main = quote(atop(x,y)))
>>
>> ## Note that this produce 'x' above 'y' **without
quoting x and y**.
>> That's because
>> ## this is an expression that plotmath parses and evaluates according
>> to its own rules,
>> ## shown in ?plotmath
>>
>> ## Now suppose we have:
>> x <- 'first line'
>> y <- 'second line'
>>
>> ## and we want to display these quoted strings instead of 'x'
and 'y'
>> in the title
>>
>> ## Then this will *not* work -- it gives the same result as before:
>> plot(1,1,main = quote(atop(x,y)))
>>
>> ## So what is needed here is R's 'computing on the
language"
>> capability to substitute
>> ## the quoted strings for x and y in the expression. Here are two
>> simple ways to do this:
>>
>> ## First using substitute()
>>
>> plot(1,1, main = substitute(atop(x,y), list (x =x, y = y)))
>>
>> ## Second, using bquote()
>>
>> plot(1,1, main = bquote(atop(.(x), .(y))))
>>
>> ## More complicated expressions can be built up using plotmath's
rules.
>> ## But you need to be careful about distinguishing plotmath expressions
and
>> ## ordinary R expressions. For example:
>>
>> x <- pi/4 ## a number
>>
>> ## WRONG -- will display as written. bquote() is the same as quote()
here.
>> plot(1,1, main = bquote(sin(pi/4) == round(x,2)))
>>
>> ## WRONG -- will substitute value of x rounded to session default
>> ## in previous. This is a mistake in using bquote
>> plot(1,1, main = bquote(sin(pi/4) == round(.(x), 2)))
>>
>> ## RIGHT -- use of bquote
>> plot(1,1, main = bquote(sin(pi/4) == .(round(x,2))))
>> ## or -- using substitute
>> plot(1,1, main = substitute(sin(pi/4) == x, list(x = round(x,2))))
>>
>> Hope this is helpful and, again, apologies if I have misunderstood.
>>
>> Bert Gunter
>>
>> "The trouble with having an open mind is that people keep coming
along
>> and sticking things into it."
>> -- Opus (aka Berkeley Breathed in his "Bloom County" comic
strip )
>>
>> On Fri, Apr 8, 2022 at 7:42 AM PIKAL Petr <petr.pikal at
precheza.cz> wrote:
>> >
>> > Hallo David
>> >
>> > Fair enough. Thanks for your explanation, which told me what
should be done. It works perfectly for my example but I am still confused how to
get expressions given to atop (or other functions) be evaluated and help page
does not enlighten me, so I am still puzzled.
>> >
>> > When I borrow example from help,
>> >
>> > plot(1:10, type="n", xlab="",
ylab="", main = "plot math & numbers")
>> > theta <- 1.23 ; mtext(bquote(hat(theta) == .(theta)), line=
.25)
>> > for(i in 2:9)
>> > text(i, i+1, substitute(list(xi, eta) ==
group("(",list(x,y),")"),
>> > list(x = i, y = i+1)))
>> >
>> > #this is OK
>> > ex1 <- expression(" first: {f * minute}(x) " ==
{f * minute}(x))
>> > ex2 <- expression(" second: {f * second}(x)
" == {f * second}(x))
>> > text(1, 9.6, ex1, adj=0)
>> > text(1, 9.0, ex2, adj=0)
>> >
>> > #and this is not
>> > text(2, 8, expression(atop(ex1, ex2)))
>> > text(2, 7, substitute( atop(ex1, ex2), list(ex1=ex1,ex2=ex2)))
>> >
>> > #and this works
>> > text(2, 6, expression(atop(1,2)))
>> >
>> > I tried to use eval when calling atop, but it did not work either.
Therefore some hint in help page could be quite handy.
>> >
>> > Best regards
>> > Petr Pikal
>> >
>> > S pozdravem | Best Regards
>> > RNDr. Petr PIKAL
>> > Vedouc? V?zkumu a v?voje | Research Manager
>> > PRECHEZA a.s.
>> > n?b?. Dr. Edvarda Bene?e 1170/24 | 750 02 P?erov | Czech Republic
>> > Tel: +420 581 252 256 | GSM: +420 724 008 364
>> > petr.pikal at precheza.cz | www.precheza.cz
>> >
>> > Osobn? ?daje: Informace o zpracov?n? a ochran? osobn?ch ?daj?
obchodn?ch partner? PRECHEZA a.s. jsou zve?ejn?ny na:
https://www.precheza.cz/zasady-ochrany-osobnich-udaju/ | Information about
processing and protection of business partner?s personal data are available on
website: https://www.precheza.cz/en/personal-data-protection-principles/
>> > D?v?rnost: Tento e-mail a jak?koliv k n?mu p?ipojen? dokumenty
jsou d?v?rn? a podl?haj? tomuto pr?vn? z?vazn?mu prohl??en? o vylou?en?
odpov?dnosti: https://www.precheza.cz/01-dovetek/ | This email and any documents
attached to it may be confidential and are subject to the legally binding
disclaimer: https://www.precheza.cz/en/01-disclaimer/
>> >
>> > -----Original Message-----
>> > From: David Winsemius <dwinsemius at comcast.net>
>> > Sent: Thursday, April 7, 2022 12:04 AM
>> > To: PIKAL Petr <petr.pikal at precheza.cz>; Richard M.
Heiberger <rmh at temple.edu>
>> > Cc: r-help at r-project.org
>> > Subject: Re: [R] [External] add equation and rsqared to plot
>> >
>> >
>> > On 4/6/22 14:36, PIKAL Petr wrote:
>> > > Hallo David
>> > >
>> > > Thanks for your answer. atop itself somehow cannot use
expression made by substitute although those expressions itself are correct. I
asked this question after roughly two hours of unsuccessful atempts.
>> > >
>> > > The second substitute or bquote solves the problem. Maybe
this could propagate to help page, because although atop works smoothly with
simple expressions, expressions with substitute are treated in a wrong way (at
least by my opinion).
>> >
>> >
>> > It's not a problem with `atop`. It's a problem with your
understanding of how R expressions and plotmath functions work. The argument(s)
to `expression` are not evaluated. So `atop` was given two expressions `eq` and
`req` and they in turn were not evaluated .... just taken as text values inside
atop. Using either `substitute` (with a second argument
>> > list) or bquote (with its special dot function) forces evaluation
by getting from the R symbol table those expressions which you had assigned as
values of the symbols `eq` and `req`.
>> >
>> > The plotmath functions (not just atop but also `paste`, `frac`,
`over` and all the rest on the ?plotmath pafge), are designed to be
"like"
>> > `expression` in not evaluating their arguments unless a
"special value"
>> > like a Greek letter name or a defined %<op>% is found. Those
functions are handled with a different parser than regular R functions. So they
are not designed to go out to the R symbol table (which is where even locally
defined object names are kept) to find values.
>> >
>> >
>> > Hope this helps;
>> >
>> > David.
>> >
>> >
>> > --
>> >
>> > David.
>> >
>> > >
>> > > Thanks again.
>> > >
>> > > Best regards.
>> > > Petr
>> > >
>> > >
>> > > ________________________________________
>> > > Od: David Winsemius <dwinsemius at comcast.net>
>> > > Odesl?no: 6. dubna 2022 23:20
>> > > Komu: PIKAL Petr; Richard M. Heiberger
>> > > Kopie: r-help at r-project.org
>> > > P?edm?t: Re: [R] [External] add equation and rsqared to plot
>> > >
>> > > Try this:
>> > >
>> > >
>> > > lm_eqn = function(m) {
>> > > l <- list(a = format(coef(m)[1], digits = 4),
>> > > b = format(abs(coef(m)[2]), digits = 4),
>> > > r2 = format(summary(m)$r.squared, digits =
3),
>> > > r2adj = format(summary(m)$adj.r.squared,
digits = 3));
>> > > if (coef(m)[2] >= 0) {
>> > > eq <- substitute(italic(y) == a + b %.%
italic(x), l)
>> > > } else {
>> > > eq <- substitute(italic(y) == a - b %.%
italic(x),l)
>> > >
>> > > }
>> > > req <- substitute(italic(r)^2~"="~r2*
","~~italic(adj.r)^2~"="~r2adj,l)
>> > > a_regs <- substitute( atop(eq, req),
list(eq=eq,req=req)) }
>> > >
>> > > --
>> > >
>> > > David.
>> > >
>> > > On 4/6/22 13:47, PIKAL Petr wrote:
>> > >> Hallo Richard.
>> > >>
>> > >> Did you try the example? I Used atop but with the syntax
I made, the
>> > >> result is
>> > >>
>> > >> eq
>> > >> req
>> > >>
>> > >> but not the equations.
>> > >>
>> > >> I send the picture, but I am not sure if it will go
through.
>> > >>
>> > >> Best regards
>> > >> Petr
>> > >>
>> > >> ________________________________________
>> > >> Od: Richard M. Heiberger <rmh at temple.edu>
>> > >> Odesl?no: 6. dubna 2022 22:36
>> > >> Komu: PIKAL Petr
>> > >> Kopie: r-help at r-project.org
>> > >> P?edm?t: Re: [External] [R] add equation and rsqared to
plot
>> > >>
>> > >> I think you are looking for atop(a,b) See ? plotmath
>> > >>
>> > >>> On Apr 06, 2022, at 15:58, PIKAL Petr <petr.pikal
at precheza.cz> wrote:
>> > >>>
>> > >>> Dear all
>> > >>>
>> > >>>
>> > >>> I want to add equation and rsquared values to plot
and I am lost in correct expression form. I want to have 2 lines, one with
equation and one with r squared values.
>> > >>>
>> > >>>
>> > >>> Here is what I made.
>> > >>>
>> > >>> # function to extract values from lm fit.
>> > >>>
>> > >>>
>> > >>> lm_eqn = function(m) {
>> > >>> l <- list(a = format(coef(m)[1], digits = 4),
>> > >>> b = format(abs(coef(m)[2]), digits = 4),
>> > >>> r2 = format(summary(m)$r.squared, digits = 3),
>> > >>> r2adj = format(summary(m)$adj.r.squared,
digits = 3));
>> > >>> if (coef(m)[2] >= 0) {
>> > >>> eq <- substitute(italic(y) == a + b %.%
italic(x), l)
>> > >>> } else {
>> > >>> eq <- substitute(italic(y) == a - b %.%
italic(x),l)
>> > >>>
>> > >>> }
>> > >>> req <- substitute(italic(r)^2~"="~r2*
","~~italic(adj.r)^2~"="~r2adj,l)
>> > >>> expression(atop(eq, req))
>> > >>> }
>> > >>>
>> > >>>
>> > >>> #Example
>> > >>>
>> > >>> x <- 1:10
>> > >>> y <- x*5 +rnorm(10)
>> > >>> plot(x,y)
>> > >>> fit <- lm(y~x)
>> > >>> text(4,40, lm_eqn(fit))
>> > >>>
>> > >>>
>> > >>> I know that both eq and req are correct expressions
and when the last line in function is either eq or req, the example gives
correct result.
>> > >>>
>> > >>>
>> > >>> But how to get both expressions one above the other
is mystery.
>> > >>>
>> > >>> Please help.
>> > >>>
>> > >>>
>> > >>> Best regards.
>> > >>>
>> > >>> Petr
>> > >>>
>> > >>>
>> > >>>
>> > >>> Osobn daje: Informace o zpracov n a ochran osobn
ch daj
>> > >>> obchodn ch partner PRECHEZA a.s. jsou zve ejn ny na:
>> > >>>
https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fww
>> > >>>
w.precheza.cz%2Fzasady-ochrany-osobnich-udaju%2F&data=04%7C01%7C
>> > >>>
rmh%40temple.edu%7C3b28fb8737e146a9ee3208da1807da2e%7C716e81efb52244
>> > >>>
738e3110bd02ccf6e5%7C0%7C0%7C637848719391803553%7CUnknown%7CTWFpbGZs
>> > >>>
b3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%
>> > >>>
3D%7C3000&sdata=MBtbONfsiMExWy0uorZMR1DglZindxErRMsooTztfUo%3D&a
>> > >>> mp;reserved=0 | Information about processing and
protection of
>> > >>> business partner's personal data are available on
website:
>> > >>>
https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fww
>> > >>>
w.precheza.cz%2Fen%2Fpersonal-data-protection-principles%2F&data
>> > >>>
=04%7C01%7Crmh%40temple.edu%7C3b28fb8737e146a9ee3208da1807da2e%7C716
>> > >>>
e81efb52244738e3110bd02ccf6e5%7C0%7C0%7C637848719391803553%7CUnknown
>> > >>>
%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiL
>> > >>>
CJXVCI6Mn0%3D%7C3000&sdata=2YDPoejYRlphL6h%2FWFmEEyR44KdmH2GDC9r
>> > >>> dLhFn4aU%3D&reserved=0
>> > >>> D v rnost: Tento e-mail a jak koliv k n mu p ipojen
dokumenty jsou
>> > >>> d v rn a podl haj tomuto pr vn z vazn mu prohl en
o vylou en
>> > >>> odpov dnosti:
>> > >>>
https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fww
>> > >>>
w.precheza.cz%2F01-dovetek%2F&data=04%7C01%7Crmh%40temple.edu%7C
>> > >>>
3b28fb8737e146a9ee3208da1807da2e%7C716e81efb52244738e3110bd02ccf6e5%
>> > >>>
7C0%7C0%7C637848719391803553%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjA
>> > >>>
wMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata
>> > >>>
=z7TNZSbfNXlB%2FZt0ekl8P1kTu1l0eBFVoLvewSSdQDg%3D&reserved=0 |
>> > >>> This email and any documents attached to it may be
confidential and
>> > >>> are subject to the legally binding disclaimer:
>> > >>>
https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fww
>> > >>>
w.precheza.cz%2Fen%2F01-disclaimer%2F&data=04%7C01%7Crmh%40templ
>> > >>>
e.edu%7C3b28fb8737e146a9ee3208da1807da2e%7C716e81efb52244738e3110bd0
>> > >>>
2ccf6e5%7C0%7C0%7C637848719391803553%7CUnknown%7CTWFpbGZsb3d8eyJWIjo
>> > >>>
iMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&a
>> > >>>
mp;sdata=RCUE7DJbn54MvhWX4bqiNtPzoJLl7NK9tieMlFpe2rg%3D&reserved
>> > >>> =0
>> > >>>
>> > >>>
>> > >>> [[alternative HTML version deleted]]
>> > >>>
>> > >>> ______________________________________________
>> > >>> R-help at r-project.org mailing list -- To
UNSUBSCRIBE and more, see
>> > >>> 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.
>> > >> Osobn? ?daje: Informace o zpracov?n? a ochran? osobn?ch
?daj?
>> > >> obchodn?ch partner? PRECHEZA a.s. jsou zve?ejn?ny na:
>> > >> https://www.precheza.cz/zasady-ochrany-osobnich-udaju/ |
Information
>> > >> about processing and protection of business partner?s
personal data
>> > >> are available on website:
>> > >>
https://www.precheza.cz/en/personal-data-protection-principles/
>> > >> D?v?rnost: Tento e-mail a jak?koliv k n?mu p?ipojen?
dokumenty jsou
>> > >> d?v?rn? a podl?haj? tomuto pr?vn? z?vazn?mu prohl??en? o
vylou?en?
>> > >> odpov?dnosti: https://www.precheza.cz/01-dovetek/ | This
email and
>> > >> any documents attached to it may be confidential and are
subject to
>> > >> the legally binding disclaimer:
>> > >> https://www.precheza.cz/en/01-disclaimer/
>> > >>
>> > >>
>> > >> ______________________________________________
>> > >> R-help at r-project.org mailing list -- To UNSUBSCRIBE
and more, see
>> > >> 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 at r-project.org mailing list -- To UNSUBSCRIBE and more,
see
>> > 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 at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> 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.