Re: [R] Ellipsis arguments for plot.formula

From: Gabor Grothendieck <ggrothendieck_at_gmail.com>
Date: Fri, 11 Jul 2008 10:45:15 -0400

You could replace the one line in my.plot with this:

eval.parent(substitute(plot( x, y, cex.axis=0.5, ...)))

On Fri, Jul 11, 2008 at 10:41 AM, Amit Ganatra <amit_d_ganatra_at_yahoo.com> wrote:
>
> Thank you. That does work for the title.
> My intention for the program I am writing was to set some parameters with default values that I wanted. Then each call would set other parameters as required.
> It all works fine apart from the calls where I pass a formula. It probably has to do with the data argument of plot.formula. plot.formula is probably trying to find all the names in that argument and not just the names that appear in the formula.
>
>
> --- On Fri, 7/11/08, Gabor Grothendieck <ggrothendieck_at_gmail.com> wrote:
>
>> From: Gabor Grothendieck <ggrothendieck_at_gmail.com>
>> Subject: Re: [R] Ellipsis arguments for plot.formula
>> To: amit_d_ganatra_at_yahoo.com
>> Cc: "Bert Gunter" <gunter.berton_at_gene.com>, r-help_at_r-project.org
>> Date: Friday, July 11, 2008, 8:31 AM
>> A workaround is to use the title command instead:
>>
>> my.plot(y ~ x, tdf)
>> title(main.str)
>>
>>
>> On Fri, Jul 11, 2008 at 8:43 AM, Amit Ganatra
>> <amit_d_ganatra_at_yahoo.com> wrote:
>> > Thank you for taking the time.
>> > I get your point about presumptions.
>> > If you issue the call my.plot( x, y, main = main.str
>> ), it works fine. The problem turns up only when you use a
>> formula as an argument, hence the suspicion that the
>> behavior was unintended.
>> >
>> >
>> > --- On Thu, 7/10/08, Bert Gunter
>> <gunter.berton_at_gene.com> wrote:
>> >
>> >> From: Bert Gunter <gunter.berton_at_gene.com>
>> >> Subject: RE: [R] Ellipsis arguments for
>> plot.formula
>> >> To: amit_d_ganatra_at_yahoo.com
>> >> Cc: r-help_at_r-project.org
>> >> Date: Thursday, July 10, 2008, 5:10 PM
>> >> I think it's rather presumptuous of you to ask
>> whether a
>> >> fundamental
>> >> behavior that you don't understand in a mature
>> software
>> >> product that has
>> >> been used by literally thousands of people for
>> around 10
>> >> years (>20 for S)
>> >> is "a bug", don't you?
>> >>
>> >> So the answer is, no, this is how R's
>> evaluation
>> >> mechanism works. It is,
>> >> admittedly, a complex issue, but let's see if
>> we can
>> >> trace it through (help
>> >> and corrections from wiser folks would be
>> appreciated if I
>> >> get anything
>> >> wrong...).
>> >>
>> >> When you issue your call
>> >>
>> >> > my.plot( y ~ x, tdf, main = main.str )
>> >>
>> >> at the command line, the "main=main.str"
>> part is
>> >> the "..." argument (and
>> >> can be recovered within the function e.g. by
>> list(...); see
>> >> ?browser). As
>> >> you understand, R now passes this down to the
>> generic
>> >> plot() call (see
>> >> ?UseMethod for info on S3 generics). This in turn
>> calls
>> >> plot.default() via
>> >>
>> >> > plot.default(x,y, cex.axis=0.5, main =
>> main.str) .
>> >>
>> >> Now plot.default has to evaluate the name,
>> main.str, in
>> >> order to execute.
>> >> Where is it to do this evaluation? It is **not**
>> the top
>> >> level (.GlobalEnv),
>> >> which is why you threw the error message. So where
>> does the
>> >> symbol,
>> >> "main.str," get evaluated? As I read the
>> >> ?UseMethod
>> >> documentation(corrections please here if I'm
>> wrong), it
>> >> is in the context of
>> >> the plot call, which is within the my.plot
>> function *** not
>> >> in the parent
>> >> frame as you said*** -- which is the global
>> environment
>> >> (where it *would*
>> >> find it). It does not find main.str there, and so
>> you get
>> >> an error message.
>> >> As you noted, if you explicitly put main.str into
>> the
>> >> my.plot environment,
>> >> it would find it and the function works as you
>> expect.
>> >>
>> >> I think the best documentation of all these
>> technicalities
>> >> is V&R's S
>> >> PROGRAMMING, but others may also have their own
>> favorites.
>> >> As I said, it is
>> >> quite tricky.
>> >>
>> >> As for a "workaround," this too, gets
>> tricky: you
>> >> basically need to
>> >> construct the plot call with the evaluated
>> variables. The
>> >> V&R reference
>> >> shows you one way to do this (see the
>> "Computing on
>> >> the Language" chapter,
>> >> if memory serves). There may well be other slicker
>> tricks
>> >> by now (which
>> >> others may provide, I hope).
>> >>
>> >> Hope this helps... and please be more circumspect
>> in future
>> >> when asking such
>> >> questions. R is a quite remarkable effort by some
>> really
>> >> smart people who
>> >> have done an enormous amount of work essentially
>> for
>> >> nothing. While bugs
>> >> certainly can and do arise, I think our first and
>> almost
>> >> always correct
>> >> impulse should be to assume that there's
>> something that
>> >> we don't understand
>> >> and phrase our queries accordingly. We owe the
>> developers
>> >> this courtesy.
>> >>
>> >> Cheers,
>> >>
>> >> Bert Gunter
>> >> Genentech, Inc.
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> -----Original Message-----
>> >> From: r-help-bounces_at_r-project.org
>> >> [mailto:r-help-bounces_at_r-project.org] On
>> >> Behalf Of Amit Ganatra
>> >> Sent: Thursday, July 10, 2008 11:51 AM
>> >> To: r-help_at_r-project.org
>> >> Subject: [R] Ellipsis arguments for plot.formula
>> >>
>> >> Hi:
>> >> I have a function as follows:
>> >> my.plot <- function( x, y = NULL, ... )
>> >> {
>> >> plot( x, y, cex.axis=0.5, ...)
>> >> }
>> >>
>> >> Set up the variables:
>> >> x <- 1:10; y <- x; tdf <- data.frame( x,
>> y );
>> >> main.str <- "test"
>> >>
>> >> I will exercise the function in two ways:
>> >>
>> >> > my.plot( y ~ x, tdf, main = "test"
>> )
>> >> This works fine
>> >>
>> >> > my.plot( y ~ x, tdf, main = main.str )
>> >> Error in eval(expr, envir, enclos) :
>> >> ..1 used in an incorrect context, no ... to look
>> in
>> >>
>> >> Turns out that plot.formula is looking for the
>> name
>> >> "main.str" in its parent
>> >> frame. If I define the name main.str in my.plot
>> the
>> >> function works fine.
>> >>
>> >> Is this a bug?
>> >> I have a clunky workaround where I get the
>> parent.frame in
>> >> my.plot and
>> >> create the variables in my.plot, but I don't
>> like the
>> >> solution.
>> >>
>> >> Thanks
>> >>
>> >> ______________________________________________
>> >> R-help_at_r-project.org mailing list
>> >> 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
>> > 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
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. Received on Fri 11 Jul 2008 - 14:56:28 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Fri 11 Jul 2008 - 17:31:41 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive