[R] lattice: calling functions

Duncan Murdoch murdoch at stats.uwo.ca
Tue Feb 14 15:50:39 CET 2006


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(), ... )
>>
>> 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