[R] Function with 'data' parameter
Greg Pyle (Secretary)
chaoborid at gmail.com
Mon Feb 23 05:52:20 CET 2009
Thanks, worked like a charm.
Greg.
On Feb 22, 1:58 pm, Gavin Simpson <gavin.simp... at ucl.ac.uk> wrote:
> On Sun, 2009-02-22 at 20:52 +1100, Jim Lemon wrote:
> > Greg wrote:
> > > I'm trying to write a simple function with a data parameter.
>
> > > tfun <- function(x, y, data = NULL) {
> > > if(missing(data))
> > > dt <- data.frame(x=x, group=y)
> > > else {
> > > dt <- with(data, data.frame(x=x, group=y))
> > > }
>
> > > return(dt)
> > > }
>
> > > If I pass variables "weight" and "grp" from a data.frame, d, like
> > > this: tfun(d$weight, d$grp), the function works. However, if I try to
> > > do the same thing by supplying d, like this: tfun(weight, grp,
> > > data=d), I receive the following error:
>
> > > Error in data.frame(x = x, group = y) : object "weight" not found
>
> > > Can someone please tell me what I'm doing wrong?
>
> > Hi Greg,
> > In your function definition, the data argument isn't missing, it's NULL.
> > You have to test like this:
>
> > if(is.null(data)) ...
>
> > Does that fix it?
>
> No, because x and y are still being evaluated and are not present
> anywhere but within 'd'. (I converted the function definition to
> function(x, y, data) and checked that it was executing the else clause
> when data was *not* missing.)
>
> You could do:
>
> ## dummy data
> set.seed(1234)
> d <- data.frame(weight = rnorm(10),
> grp = rnorm(10))
>
> tfun2 <- function(x, y, data) {
> x <- deparse(substitute(x))
> y <- deparse(substitute(y))
> if(missing(data))
> dt <- data.frame(x=x, group=y)
> else {
> dt <- with(data, data.frame(x=data[[x]], group=data[[y]]))
> }
> return(dt)
>
> }
>
> tfun2(weight, grp, data = d)
>
> but that seems a little ugly. Alternatively, make use of a model formula
> and in-built functionality
>
> tfun3 <- function(formula, data) {
> dat <- model.frame(formula, data)
> names(dat) <- c("x", "group")
> return(dat)
>
> }
>
> tfun3(weight ~ grp, data = d)
>
> HTH
>
> G
>
> --
> %~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%
> Dr. Gavin Simpson [t] +44 (0)20 7679 0522
> ECRC, UCL Geography, [f] +44 (0)20 7679 0565
> Pearson Building, [e] gavin.simpsonATNOSPAMucl.ac.uk
> Gower Street, London [w]http://www.ucl.ac.uk/~ucfagls/
> UK. WC1E 6BT. [w]http://www.freshwaters.org.uk
> %~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%
>
> signature.asc
> < 1KViewDownload
>
> ______________________________________________
> R-h... at r-project.org mailing listhttps://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guidehttp://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
More information about the R-help
mailing list