David Reiss
2009-Dec-09 21:54 UTC
[R] Fwd: Evaluating a function within a pre-defined environment?
Hi all, I have a somewhat confusing question that I was wondering if someone could help with. I have a pre-defined environment with some variables, and I would like to define a function, such that when it is called, it actually manipulates the variables in that environment, leaving them to be examined later. I see from the R language definition that "When a function is called, a new environment (called the evaluation environment) is created, whose enclosure (see Environment objects) is the environment from the function closure. This new environment is initially populated with the unevaluated arguments to the function; as evaluation proceeds, local variables are created within it." So basically, I think I am asking if it is possible to pre-create my own "evaluation environment" and have it retain the state that it was in at the end of the function call? Example: e <- new.env() e$x <- 3 f <- function(xx) x <- x + xx can I then call f(2) and have it leave e$x at 5 after the function returns? I know that environment(f) <- e goes part of the way, but I would like to let the function also write to the environment. Thanks for any advice. --David
Gabor Grothendieck
2009-Dec-09 22:36 UTC
[R] Fwd: Evaluating a function within a pre-defined environment?
e <- new.env() e$x <- 2 f <- function(a, e) { e$x <- e$x + a; e$x } f(3, e) e$x # 5 Another way to accomplish this is to use the proto package which puts the whole thing into an object oriented framework. See http://r-proto.googlecode.com library(proto) p <- proto(x = 2, f = function(this, a) { this$x <- this$x + a; this$x }) p$f(3) # 5 On Wed, Dec 9, 2009 at 4:54 PM, David Reiss <dreiss at systemsbiology.org> wrote:> Hi all, > > I have a somewhat confusing question that I was wondering if someone > could help with. I have a pre-defined environment with some variables, > and I would like to define a function, such that when it is called, it > actually manipulates the variables in that environment, leaving them > to be examined later. I see from the R language definition that > > "When a function is called, a new environment (called the evaluation > environment) is created, whose enclosure (see Environment objects) is > the environment from the function closure. This new environment is > initially populated with the unevaluated arguments to the function; as > evaluation proceeds, local variables are created within it." > > So basically, I think I am asking if it is possible to pre-create my > own "evaluation environment" and have it retain the state that it was > in at the end of the function call? > > Example: > > e <- new.env() > e$x <- 3 > f <- function(xx) x <- x + xx > > can I then call f(2) and have it leave e$x at 5 after the function > returns? I know that > > environment(f) <- e > > goes part of the way, but I would like to let the function also write > to the environment. > > Thanks for any advice. > > --David > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >
David Reiss
2009-Dec-09 22:48 UTC
[R] Fwd: Evaluating a function within a pre-defined environment?
Ideally I would like to be able to use the function f (in my example) as-is, without having to designate the environment as an argument, or to otherwise have to use "e$x" in the function body. thanks for any further advice... On Wed, Dec 9, 2009 at 2:36 PM, Gabor Grothendieck <ggrothendieck at gmail.com> wrote:> e <- new.env() > e$x <- 2 > f <- function(a, e) { e$x <- e$x + a; e$x } > f(3, e) > e$x # 5 > > Another way to accomplish this is to use the proto package which puts > the whole thing into an object oriented framework. ?See > http://r-proto.googlecode.com > > library(proto) > p <- proto(x = 2, f = function(this, a) { this$x <- this$x + a; this$x }) > p$f(3) # 5 > > > On Wed, Dec 9, 2009 at 4:54 PM, David Reiss <dreiss at systemsbiology.org> wrote: >> Hi all, >> >> I have a somewhat confusing question that I was wondering if someone >> could help with. I have a pre-defined environment with some variables, >> and I would like to define a function, such that when it is called, it >> actually manipulates the variables in that environment, leaving them >> to be examined later. I see from the R language definition that >> >> "When a function is called, a new environment (called the evaluation >> environment) is created, whose enclosure (see Environment objects) is >> the environment from the function closure. This new environment is >> initially populated with the unevaluated arguments to the function; as >> evaluation proceeds, local variables are created within it." >> >> So basically, I think I am asking if it is possible to pre-create my >> own "evaluation environment" and have it retain the state that it was >> in at the end of the function call? >> >> Example: >> >> e <- new.env() >> e$x <- 3 >> f <- function(xx) x <- x + xx >> >> can I then call f(2) and have it leave e$x at 5 after the function >> returns? I know that >> >> environment(f) <- e >> >> goes part of the way, but I would like to let the function also write >> to the environment. >> >> Thanks for any advice. >> >> --David >> >> ______________________________________________ >> R-help at r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html >> and provide commented, minimal, self-contained, reproducible code. >> >
Charles C. Berry
2009-Dec-10 01:05 UTC
[R] Fwd: Evaluating a function within a pre-defined environment?
On Wed, 9 Dec 2009, David Reiss wrote:> Ideally I would like to be able to use the function f (in my example) > as-is, without having to designate the environment as an argument, or > to otherwise have to use "e$x" in the function body. > > thanks for any further advice...Perhaps you want something along the lines of the open.account example of R-intro 10.7 Scope ?? Chuck> > On Wed, Dec 9, 2009 at 2:36 PM, Gabor Grothendieck > <ggrothendieck at gmail.com> wrote: >> e <- new.env() >> e$x <- 2 >> f <- function(a, e) { e$x <- e$x + a; e$x } >> f(3, e) >> e$x # 5 >> >> Another way to accomplish this is to use the proto package which puts >> the whole thing into an object oriented framework. ?See >> http://r-proto.googlecode.com >> >> library(proto) >> p <- proto(x = 2, f = function(this, a) { this$x <- this$x + a; this$x }) >> p$f(3) # 5 >> >> >> On Wed, Dec 9, 2009 at 4:54 PM, David Reiss <dreiss at systemsbiology.org> wrote: >>> Hi all, >>> >>> I have a somewhat confusing question that I was wondering if someone >>> could help with. I have a pre-defined environment with some variables, >>> and I would like to define a function, such that when it is called, it >>> actually manipulates the variables in that environment, leaving them >>> to be examined later. I see from the R language definition that >>> >>> "When a function is called, a new environment (called the evaluation >>> environment) is created, whose enclosure (see Environment objects) is >>> the environment from the function closure. This new environment is >>> initially populated with the unevaluated arguments to the function; as >>> evaluation proceeds, local variables are created within it." >>> >>> So basically, I think I am asking if it is possible to pre-create my >>> own "evaluation environment" and have it retain the state that it was >>> in at the end of the function call? >>> >>> Example: >>> >>> e <- new.env() >>> e$x <- 3 >>> f <- function(xx) x <- x + xx >>> >>> can I then call f(2) and have it leave e$x at 5 after the function >>> returns? I know that >>> >>> environment(f) <- e >>> >>> goes part of the way, but I would like to let the function also write >>> to the environment. >>> >>> Thanks for any advice. >>> >>> --David >>> >>> ______________________________________________ >>> R-help at r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-help >>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html >>> and provide commented, minimal, self-contained, reproducible code. >>> >> > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >Charles C. Berry (858) 534-2098 Dept of Family/Preventive Medicine E mailto:cberry at tajo.ucsd.edu UC San Diego http://famprevmed.ucsd.edu/faculty/cberry/ La Jolla, San Diego 92093-0901