无法将“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)
我已经将过去发现的 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)