Skip to content

be careful: using attach in R functions

5 messages · Li Dongfeng, Marc Schwartz, Thomas Petzoldt +2 more

#
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()
##############################


¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Li Dongfeng
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ldf-nospacm at math.pku.edu.cn
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡2004-02-24
#
On Tue, 2004-02-24 at 09:32, li dongfeng wrote:
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)
}
[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)
}
[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
#
li dongfeng wrote:
[..]
Yes, this behaviour is well known (to me using attach for differential
equation models long ago). Detaching ist absolutely required. As an
alternative one can use the with() function.

Thomas P.
#
li dongfeng wrote:
Well, attach() may be useful for convenient interactive data analysis.
I'd never use it in a simulation, since you can access all objects
without attaching anything. 
(Well, I suggest not to use it at all, at least to our students ... and
I'm using it only in very rare cases myself.)

Uwe Ligges
#
Using attach() in this context may not be wise.  I tend to only use 
attach() when working interactively.  It might be better to use with() 
in this situation, such as

f <- function() {
	theta <- list(one=2.0, two=0.3, three=0.4)
	x <- with(theta, c(one, two, three))
	sample(x, 1)
}

-roger
li dongfeng wrote: