R中的展开函数?

R中的展开函数?,r,R,R具有折叠功能Reduce。是否有相应的展开功能?比如,给定一个起始值,然后递归地应用一个函数来获得一个数组?for循环将完成这项工作,只是想知道是否有更多类似于R的方法。谢谢 例如,下面的代码将洛伦兹吸引子绘制成8行(模拟)。但是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

R具有折叠功能
Reduce
。是否有相应的展开功能?比如,给定一个起始值,然后递归地应用一个函数来获得一个数组?for循环将完成这项工作,只是想知道是否有更多类似于R的方法。谢谢

例如,下面的代码将洛伦兹吸引子绘制成8行(模拟)。但是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')
s怎么样

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')
你怎么计算行数?如果你使用足够的分号,你可以在一行中完成全部工作:-)我在你的代码中计算了11条语句


edit:在
x
update

中缺少一些括号。注意
Reduce
累计
参数。例如,以本的答案为基础:
do.call(rbind,Reduce(function(X,i))和(c(params,as.list(X)),X+c(s*y-X,X*(p-z)-y,X*y-b*z)*dt 1:n,X,accum=T[-1])
@Ben Bolker-我没有得到与你的代码相同的答案(或绘图)@汤米:好眼力。现在修好了。应该是
s*(y-x)
,而不是
s*y-x
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])