[R] call lattice function in a function passing "groups" argument

Deepayan Sarkar
Thu, 11 Dec 2008 20:12:59 -0000

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 with

Yes, 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