From h.wickham at gmail.com  Fri Mar  7 21:15:26 2008
From: h.wickham at gmail.com (hadley wickham)
Date: Fri, 7 Mar 2008 14:15:26 -0600
Subject: [Rd] merging environments
In-Reply-To: <47D1912A.3010802@zoo.ufl.edu>
References: <47D1912A.3010802@zoo.ufl.edu>
Message-ID: <f8e6ff050803071215t60361eacqba698d332a574e20@mail.gmail.com>

2008/3/7 Ben Bolker <bolker at zoo.ufl.edu>:
>
>    Despite the spirited arguments of various R-core folks
>  who feel that mle() doesn't need a "data" argument, and
>  that users would be better off learning to deal with function
>  closures, I am *still* trying to make such things work
>  in a reasonably smooth fashion ...
>
>    Is there a standard idiom for "merging" environments?
>  i.e., suppose a function has an environment that I want
>  to preserve, but _add_ the contents of a data list --
>  would something like this do it? Is there a less ugly
>  way?
>
>  x <- 0
>  y <- 1
>  z <- 2
>
>  f <- function() {
>      x+y+z
>  }
>
>  f2 <- function(fun,data) {
>      L <- ls(pos=environment(fun))
>      mapply(assign,names(data),data,
>                       MoreArgs=list(envir=environment(fun)))
>      print(ls(pos=environment(fun)))
>  }
>
>  f2(f,list(a=1))

I think you're doomed to be ugly if you don't use closures - I think
any explicit manipulation of environments is worse than the implicit
manipulation by closures.

f <- function(data) with(data, x + y + z)
f2 <- function(fun, data) function() fun(data)

f2(f, list(x = 10))()

Although it would be even nicer if you could do:

f <- function()  x + y + z
f2 <- function(fun, data) function() with(data, fun())

but I think that's confusing different types of scoping.

Hadley
-- 
http://had.co.nz/



[Rd] merging environments
hadley wickham