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

______________________________________________
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