[R] lattice: calling functions

Deepayan Sarkar deepayan.sarkar at gmail.com
Tue Feb 14 17:59:11 CET 2006


On 2/14/06, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
> On 2/14/2006 9:38 AM, Gabor Grothendieck wrote:
> > On 2/14/06, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
> >> On 2/14/2006 8:56 AM, Wolfram Fischer wrote:
> >> > I defined three functions:
> >> >
> >> >> fun0 <- function( x=1:5, y=1:5, ... ) xyplot( y ~ x, ... )
> >> >
> >> >> fun1 <- function( x=1:5, y=1:5, ... ) fun2( y ~ x, ... )
> >> >> fun2 <- function( ... ) xyplot( ... )
> >> >
> >> > The call of fun0() works as expected.
> >> >
> >> > The call of fun1() causes the following error:
> >> >     'Error in eval(expr, envir, enclos) : object "y" not found'
> >> >
> >> > How should I define fun2 to avoid the error?
> >>
> >> fun2 is fine, it's fun1 that has problems.  It is passing a formula
> >> through fun2 to xyplot without telling xyplot where to evaluate the
> >> arguments.  If you change it to
> >>
> >> fun1 <- function( x=1:5, y=1:5, ... ) fun2( y ~ x, data=enviroment(), ...
> )

data=NULL works too, which is apparently what lm has.  The point being
that the environment of the formula is looked at, but the default
data=parent.frame() subverts that because of the way eval works (using
enclos only when envir is a list or data frame. What's wrong with
environments?). Even the following works:

fun1 <- function( x=1:5, y=1:5, ... )
    fun2( y ~ x, data = data.frame(x = x), ... )

I don't understand non-standard evaluation all that well, so I'll
happily consider any suggestions. I'll try changing the defaults to
NULL and see if there are any obvious problems.

Deepayan

> >> it will tell xyplot to look in the current environment at the time of
> >> the call, i.e. the fun1 evaluation environment where x and y live.
> >>
> >
> > Although this does seem to be how xyplot works, I think it indicates
> > there is a problem with it.
> >
> > The help file for xyplot indicates that for the xyplot formula method
> > the default
> > environment is the caller environment whereas it ought to be the
> environment
> > of the formula:
> >
> >     data: For the 'formula' method, a data frame containing values for
> >           any variables in the formula, as well as 'groups' and
> >           'subset' if applicable.  By default the environment where the
> >           function was called from is used.
> >
> > For example, if we replace xyplot with lm it does work as expected:
> >
> >    fun1 <- function( x=1:5, y=1:5, ... ) fun2( y ~ x, ... )
> >    fun2 <- function( ... ) lm( ... )
> >    fun1()
>
> You're right, I forgot formulas have associated environments.  I've
> added the lattice maintainer to the cc list.
>
> Duncan Murdoch




More information about the R-help mailing list