我已将过去发现的for
个循环转换为apply
个函数,例如:
y <- 6:10
z <- 1:5
for(i in 1:length(y)){
z[i] <- y[i] * y[i]^2
}
z
z <- sapply(X = 1:length(y), FUN = function(i){
y[i] * y[i]^2
})
z
但是以下循环今天给了我一些问题:
lambda <- 2.9
n <- 20
z <- 1:n
x <- 0.02
z[1] <- x
for(i in 1:(n - 1)){
z[i + 1] <- lambda * z[i] * (1 - z[i])
}
z
z <- 1:n
z[1] <- x
sapply(X = 1:(n - 1), FUN = function(i){
lambda * z[i] * (1 - z[i])
})
有人看到这个错误吗?
答案 0 :(得分:2)
因为您需要上一步的结果(例如z [i + 1] = f(z [i]),所以您无法使用sapply
在所有步骤结束时可获得哪些结果。
为此,您可以使用包accumulate
中的purrr
:
purrr::accumulate(1:(n-1), ~(lambda * . * (1 - .)), .init=x)
[1] 0.0200000 0.0568400 0.1554667 0.3807608 0.6837678 0.6270652 0.6781778 0.6329327
[9] 0.6737538 0.6374479 0.6702134 0.6409794 0.6673619 0.6437710 0.6650567 0.6459932
[17] 0.6631894 0.6477708 0.6616750 0.6491974
where~定义一个带2个参数(。和.y)的函数。从上一步重新注入,.y是下一步的值
为了更好地理解尝试:
purrr::accumulate(1:n, ~.)
purrr::accumulate(1:n, ~.y)