2016-06-25 16 views
0

私の輝くアプリで再帰に問題があります。私のアプリケーションがファイルを読み込んでデータセット(dataset())を作成したとします。次に、私は上記のデータセットを処理し、別のデータセットを作成する機能を持っています(dataset.proc())。私はデータセットに必要なだけ何度でも処理を適用できます(いくつかの処理方法があります)。別の関数は、作成された最新のデータセット(dataset.current())を追跡します。私server.Rスクリプトの重要な部分のR Shiny:反復を避けるために反応式を保存

Here'sa簡単な例:

dataset <- reactive(#reads file and creates dataset) 

dataset.current <- reactive ({ 
    if (!is.null(dataset())){ 
    if (!is.null(dataset.proc())) { 
     return(dataset.proc()) 
    } else { 
     return (dataset()) 
    } 
    } 
}) 

dataset.proc <- reactive(#processes dataset.current() according to user input, creates a processed dataset) 

は、私ができる任意の方法を避けるために非反応性の表現として「店のdataset.proc()あり明白な誤り:

evaluation nested too deeply: infinite recursion

すべてのヘルプははるかに高く評価されるだろう:)

+0

おそらく、あなたは 'dataset'を反応値として保存できます(http://shiny.rstudio.com/reference/shiny/latest/reactiveValues.html参照)。反応性値を変更する(すなわち、新しいデータセットをロードする)とき、それに依存する他のすべての反応性関数がトリガされる。 –

+0

あなたのanwserに感謝します:)私は最終的に以下の答えからアイデアを適応させる問題を解決しました。 –

答えて

0

をあなたは、サーバーコードでの「通常の」R変数を使用することができます。例えば、

current <- dataset() # Load initial dataset 

shinyServer(function(input, output) { 
    output$dataset.current <- renderDataTable({ 
    datatable(dataset.proc()) 
    }) 

    dataset.proc <- reactive({ 
    # Instead of dataset.current(), use the current variable 

    # Processing ... 

    current <- data.frame("Processed") 
    return(current) 
    }) 
}) 

dataset.proc反応式の結果を返す前に、current変数の処理結果を「保存」。次回、dataset.proc式はcurrentの値から開始できます。

+0

あなたの答えをありがとうございました:)問題は私が最後のデータセットで作業する必要がある私のアプリの他の部分があるため、私はどのデータセットが最新のものであるか教えて私は 'dataset.current()'が必要です'dataset.current()'に依存しています。 –

+0

私はちょうどあなたのアイデアを適応させる問題を解決しました。私は 'current'をグローバル変数に設定し、サーバ内部では、' makeReactiveBinding( 'current') 'で値を変更したときに他の関数が見ることができるように、それを光沢に反応するようにしました。他の人にも役立つことを願っています。 –

+0

通常、グローバル変数は避けることができます(避けるべきです)。この質問への答え(私が尋ねた)で、私はShiny app内のグローバル変数を取り除くことができました。これは、データセットを更新して計算をトリガーする類似の問題です:http://stackoverflow.com/質問/ 33722757/update-handsontable-by-editing-table-and-or-eventreactive –

関連する問題