On Tue, 2004-02-24 at 09:32, li dongfeng wrote: > Hi there, > > I have just found that the ``attach'' function > can get you into trouble when called many times. > For example, you have a simulation routine called ``f()'', > in which you used ``attach'' and no corresponding ``detach''. > Then you call this function many times. You will find that > the system performance get slower and slower, > because you are making the R search path longer and longer. > So be careful when you use attach in a function! > > Below is a demonstration of this performance loss, > you will see a linear growth in CPU time usage. > Adding a ``detach()'' call at the end of ``f'' > will get rid of this problem. > > ############################### > f <- function(){ > theta <- list(one=2.0, two=0.3, three=0.4) > attach(theta) > x <- c(one, two, three) > sample(x, 1) > } > > test <- function(n=400){ > timeu <- numeric(n) > for(i in seq(n)){ > timeu[i] <- > system.time({ > resi <- f() > })[3] > } > plot(timeu) > } > test() > ##############################
A better general and more efficient solution, without getting into the details of the above functions, would be to use with() instead of attach()/detach(). Change your function 'f' to: f <- function(){ theta <- list(one = 2.0, two = 0.3, three = 0.4) x <- with(theta, c(one, two, three)) sample(x, 1) } Now run test() using with() versus attach()/detach() and note the time savings. Even with the detach() it is not "efficient". For example using: f <- function(){ theta <- list(one = 2.0, two = 0.3, three = 0.4) attach(theta) x <- c(one, two, three) sample(x, 1) detach(theta) } > system.time(test()) [1] 38.54 0.02 38.92 0.00 0.00 versus using: f <- function(){ theta <- list(one = 2.0, two = 0.3, three = 0.4) x <- with(theta, c(one, two, three)) sample(x, 1) } > system.time(test()) [1] 0.16 0.00 0.16 0.00 0.00 Those are on a 3.2 Ghz P4 Dell 5150 laptop with 2 GB of RAM for comparison. See ?with for more information. You will find relatively recent posts on this in the list archives as a preferred approach. HTH, Marc Schwartz ______________________________________________ [EMAIL PROTECTED] mailing list https://www.stat.math.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html