R具有折叠功能Reduce.是否有相应的展开功能?比如说,给定一个起始值并递归地应用函数来获取数组? for循环将完成这项工作,只是想知道是否有更多类似R的方式.谢谢,
一个例子,下面的代码用8行绘制lorenz attractor(模仿F# Lorenz Attractor in 35 lines.但for循环看起来很难看.我们能做得更好吗?
s <- 10; b <- 8/3; p <- 28
dt <- 0.003; n<-2000
x <- matrix(0,n,3); x[1,] <- c(10,0,20)
for (i in 2:n){
x[i,] <- x[i-1,] + c(s * (x[i-1,2] - x[i-1,1]),x[i-1,1] * (p - x[i-1,3]) - x[i-1,2],x[i-1,1] * x[i-1,2] - b * x[i-1,3]) * dt
}
library(rgl)
plot3d(x,type= 'l',col = 'red')
最佳答案 怎么样
n<-2000
params <- list(s=10,b=8/3,p=28,dt=0.003)
X0 <- X <- c(x=10,y=0,z=20)
itfun <- function(X) {
with(c(as.list(X),params),
X + c(s*(y-x),x*(p-z)-y,x*y-b*z)*dt)
}
Xmat <- rbind(X0,t(replicate(n,X <<- itfun(X))))
library(rgl)
plot3d(Xmat,type= 'l',col = 'red')
或(纳入评论的回答)
do.call(rbind,
Reduce(function(X, i) {
with(c(params, as.list(X)),
X + c(s*(y-x),x*(p-z)-y,x*y-b*z)*dt)
},
seq(n), X, accumulate=TRUE)[-1])
PS你怎么算线?如果你使用足够的分号,你可以在一行上完成整个事情:-)我在你的代码中计算11个语句
编辑:缺少x更新中的一些括号