From luke@nokomis2.stat.umn.edu  Fri Jan  4 15:17:12 2002
From: luke@nokomis2.stat.umn.edu (Luke Tierney)
Date: Fri, 4 Jan 2002 09:17:12 -0600
Subject: [Rd] Problem with "missing" in "local" (PR#1241)
In-Reply-To: <200201041448.PAA09053@pubhealth.ku.dk>; from J.C.Rougier@durham.ac.uk on Fri, Jan 04, 2002 at 03:48:07PM +0100
References: <200201041448.PAA09053@pubhealth.ku.dk>
Message-ID: <20020104091712.A19103@nokomis2.stat.umn.edu>

I think Jonathan has a point.  Here is another variation that does not
involve explicit eval or local:

	f<-function(x){
	    g<-function() missing(x)
	    g()
	}

	> f()
	Error in g() : "missing" illegal use of missing

This sort of thing does not arise in S, but with lexical scope in R it
seems natural to me at least that missing should work on lexically
visible variables.  The error produced by

	f<-function(x){
	    g<-function() x
	    g()
	}

	> f()
	Error in g() : Argument "x" is missing, with no default

also suggests that it would be nice to be able to use missing to guard
against this error.

For the short term we should add a note to the help file for missing
(I will do this), but longer term I think we should revise the missing
inplementation to handle these cases more naturally (unless anyone
sees anything seriously wrong with that).

By the way, the help for missing says:

     `missing(x)' is only reliable if `x' has not been altered since
     entering the function: in particular it will always be true after
     `x <- match.arg(x)'. 

I believe that should be "... it will always be false after ..."?

luke

On Fri, Jan 04, 2002 at 03:48:07PM +0100, J.C.Rougier@durham.ac.uk wrote:
> Hi Brian,
> 
> Prof Brian Ripley wrote:
> > 
> > On Fri, 4 Jan 2002 J.C.Rougier@durham.ac.uk wrote:
> > 
> > > Hi everyone,
> > >
> > > I encountered unexpected behaviour when calling "missing" within a
> > > "local" environment, namely
> > >
> > > fred <- function(x, y)
> > > {
> > >   x <- as.vector(x)
> > >   local({
> > >     dontwantme <- 1:100
> > >     if (missing(y)) print("No \"y\" today")
> > >   })
> > >   x
> > > }
> > >
> > > whereupon I get
> > >
> > > > fred(1:10)
> > > Error in eval(expr, envir, enclos) : "missing" illegal use of missing
> > >
> > > I think it is reasonable to expect missing to work in this context (I
> > > suspect the problem relates to lazy evaluation): if not, it might be
> > > helpful to amend the help file.
> > 
> > Why do you think it reasonable?  You've take a function from
> > 
> >      Evaluate an R expression in a specified environment.
> > 
> > and evaluated it somewhere where missing() is not defined.  If you had
> > used eval() explicitly, would you think it reasonable?  I doubt it.
> 
> By "reasonable" in this context I mean that the operation would appear
> to be well-defined and useful.  I can access x within the local()
> environment, ie it is found in the enclosing environment, and I do not
> think that y should be treated any differently.  If I modify my function
> to read
> 
> fred <- function(x, y)
> {
>   x <- as.vector(x)
>   local({
>     print(x)
>     print(y)
>     if (missing(y)) print("No \"y\" today")
>   })
>   x
> }
> 
> then I get the error message
> 
> > fred(1:10)
>  [1]  1  2  3  4  5  6  7  8  9 10
> Error in print(y) : Argument "y" is missing, with no default
> 
> This error message suggests to me that "missing(y)" would evaluate
> correctly.
> 
> > 
> > Which help file did you have in mind?
> > 
> 
> The help file for "missing".  This points out that "missing" is not
> always reliable, eg after "x <- match.arg(x)".  Perhaps this could be
> another example of "unreliability".
> 
> Cheers, Jonathan.
> 
> -- 
> Jonathan Rougier                       Science Laboratories
> Department of Mathematical Sciences    South Road
> University of Durham                   Durham DH1 3LE
> tel: +44 (0)191 374 2361, fax: +44 (0)191 374 7388
> http://www.maths.dur.ac.uk/stats/people/jcr/jcr.html
> 
> -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
> r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
> Send "info", "help", or "[un]subscribe"
> (in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
> _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._


[Rd] Problem with "missing" in "local" (PR#1241)
Luke Tierney