Try demo(scoping)
which shows a situation similar to the one Duncan describes but uses several functions. On 1/4/06, Ales Ziberna <[EMAIL PROTECTED]> wrote: > I do not belive this would work in my case, since as I said, the function is > called by several different functions. > > Ales Ziberna > > -----Original Message----- > From: Duncan Murdoch [mailto:[EMAIL PROTECTED] > Sent: Wednesday, January 04, 2006 5:05 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 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:[EMAIL PROTECTED] > > 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 > > ______________________________________________ > [email protected] mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html > ______________________________________________ [email protected] mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
