# [R] generate a series of fucntion

Jim Rogers jrogers at cantatapharm.com
Tue Jul 22 14:41:15 CEST 2003

```You need to be careful if you take the approach below. Try it:

> g1 <- list(function(x) log(x), function(x) log(x+1), function(x) x,
function(x) x^2)
> g2 <- lapply(g1, function(g) {
+   function(x,t) exp(-t-t*g(x)-t*g(1+x))
+ }
+              )
> lapply(g2, function(f) get("g", environment(f)))
[]
function(x) x^2

[]
function(x) x^2

[]
function(x) x^2

[]
function(x) x^2

Because of lazy evaluation + lexical scoping, "g" doesn't get evaluated
where you would naturally think.

To avoid this, you can do:

> g2 <- lapply(g1, function(g) {
+   g  # or, for readability, force(g), as of R 1.7.0
+   function(x,t) exp(-t-t*g(x)-t*g(1+x))
+ }
+              )
> lapply(g2, function(f) get("g", environment(f)))
[]
function(x) log(x)

[]
function(x) log(x+1)

[]
function(x) x

[]
function(x) x^2

I was first confused by this a few months back, and Luke Tierney, Robert
Gentleman, and Thomas Lumley were kind enough to explain it to me. If
you want to find that thread, do an R site search for "lexical scoping
Jim Rogers".

Cheers,
Jim

> Message: 43
> Date: Mon, 21 Jul 2003 16:15:35 -0400
> From: "Liaw, Andy" <andy_liaw at merck.com>
> Subject: RE: [R] generate a series of fucntion
> To: "'ximing wu'" <xiwu at uoguelph.ca>
> Cc: "'r-help at stat.math.ethz.ch'" <r-help at stat.math.ethz.ch>
> Message-ID:
> 	<3A822319EB35174CA3714066D590DCD50205C8E3 at usrymx25.merck.com>
> Content-Type: text/plain
>
> Does this do sort of what you want?
>
> > g1 <- list(function(x) log(x), function(x) log(x+1), function(x) x,
> function(x) x^2)
> > g1
> []
> function(x) log(x)
>
> []
> function(x) log(x+1)
>
> []
> function(x) x
>
> []
> function(x) x^2
>
> > lapply(g1, function(g) {function(x,t)
exp(-t-t2*g(x)-t*g(1+x))})
> []
> function(x,t) exp(-t-t2*g(x)-t*g(1+x))
> <environment: 022BCBD8>
>
> []
> function(x,t) exp(-t-t2*g(x)-t*g(1+x))
> <environment: 022BBD08>
>
> []
> function(x,t) exp(-t-t2*g(x)-t*g(1+x))
> <environment: 022BBDCC>
>
> []
> function(x,t) exp(-t-t2*g(x)-t*g(1+x))
> <environment: 022BBE90>
>
> You did not say what g1 and g2 actually are, but I suppose the above
should
> give you enough hint.
>
> Andy
>
> > -----Original Message-----
> > From: ximing wu [mailto:xiwu at uoguelph.ca]
> > Sent: Monday, July 21, 2003 3:54 PM
> > To: r-help at stat.math.ethz.ch
> > Subject: [R] generate a series of fucntion
> >
> >
> > Hi there,
> >
> > I want to generate a large amount of functions,
> >
> > say f=function(x,t) exp(-t-t*g_1(x)-t*g_2(1+x))
> >
> > where g_1(x) and g_2(x) are from a long list of moments, such
> > as x, x^2,
> > log(x), log(1+x) .. and so on.
> >
> > Any suggestions on how to do this efficiently?
> >
> > thanks a lot.
> >
> > x.w
> >
> > ______________________________________________
> > R-help at stat.math.ethz.ch mailing list
> > https://www.stat.math.ethz.ch/mailman/listinfo> /r-help
> >

James A. Rogers, Ph.D. <rogers at cantatapharm.com>
Statistical Scientist
Cantata Pharmaceuticals
300 Technology Square, 5th floor
Cambridge, MA  02139
617.225.9009 x312
Fax 617.225.9010

```