[R] a question of substitute

Prof Brian Ripley ripley at stats.ox.ac.uk
Tue Jan 9 14:41:09 CET 2007


oneway.test expects a literal formula, not a variable containing a 
formula.  The help page says

  formula: a formula of the form 'lhs ~ rhs' where 'lhs' gives the
           sample values and 'rhs' the corresponding groups.

Furthermore, if you had

foo.2 <- function() oneway.test(value ~ group)

it would still not work, as

     data: an optional matrix or data frame (or similar: see
           'model.frame') containing the variables in the formula
           'formula'.  By default the variables are taken from
           'environment(formula)'.

I could show you several complicated workarounds, but why do you want to 
do this?


On Tue, 9 Jan 2007, Adrian Dusa wrote:

>
> Hi all,
>
> I want to write a wrapper for an analysis of variance and I face a curious
> problem. Here are two different wrappers:
>
> fun.1 <- function(formula) {
>    summary(aov(formula))
> }
>
> fun.2 <- function(formula) {
>    oneway.test(formula)
> }
>
> values <- c(15, 8, 17, 7, 26, 12, 8, 11, 16, 9, 16,
>            24, 20, 19, 9, 17, 11, 8, 15, 6, 14)
> group <- rep(1:3, each=7)
>
> # While the first wrapper works just fine:
> fun.1(values ~ group)
>
> # the second throws an error:
> fun.2(values ~ group)
> Error in substitute(formula)[[2]] : object is not subsettable
>
> ###
>
> I also tried binding the two vectors in a data.frame, with no avail.
> I did find a hack, creating two new vectors inside the function and creating a
> fresh formula, so I presume this has something to do with environments.
>
> Could anybody give me a hint on this?
> Thank you,
> Adrian
>
>

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



More information about the R-help mailing list