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

时间:2017-01-17 22:41:12

标签: r for-loop sapply

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

有人看到这个错误吗?

1 个答案:

答案 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)