lattice: calling functions
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