[R] Putting an object in to a function that calls the current function

Gabor Grothendieck ggrothendieck at gmail.com
Wed Jan 4 18:10:17 CET 2006


Often situations like this can be represented using object
oriented concepts.  The data that you want to access that is
outside your function is wrapped in an object and the function
becomes a method of that object.

Using Duncan's example and the proto package we
define object oo with variable a and method s and
then invoke s.

library(proto)
oo <- proto(a = "init", s = function(.)  .$a <- "ok")
oo$a
oo$s()
oo$a

This could also be done using the R.oo package.

On 1/4/06, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
> On 1/4/2006 10:32 AM, Ales Ziberna wrote:
> > Thank you both (Duncan Murdoch and  Gabor Grotehendieck) for your answers.
> > Both work and my problem is solved.
> >
> > I do aggree with Duncan Murdoch that usually messing with the environment of
> > your caller is a bad idea. The reason why I still want to do it in this case
> > is that I exactly know which functions are calling (the function is NEVER
> > called directly) it and it was in this case easier to use this than to
> > modify each of the fuctions that are calling it.
>
> Using R's lexical scope may lead to a cleaner solution.  That is, you
> define the functions within the one that calls them; then a <<- "ok"
> would do what you want (provided "a" existed in the enclosure at the time).
>
> For example,
>
> f <- function() {
>        a <- "init"
>        s <- function() {
>                a <<- "ok"
>         }
>        s()
>        print(a)
> }
>
> Duncan Murdoch
>
> >
> > Thanks again!
> > Ales Ziberna
> >
> > -----Original Message-----
> > From: Duncan Murdoch [mailto:murdoch at stats.uwo.ca]
> > Sent: Wednesday, January 04, 2006 3:26 PM
> > To: Ales Ziberna
> > Cc: R-help
> > Subject: Re: [R] Putting an object in to a function that calls the current
> > function
> >
> > On 1/4/2006 9:14 AM, Ales Ziberna wrote:
> >> Hello!
> >>
> >> I would like to put an object in to a function that calls the current
> >> function.
> >>
> >> I thought the answer will be clear to me after reading the help files:
> >> ?assign
> >> ?sys.parent
> >>
> >> However it is not.
> >> Here is an example I thought should work, however it dose not exactly:
> >>
> >> f<-function(){s();print(a)}
> >> s<-function()assign(x="a",value="ok",pos=sys.parent())
> >> f() #I want to get "ok"
> >> a #I do not want "a" in global enviorment, so here I should get
> >> #Error: Object "a" not found
> >> ff<-function()f() #here I also want to get "ok" - it should not matter
> >> if the parent fuction has any parents
> >>
> >> Thank you in advance for suggestions!
> >
> > That's not a good idea.  Why would you want to do something like that?
> >
> > That out of the way, here's a function that does it:
> >
> > f<-function(){s();print(a)}
> > s<-function()assign(x="a",value="ok",env=parent.frame())
> >
> > The difference between pos=sys.parent() and env=parent.frame() is that the
> > pos is interpreted as a position in the search list (see ?assign), while
> > parent.frame() gives you the environment from the stack, equivalent to
> > sys.frame(sys.parent()).
> >
> > In R you're almost certainly better off working directly with environments,
> > rather than going through integer indexing the way you (used to?) have to do
> > in S-PLUS.
> >
> > Did I mention that messing with the environment of your caller is a bad
> > idea?  It's not yours, don't touch it.
> >
> > Duncan Murdoch
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
>




More information about the R-help mailing list