Skip to content

Why is there no within.environment function?

5 messages · Richard Cotton, Gabor Grothendieck, William Dunlap +2 more

#
If I want to assign some variables into an environment, it seems
natural to do something like

e <- new.env()
within(e,
    {
      x <- 1:5
      y <- runif(5)
    }
)

This throws an error, since within.environment doesn't exist.? I
realise I can work around it using

as.environment(within(as.list(e),
    {
      x <- 1:5
      y <- runif(5)
    }
))

Just wondering why I can't use within directly with environments.

--
4dpiecharts.com
#
On Wed, Mar 21, 2012 at 5:51 PM, Richard Cotton <richierocks at gmail.com> wrote:
'with' already does that:

e <- new.env()
with(e, {
   x <- 1.5
   y <- runif(5)
})
ls(e) # lists x and y

Also since proto objects are environments this works:

library(proto)
p <- proto(x = 1.5, y = runif(5))
p$ls() # lists x and y
#
Wouldn't within.environment be identical to with.environment?
  > e <- new.env()
  > with(e, { One <- 1 ; Two <- 2+2i ; Theee <- One + Two })
  > objects(e)
  [1] "One"   "Theee" "Two"
It might make the transition between lists and environments
simpler if within.environment  existed.

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com
#
On Mar 21, 2012, at 23:01 , William Dunlap wrote:

            
evalq() would be rather more to the point. Then again, with() _is_ really just a sugar-coated evalq(). 

within() was quite specifically created because you couldn't do the same kind of things with data frames that you could do with environments, so the current thread does seem a bit peculiar to me... (The original design of within() would modify the object in-place, like fix(), but Luke objected.)

  
    
#
On Wed, 2012-03-21 at 22:01 +0000, William Dunlap wrote:
One doesn't normally think of `with()` as changing it's `data` argument,
which might be one reason the connection to `with.environment()` was not
made here.
+ A <- 1:3
+ B <- 1:3
+ })
data frame with 0 columns and 0 rows

The behaviour of `with.environment()` makes sense once you think about
it as there is only one environment `e` (from your example), and when it
is updated during the call to `with()` it isn't a copy that is being
updated but the real thing. So I can see why it was overlooked.

G