In current versions of R the apply functions do not gain much (if any) in
speed over a well written for loop (the for loops are much more efficient
than they used to be).

Using global variables could actually slow things down a little for what
you are doing, if you use `<<-` then it has to search through multiple
environments to find which to replace.

In general you should avoid using global variables.  It is best to pass all
needed variables into a function as arguments, do any modifications
internally inside the function on local copies, then return the modified
local copy from the function (you can use a list if you want to return
multiple variables).

Since each iteration of your code depends on the previous iteration,
vectorizing is not going to help (or even be reasonable).

If you want to speed up the code then you might consider a compiled option,
see the inline or rcpp packages (or others).


On Thu, Dec 27, 2012 at 1:38 PM, Sam Steingold <sds@gnu.org> 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:
>
> --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")
> }
> 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.
>
> so,
> 1. is there a way for a function to modify a global variable?
> 2. how would you vectorize this loop?
>
> thanks!
>
> --
> Sam Steingold (http://sds.podval.org/) on Ubuntu 12.04 (precise) X
> 11.0.11103000
> http://www.childpsy.net/ http://honestreporting.com
> http://pmw.org.il http://www.PetitionOnline.com/tap12009/
> A number problem "solved" with floats turns into 1.9999999999999998
> problems.
>
> ______________________________________________
> 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.
>



-- 
Gregory (Greg) L. Snow Ph.D.
538280@gmail.com

	[[alternative HTML version deleted]]


