Re: [R] source() vs attach()0

2009-11-11 Thread Stefan Zeugner


Duncan Murdoch wrote:

Just declaring it there is the only reasonable way, i.e.

test-function(foo) {
  subtest - function() {
 foo - foo+1
  }
  subtest()
  return(foo)
}

The reason you can't somehow assign it within an existing test is that 
subtest is a different closure every time.  Its environment will be 
the local frame of the call to test, so the foo on the right hand 
side of the assignment will be the value that was passed to test.


An unreasonable way to get what you want is to mess with the 
environment, e.g.


subtest - function() {
   foo - foo+1
}

test - function(foo) {
   mysubtest - subtest  # make a local copy
   environment(mysubtest) - environment()  # attach the local frame

   mysubtest()
   return(foo)
}

This is ugly programming, likely to bite you at some future date.

Duncan Murdoch



Duncan,
Thank you a lot for this clarification.
Unfortunately, I have to get through this at the moment: I have 
subfunctions that are to be used by in the environments of several 
'main' functions: and I prefer not to declare them separately each time.

Therefore I will have to mess with the environment (for now) :-(

In this case, would it be wiser to shift the 'environment messing' to 
the subfunction?
I.e. tell it to manipulate its respective parent environment, as in the 
example below?


subtest - function() {
eval(expression(foo - foo+1),parent.frame())
}

test - function(foo) {
  subtest()
  return(foo)
}


Stefan

__
R-help@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] source() vs attach()0

2009-11-10 Thread Stefan Zeugner

Hello,
After hours of googling I could not resolve the following (although it 
seems simple):


I would like to put subfunctions in a separate .R file that is then 
called with source() from inside several main functions. A crude 
example would be as follows:


 file subtest.R **
subtest - function() {
 foo - foo+1
 }
**


*** main function 
test-function(foo) {
 source(test.R,local=TRUE)
 subtest()
 return(foo)
 }
**

Then executing the code
 test(1)
works as prescribed.
But of course, each function call to test() 'sources' (i.e. parse() and 
eval()) the file subtest.R again and again. (try e.g. changing line 2 in 
subtest.R to 'foo- foo +2' and run 'test(1)' )



How can I 'attach' the function subtest inside the main function, such 
that it is not evaluated again at each function call?


And this while maintaining the above 'subfunction' functionality (i.e. 
attaching the subfunction under the right environment)?


I was not able to resolve that - thanks in advance for any help!

all the best
Stefan

__
R-help@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.