[R] be careful: using attach in R functions
Marc Schwartz
MSchwartz at medanalytics.com
Tue Feb 24 19:48:27 CET 2004
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
More information about the R-help
mailing list