[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