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.