SQLからデータフレームにデータをクエリする光沢のあるアプリケーションがあり、それらのデータフレームは私のshinyServer()ブロックから参照されます。これまではRStudioでのみ実行していたため、新しいデータが必要なときはいつでも、アプリケーションを再起動して、サーバーがロードされる前にすべての新しいデータを取得していました。
アプリを光沢のあるサーバーに移行したいのですが、定期的に新しいデータを取得するように誘導する方法がわかりません。インターフェースのために、ユーザーがボタンをクリックしてロードを開始するのではなく、インターフェースを自動化したいと思います。これの慣用的な解決策はありますか?
編集:
私は私のために働く解決策を見つけたと思います。
shinyServer(function(input,output,session){
sourceData <- reactive({
invalidateLater(1000000,session)
functionThatGetsData()
})
})
invalidateLater
を探しています。これを適切な間隔で、データベースからデータを取得する反応式に入れます。
新しいデータがあるかどうかを検出するために高速なクエリを実行できる場合、最も賢いのは_reactivePoll
_を使用することです。これは、実際、今日私にとって非常にうまくいきました。
_reactivePoll shiny
_反応性ポーリング
説明
非反応データを定期的にポーリングして機能する反応データソースを作成するために使用されます。
使用法
reactivePoll(intervalMillis, session, checkFunc, valueFunc)
議論
intervalMillis
checkFunc
の呼び出し間で待機するおよそのミリ秒数。これは、数値、または数値を返す関数のいずれかです。session
このファイルリーダーを関連付けるユーザーセッション。存在しない場合は
NULL
。 nullでない場合、リーダーはセッションが終了すると自動的に停止します。checkFunc
比較的安価な関数で、時間の経過とともに値が等しいかどうかがテストされます。 nequalityは、基になる値が変更され、無効にしてvalueFunc
を使用して再リードする必要があることを示します。詳細を参照してください。valueFunc
基礎となる値を計算する関数。詳細を見る。
これらの答えのどちらもOPの質問に完全に答えるとは思いません。具体的には
新しいデータが必要なときはいつでも、アプリケーションを再起動し、サーバーがロードする前にすべての新しいデータを取得します。
globalオブジェクトを更新する必要があることを示しています。サーバー機能内でリアクティブを使用することは、複数のユーザーが同時にアプリと対話している場合に競合状態が発生するという問題への優れた回答ではありません...それらすべてが同時にオブジェクトを更新しようとしますアップデートが何であるかにもよります(これは私が積極的に取り組んでいるものです)。
私が探求した1つの可能な解決策は、flockパッケージを使用して、各ユーザーにグローバル一時ファイルのロックを取得するように試み、それを正常に取得するユーザーはグローバル更新を実行することを課されることです。これは競合状態に直接対処します。私はそれをここに解決策として投稿するのに十分なほどテストしていません。おそらく他の誰かがそれを実行できます。