2017-09-08 7 views
0

Shinyサーバのforループで問題が発生しましたが、今までにどのように修正するのか誰も気づくことができません。私はこれを数日間は続けてきましたが、まだ進歩はありませんでした。長い話をすると、次のコードを見てください。私はGoogle Financeからデータを取得しようとしていて、平滑化された分散を計算しました。Shinyの内部ループ機能のために

stock2 <- 
    reactive(
     getSymbols(
     toupper(input$ticker2), 
     from = as.Date(input$date2[1]) - 150, 
     to = input$date2[2], 
     src = "google", 
     auto.assign = F 
    ) 
    ) 

    stock3 <- reactive(as.data.table(stock2())) 
    stock <- reactive(as.data.frame(stock3())) 
    stock.return <- reactive(diff(log(stock()[, 5]))) 
    stock.mu <- reactive(mean(stock.return())) 
    stock.var <- reactive((stock.return() - stock.mu())^2) 
    stock.var.smoothed <- reactive(rep(0, length(stock.return()))) 

上記のコードは完全にうまく動作し、私はそれをテストしました。

問題は次のコードなので、計算に基づいてベクトルを割り当てたいが、それを行う正しい方法がわからない。

stock.var.smoothed <- reactive({ 
    for (i in 2:length(stock.var())) { 
     stock.var.smoothed[1] <<- stock.var()[1] 
     stock.var.smoothed[i] <<- 
     (1 - input$alpha) * stock.var.smoothed()[i - 1] + input$alpha * stock.var()[i] 
    } 
    }) 

forループはまったく機能しません。 エラーコードは

エラーです:タイプのオブジェクトの閉鎖は「

subsettableはありませんが、私はすでに(使用)関数内の変数のために。だから私はそれをどのように修正するのか分かりません。

ところで、私はまた、次のコード

for (i in 2:length(stock.return())) { 
    stock.momentum.smoothed[1] <- reactive(stock.momentum()[1]) 
    stock.momentum.smoothed[i] <- 
    reactive((1 - input$beta) * stock.momentum.smoothed()[i - 1] + input$beta * stock.return()[i]) 
} 

エラーコードがアクティブ反応コンテキストなしで許可されていない

動作である試しました。 (あなたは反応式やオブザーバーの中からのみ行うことができたことをしようとしました)

何か助けてもらえたらうれしいです。ありがとうございました!

+0

'stock.var.smoothed'は、「リアクティブ」オブジェクトです。言い換えれば、それは関数であり、Rが正しく言うように、それをサブセット化することはできません。あなたはそれを*呼び出す必要があり、結果をサブセット化する必要があります。 –

+0

お返事ありがとうございます。それをどう呼ぶか教えてください。私は完全に空白です。 – Arthur

+0

または、Shinyのベクトルのforループをどのように書くことができますか? – Arthur

答えて

3

リセッション(stock.var.smoothed[1] <<-)へのあなたのサブセットの割り当ては意味がありません:この操作はサブセットなしであっても必要ありません(反応性のあるオブジェクトを非反応性の値に置き換えます;反応しなくなる)。

お客様反応式内の変数を作成して割り当てることができます。しかし、地球環境に割り当てないでください(つまり、<<-を使用しないでください)。また、リアクティブオブジェクト自体を再割り当てしようとしないでください。代わりに、ローカルの一時変数を作成:( - しかし、それは別のスコープにありますので、これは、あなたの反応性よりも異なる変数だろうstock.var.smoothed含む)ここで

stock.var.smoothed <- reactive({ 
    value <- numeric(length(stock.var())) 
    value[1] <- stock.var()[1] 

    for (i in 2 : length(stock.var())) { 
    value[i] <- (1 - input$alpha) * value[i - 1] + input$alpha * stock.var()[i] 
    } 

    value 
}) 

を、valueは任意の名前である可能性があります。

さらに、私はこのコードがループと一時変数なしで書かれていることを確信しています(しかし、それは私のように見えます)。

最後に、コードスタイルに関する注釈:変数名に.を使用しないでください。メソッドの総称名とクラス名を分離するためにS3ディスパッチにも使用されるので、これは混乱します。 Rの一般的な規則は、代わりにアンダースコア(stock_var_smoothed)を使用することです。

+0

ありがとうございます!それは働いて、あなたの説明は非常に明確です! – Arthur

関連する問題