[R] Comparing "transform" to "with"

Muenchen, Robert A (Bob) muenchen at utk.edu
Tue Sep 4 14:48:17 CEST 2007


Gabor, 

That's very nice! I like your my.transform much better. Too bad about
the incompatibility. Swapping that out would no doubt break some
existing programs. I love that old joke, "God was able to create the
universe in just 6 days only because he didn't have an installed base to
worry about!"

Cheers,
Bob

> -----Original Message-----
> From: Gabor Grothendieck [mailto:ggrothendieck at gmail.com]
> Sent: Sunday, September 02, 2007 10:47 AM
> To: Muenchen, Robert A (Bob)
> Cc: r-help at stat.math.ethz.ch
> Subject: Re: [R] Comparing "transform" to "with"
> 
> Try this version of transform.  In the first test we show
> it works on your example but we have used the head of the built in
> anscombe data set.  The second and third show that
> it necessarily is incompatible with transform because transform
> always looks up variables in DF first whereas my.transform looks
> up the computed ones first.
> 
> my.transform <- function(DF, ...) {
> 	f <- function(){}
> 	formals(f) <- eval(substitute(as.pairlist(c(alist(...), DF))))
> 	body(f) <- substitute(modifyList(DF, data.frame(...)))
> 	f()
> }
> 
> # test
> a <- head(anscombe)
> # 1
> my.transform(a, sum1 = x1+x2+x3+x4, sum2 = y1+y2+y3+y4, total =
> sum1+sum2)
> # 2
> my.transform(a, y2 = y1, y3 = y2)
> # 3
> transform(a, y2 = y1, y3 = y2) # different
> 
> 
> On 9/1/07, Muenchen, Robert A (Bob) <muenchen at utk.edu> wrote:
> > Hi All,
> >
> > I've been successfully using the with function for analyses and the
> > transform function for multiple transformations. Then I thought, why
> not
> > use "with" for both? I ran into problems & couldn't figure them out
> from
> > help files or books. So I created a simplified version of what I'm
> > doing:
> >
> > rm( list=ls() )
> > x1<-c(1,3,3)
> > x2<-c(3,2,1)
> > x3<-c(2,5,2)
> > x4<-c(5,6,9)
> > myDF<-data.frame(x1,x2,x3,x4)
> > rm(x1,x2,x3,x4)
> > ls()
> > myDF
> >
> > This creates two new variables just fine"
> >
> > transform(myDF,
> >  sum1=x1+x2,
> >  sum2=x3+x4
> > )
> >
> > This next code does not see sum1, so it appears that "transform"
> cannot
> > see the variables that it creates. Would I need to transform new
> > variables in a second pass?
> >
> > transform(myDF,
> >  sum1=x1+x2,
> >  sum2=x3+x4,
> >  total=sum1+sum2
> > )
> >
> > Next I'm trying the same thing using "with". It doesn't not work but
> > also does not generate error messages, giving me the impression that
> I'm
> > doing something truly idiotic:
> >
> > with(myDF, {
> >  sum1<-x1+x2
> >  sum2<-x3+x4
> >  total <- sum1+sum2
> > } )
> > myDF
> > ls()
> >
> > Then I thought, perhaps one of the advantages of "transform" is that
> it
> > works on the left side of the equation without using a longer name
> like
> > myDF$sum1. "with" probably doesn't do that, so I use the longer form
> > below. It also does not work and generates no error messages.
> >
> > # Try it again, writing vars to myDF explicitly.
> > # It generates no errors, and no results.
> > with(myDF, {
> >  myDF$sum1<-x1+x2
> >  myDF$sum2<-x3+x4
> >  myDF$total <- myDF$sum1+myDF$sum2
> > } )
> > myDF
> > ls()
> >
> > I would appreciate some advice about the relative roles of these two
> > functions & why my attempts with "with" have failed.
> >
> > Thanks!
> > Bob
> >
> > =========================================================
> > Bob Muenchen (pronounced Min'-chen), Manager
> > Statistical Consulting Center
> > U of TN Office of Information Technology
> > 200 Stokely Management Center, Knoxville, TN 37996-0520
> > Voice: (865) 974-5230
> > FAX: (865) 974-4810
> > Email: muenchen at utk.edu
> > Web: http://oit.utk.edu/scc,
> > News: http://listserv.utk.edu/archives/statnews.html
> >
> > ______________________________________________
> > R-help at stat.math.ethz.ch 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.
> >



More information about the R-help mailing list