副作用とapply系関数
細かいことは知らないけど、Rでは、とにかくforは使うべからず、apply系関数を使え、と叩きこまれている(誰に?)。分かった、分かったけど、じゃぁこんな時どうすんのよ?と、ずっと悩んでた。
temp <- 3
http://www.mathfinance.cn/R-sapply-problem
for (i in 1:10) {
x[i] <- x[i]-temp
z[i] <- mean(x[1:i])
temp <- x[i]-z[i]
}
永続付値を使えば出来るっぽい。
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とか使えば、呼び出しの順序は保証出来るかな。。。