Re: [R] Function with 'data' parameter

2009-02-23 Thread Greg Pyle (Secretary)
Thanks, worked like a charm.

Greg.

On Feb 22, 1:58 pm, Gavin Simpson gavin.simp...@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...@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.

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


Re: [R] Function with 'data' parameter

2009-02-22 Thread Jim Lemon

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?

Jim

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


Re: [R] Function with 'data' parameter

2009-02-22 Thread Gavin Simpson
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
Description: This is a digitally signed message part
__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.