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.

Reply via email to