Thomas Zumbrunn
2008-Dec-11 10:55 UTC
[R] call lattice function in a function passing "groups" argument
I'm trying to use a lattice function within a function and have problems passing the "groups" argument properly. Let's say I have a data frame d <- data.frame(x = rnorm(100), y = c("a", "b")) and want to plot variable x in a densityplot, grouped by the variable y, then I would do something like densityplot(~ x, d, groups = y) If however I wanted to call the function "densityplot" within a function and pass the "groups" argument as an argument of that function, how would I have to proceed? It is not as straightforward as f <- function(data, groupvar) { densityplot(~ x, data, groups = groupvar) } probably because the lattice function "densityplot.formula" preprocesses the "groups" argument with groups <- eval(substitute(groups), data, environment(formula)) It there a way how I could pass the "groups" argument in the function "f"? Thanks for any hints, Thomas Zumbrunn
> > If however I wanted to call the function "densityplot" within a function and > pass the "groups" argument as an argument of that function, how would I have > to proceed? It is not as straightforward as > > f <- function(data, groupvar) { > densityplot(~ x, data, groups = groupvar) > } > > probably because the lattice function "densityplot.formula" preprocesses > the "groups" argument with > > groups <- eval(substitute(groups), data, environment(formula)) > > It there a way how I could pass the "groups" argument in the function "f"?Here's one approach. Pass the 'groups' variable as a character, then find that variable in the data frame and rename it. d <- data.frame(x = rnorm(100), y = c("a", "b")) f <- function(data, groupvar) { names(data)[which(names(data) == groupvar)] <- "gp" densityplot(~ x, data, groups = gp) } f(d, groupvar="y")
Deepayan Sarkar
2008-Dec-11 20:12 UTC
[R] call lattice function in a function passing "groups" argument
On Thu, Dec 11, 2008 at 2:55 AM, Thomas Zumbrunn <t.zumbrunn at unibas.ch> wrote:> I'm trying to use a lattice function within a function and have problems > passing the "groups" argument properly. Let's say I have a data frame > > d <- data.frame(x = rnorm(100), y = c("a", "b")) > > and want to plot variable x in a densityplot, grouped by the variable y, then > I would do something like > > densityplot(~ x, d, groups = y) > > If however I wanted to call the function "densityplot" within a function and > pass the "groups" argument as an argument of that function, how would I have > to proceed? It is not as straightforward as > > f <- function(data, groupvar) { > densityplot(~ x, data, groups = groupvar) > } > > probably because the lattice function "densityplot.formula" preprocesses > the "groups" argument withYes, that's the price of non-standard evaluation.> groups <- eval(substitute(groups), data, environment(formula)) > > It there a way how I could pass the "groups" argument in the function "f"?The obvious solution is to evaluate 'groupvar' yourself: f <- function(data, groupvar) { groupvar <- eval(substitute(groupvar), data, parent.frame()) densityplot(~ x, data, groups = groupvar) } A more general solution (where 'groupvar' may be missing) is to use match.call() etc. (e.g., see lattice:::dotplot.formula) -Deepayan