Yes, I did get a very helpful reply from Marc Schwartz.  I have
had substitute() working in legend(), when the legend argument
has length one.  The challenge was to find some way to do the
equivalent of substitute() when several expressions appear in
parallel, as may be required for legend().

The trick is to use bquote() to do the substitution.  The resulting
quoted expression (of mode "call") can then be an element in a
list, along with other quoted (or bquoted) expressions.   The
list elements, when passed to expression() via the args
argument of do.call(), become unquoted expressions.

Note that bquote() uses a syntax for the substitution of variables
that is different from that used by substitute().  It would be useful
to include some such example as below on the help page for
bquote():


library(DAAG)
Acmena <- subset(rainforest, species="Acmena")
plot(wood~dbh, data=Acmena)
Acmena.lm <- lm(log(wood) ~ log(dbh), data=Acmena)
b <- round(coef(Acmena.lm), 3)
arg1 <- bquote(italic(y) == .(A) * italic(x)^.(B),
                    list(A=b[1], B=b[2]))
arg2 <- quote("where " * italic(y) * "=wood; " *
                           italic(x) * "=dbh")
legend("topleft", legend=do.call("expression", c(arg1, arg2)),
                bty="n")

John Maindonald.


On 11 Oct 2005, at 11:41 AM, Spencer Graves wrote:


>       Have you received a reply to this post?  I couldn't find one,  
> and I couldn't find a solution, even though one must exist.  I can  
> get the substitute to work in "main" but not "legend":
>
> B <- 2:3
> eB <- substitute(y==a*x^b, list(a=B[1], b=B[2]))
> plot(1:2, 1:2, main=eB)
>
>       You should be able to construct it using "mtext", but I  
> couldn't get the desired result using legend.
>
>       hope this helps.
>       spencer graves
>
> John Maindonald wrote:
>
>
>
>> expression() accepts multiple expressions as arguments, thus:
>> plot(1:2, 1:2)
>> legend("topleft",
>>                expression(y == a * x^b,
>>                                     "where "* paste(y=="wood; ",   
>> x=="dbh")))
>> Is there a way to do this when values are to be substituted
>> for a and b? i.e., the first element of the legend argument
>> to legend() becomes, effectively:
>>    substitute(y == a * x^b, list(a = B[1], b=B[2]))
>> John Maindonald             email: [EMAIL PROTECTED]
>> phone : +61 2 (6125)3473    fax  : +61 2(6125)5549
>> Centre for Bioinformation Science, Room 1194,
>> John Dedman Mathematical Sciences Building (Building 27)
>> Australian National University, Canberra ACT 0200.
>> ______________________________________________
>> R-help@stat.math.ethz.ch mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide! http://www.R-project.org/posting- 
>> guide.html
>>
>>
>
> -- 
> Spencer Graves, PhD
> Senior Development Engineer
> PDF Solutions, Inc.
> 333 West San Carlos Street Suite 700
> San Jose, CA 95110, USA
>
> [EMAIL PROTECTED]
> www.pdf.com <http://www.pdf.com>
> Tel:  408-938-4420
> Fax: 408-280-7915
>
>



John Maindonald             email: [EMAIL PROTECTED]
phone : +61 2 (6125)3473    fax  : +61 2(6125)5549
Centre for Bioinformation Science, Room 1194,
John Dedman Mathematical Sciences Building (Building 27)
Australian National University, Canberra ACT 0200.

______________________________________________
R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html

Reply via email to