无法将“for”循环转换为“apply”函数

Can't Convert `for` Loop to `apply` Function

我已经将过去发现的 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])
  })

有人看到这个错误吗?

因为您需要上一步的结果(例如 z[i+1]=f(z[i] ),所以您不能使用 sapply 哪些结果在所有步骤结束时可用。

为此,您可以使用 purrr 包中的 accumulate:

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

其中 ~ 定义了一个带有 2 个参数(. 和 .y)的函数,.从上一步重新注入,.y 是下一步值

为了更好地理解尝试:

purrr::accumulate(1:n, ~.)
purrr::accumulate(1:n, ~.y)