[R] vectorization & modifying globals in functions

David Winsemius dwinsemius at comcast.net
Fri Dec 28 19:12:30 CET 2012


On Dec 27, 2012, at 12:38 PM, Sam Steingold wrote:

> I have the following code:
>
> --8<---------------cut here---------------start------------->8---
> d <- rep(10,10)
> for (i in 1:100) {
>  a <- sample.int(length(d), size = 2)
>  if (d[a[1]] >= 1) {
>    d[a[1]] <- d[a[1]] - 1
>    d[a[2]] <- d[a[2]] + 1
>  }
> }
> --8<---------------cut here---------------end--------------->8---
>
> it does what I want, i.e., modified vector d 100 times.
>
> Now, if I want to repeat this 1e6 times instead of 1e2 times, I want  
> to
> vectorize it for speed, so I do this:

You could get some modest improvement by "vectorizing" the two  
lookups, additions, and assignments into one:

      d[a] <- d[a]-c(1,-1)

In a test with 100000 iterations, it yields about a  1.693/1.394 -1  =  
21 percent improvement.
>
> --8<---------------cut here---------------start------------->8---
> update <- function (i) {
>  a <- sample.int(n.agents, size = 2)
>  if (d[a[1]] >= delta) {
>    d[a[1]] <- d[a[1]] - 1
>    d[a[2]] <- d[a[2]] + 1
>  }
>  entropy(d, unit="log2")

The `unit` seems likely to throw an error since there is no argument  
for it to match.

> }
> system.time(entropy.history <- sapply(1:1e6,update))
> --8<---------------cut here---------------end--------------->8---
>
> however, the global d is not modified, apparently update modifies the
> local copy.

You could have returned 'd' and the entropy result as a list. But what  
would be the point of saving 1e6 copies????

>
> so,
> 1. is there a way for a function to modify a global variable?

So if you replaced it in the global environment, you would only be  
seeing the result of the last iteration of the loop. What's the use of  
that????

> 2. how would you vectorize this loop?
>
> thanks!

-- 
David Winsemius, MD
Alameda, CA, USA




More information about the R-help mailing list