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 <[EMAIL PROTECTED]> wrote: > From: Bert Gunter <[EMAIL PROTECTED]> > Subject: RE: [R] Ellipsis arguments for plot.formula > To: [EMAIL PROTECTED] > Cc: r-help@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: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] On > Behalf Of Amit Ganatra > Sent: Thursday, July 10, 2008 11:51 AM > To: r-help@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@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@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.