Peter Dalgaard <[EMAIL PROTECTED]> > > > Gabor Grothendieck <[EMAIL PROTECTED]> writes: > > > Thomas Lumley <tlumley <at> u.washington.edu> writes: > > > > > The distinction between "environment" and "frame" is important. The frame > > > is what you find things in with get(, inherits=FALSE) and the environment > > > uses get(, environment=TRUE). > > > > The thing I find odd about this one is that if we have: > > > > e <- new.env() > > e$x <- 1 > > f <- new.env(parent=e) > > f$x # gives an error > > (Actually not. I get NULL)
Sure. > > > > then I would have expected x to be returned since f is an environment > > and x is in that environment. On the other hand, if an environment > > is defined to be the same as a frame (and there is some other word for > > an environment and its ancestors) then the above notation makes sense. > > Why? f$x is documented to be basically equivalent to > get("x",f,inherits=FALSE). In contrast, > > > evalq(x,f) > [1] 1 > > works fine. Well this certainly is more environment-like if one defines environment as a frame plus ancestors but it does not address the issue that if f is an environment in that sense then $ "should" pick out its components. One can define + to mean subtraction but that's not natural. I agree that it would have been nice if environment had been used to mean a frame plus its ancestors and class(f) was "frame", not "environment" but, of course, that's not how it turned out. I think its better to maintain backward compatiblity as far as possible and make the terms suit rather than use environment in a way which is inconsistent with the way R works. In fact, it might have been nice if there were both a frame class and an environment class so one could have either behavior. With this new setup R might have worked like this: # create parent environment # (in the sense of frame+ancestors) & populate Pe <- new.env(): Pe$x <- 1 # create child environment Ce <- new.env(parent=Pe) # create corresponding frames Pf <- as.frame(Pe); Cf <- as.frame(Ce) # x exists in child environment exists(Ce$x) # TRUE # but not in child frame exists(Cf$x) # FALSE Unfortunately this can't be done without breaking backward compatibility although it would still be possible to come up with a new word for environment plus ancestors (call it the envlist class) using environment as a synonym for frame. In that case this example would become: # create parent using envlist class & populate Pel <- new.envlist(): Pela$x <- 1 # create child environment+ancestors class Cel <- new.envlist(parent=Pel) # create corresponding environments (in the sense of frames) Pe <- as.env(Pel); Ce <- as.env(Cel) # x exists in child environment exists(Cel$x) # TRUE # but not in child frame exists(Ce$x) # FALSE and this one is upwardly compatible with the current R. ______________________________________________ [EMAIL PROTECTED] mailing list https://www.stat.math.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html