развернуть функцию в R? - PullRequest
       13

развернуть функцию в R?

4 голосов
/ 14 декабря 2010

R имеет функцию сгиба Reduce. есть ли соответствующая функция раскрытия? скажем, учитывая начальное значение и рекурсивно применить функцию, чтобы получить массив? Цикл for сделает эту работу, просто задаваясь вопросом, есть ли более R-подобный способ для этого. спасибо,

Например, приведенный ниже код изображает аттрактор Лоренца в 8 строках (имитирует F # Атрибут Лоренца в 35 строках . Но цикл 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')

1 Ответ

2 голосов
/ 14 декабря 2010

Как насчет

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 операторов

edit : в обновлении x отсутствует

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...