副作用とapply系関数

細かいことは知らないけど、Rでは、とにかくforは使うべからず、apply系関数を使え、と叩きこまれている(誰に?)。分かった、分かったけど、じゃぁこんな時どうすんのよ?と、ずっと悩んでた。

temp <- 3
for (i in 1:10) {
x[i] <- x[i]-temp
z[i] <- mean(x[1:i])
temp <- x[i]-z[i]
}

http://www.mathfinance.cn/R-sapply-problem

永続付値を使えば出来るっぽい。

temp.ini <- 3
x.ini <- rnorm(10)

## for loop version
temp <- temp.ini
x <- x.ini
z <- NA
for(i in 1:length(x)){
  x[i] <- x[i] - temp
  z[i] <- mean(x[1:i])
  temp <- x[i] - z[i]
}

## vectorized version
make.func <- function(temp, x){
  z <- NA
  function(i){
    x[i] <<- x[i] - temp
    z[i] <<- mean(x[1:i])
    temp <<- x[i] - z[i]
    list(temp=temp, x=x, z=z)
  }
}

func <- make.func(temp.ini, x.ini)
l <- sapply(1:length(x.ini), func, simplify=F)

## check of result
all(temp == l[[10]]$temp)
all(x == l[[10]]$x)
all(z == l[[10]]$z)

しかし、これは sapply(1:10, func) が func(1), func(2), ...という順番でfuncを呼ぶことを期待している。期待しているんだけど、期待しても良いんだろうか?
Reduceとかrepeatとか使えば、呼び出しの順序は保証出来るかな。。。