[R] function environment
Prof Brian Ripley
ripley at stats.ox.ac.uk
Fri Jun 2 18:48:40 CEST 2006
On Fri, 2 Jun 2006, Matthias Braeunig wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Hi,
>
> how can I automatically access the functions that I loaded into a
> separate environment?
This is a topic that is probably best suited to R-devel: the explanations
are going to get technical, and I am not being comprehensive here.
>> save(A,B,file="myfun.r")
>> load("myfun.r",envir=(ENV<-new.env()))
>> ls(ENV)
> [1] "A" "B"
>
> ?"[" turned up that I can access the functions via
>
>> ENV$A
> function ()
> {
> }
>> ENV$A()
> NULL
>
> Now, how can they be included in the search() path??
> attach() as for data.frames does not work...
Actually, it does. attach() for a list creates an environment and copies
the elements of a list to it. Try
attach("myfun.r", pos=2)
or more explicitly
env <- attach(NULL pos=2, name="myenv")
load("myfun.r", envir=env)
which both create an environment and unserialize the objects/bindings into
it.
We have discussed allowing an environment to be given as an argument of
attach, but the semantics are not clear: should the environment itself be
attached or a copy (as for a list). It seems that a copy would be most
natural.
Since loading a package clearly does load objects into an environment on
the search path, there are other sneaky games you can play if you know
what you are doing.
> Furthermore, if I change a functions environment to ENV, why is it not
> listed with ls(ENV)?? Instead it still lives in .GlobalEnv
Because that sets the enclosing environment, not the frame in which the
symbol is resolved. There are at least three possible sources of
confusion here:
1) `environment' gets used in two senses in R documentation, one as a
frame and one as an environment tree, that is as a frame and its enclosure
(and so on recursively).
2) Note that objects do not really `live' in environments: symbols in
frames have values and an object can be the value of several symbols.
(People talk about bindings here: there are symbols are bound to objects,
but objects can be bound to multiple symbols.)
3) Closures (most functions, including all user-written functions) have
formals, a body, and an environment tree `attached to' or `associated
with' the function. This is called the 'environment' of the function, but
the 'enclosure' might be less confusing (since it acts as the enclosure of
the frame created for the body of the function when it is evaluated).
--
Brian D. Ripley, ripley at stats.ox.ac.uk
Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
University of Oxford, Tel: +44 1865 272861 (self)
1 South Parks Road, +44 1865 272866 (PA)
Oxford OX1 3TG, UK Fax: +44 1865 272595
More information about the R-help
mailing list