2017-11-25 8 views
1

単純移動平均(SMA)と指数移動平均(EMA)を計算する関数を作成したいと考えています。Rの再帰関数の中で定数変数を定義するにはどうすればよいですか?

私の問題はEMAの実装にあります。私はその引数の1つと等しい再帰関数内に定数変数を設定したいと思います。ここ

は私のコードである:

#SMA 
sma <- function(P,t,n) 
{ 
    return(sum(P[(t-n):(t-1)])/n) 
} 

#EMA 
recursive.ema <- function(P,t,n) 
{ 
    # Here I want to create a constant variable that keeps in memory the first 
    # value of t, i.e. the value of t before the first recursion, so I can use 
    # it as argument of sma function. 
    # Something similar to this: tmp <- t (t given from outside the function) 

    b <- 2/(n+1) 
    if (t == 1) 
    { 
    return(b*P[1] + (1-b)*sma(P,tmp,n)) 
    } 
    return (b*P[t] + (1-b)*recursive.ema(P,t-1,n)) 
} 

ここでPは、価格のベクトル、時系列であり、tはベクトルのインデックス、私のモデルの時間であり、そしてnは任意の正の数である、に対応します時刻tでの遅れ時間。

+0

これは機能しません。これを実行するとどうなりますか? 'P'、' t'、 'n'の値をいくつか与えることもできます。 – Suren

+0

投稿のコードが完全ではありません。私には助けが必要な部分があります(コメントを見てください)。私は 'recursive.ema < - function(P、t、n、tmp)'を作成することができましたが、確かに良いデザインがあると思いました。 – Zizou23

+0

'tmp < - t'(または' t [1] ')の何が問題なのですか? – r2evans

答えて

0

これは機能しますか?

e <-new.env() 
test<-TRUE 
assign("test",test,e) 

recursive.ema <- function(P,t,n) 
{ 
    test <-get("test",envir=e) 
    if (test) { 
    assign("t",t,envir=e) 
    assign("test",FALSE,envir=e) 
    } else { 
    t=get("t",envir=e) 
    } 
    b <- 2/(n+1) 
    if (t == 1) 
    { 
    return(b*P[1] + (1-b)*sma(P,tmp,n)) 
    } 
    return (b*P[t] + (1-b)*recursive.ema(P,t-1,n)) 
} 
関連する問題