この記事では、Shiny アプリのスコープ ルールと、さまざまにパッケージ化されたコードを使用してグローバル データを定義する方法について説明します。以下は、複数のセッションにアクセス可能なデータを保持するグローバル変数の例です。
このアプリを実行し、ブラウザで 2 番目のタブ/ウィンドウを開き、同じ接続をポイントします。1 つのセッションで +1 ボタンをクリックして、共有の最大数とローカル数を増やすことができます。他のセッションでは、何かが光沢をトリガーして共有データを再チェックするまで変化は見られませんが、そこで +1 ボタンをクリックすると、ローカル カウントが更新されますが、共有最大データ値の更新もトリガーされます。新しい最大値が得られるまで +1 ボタンを数回クリックし、最初のウィンドウに戻ると、+1 ボタンをクリックして更新をトリガーすると、そこにも最大値が表示されていることがわかります。これは、複数のウィンドウで機能します。
セッションでデータを再度チェックして更新するには、何かを行う必要があります。副作用なしでこれを実現するために、私は一生懸命働きませんでした. 必要なトリガーに基づいて「更新」を行う方法が必要です。この例がファイルで行うように、時限ポーリングを使用してデータの同期を維持することもできます。
この例の 1 つの注意点は、ローカルの RStudio の光沢のあるサーバー実装でしか試していないことです。実際のサーバーでこのように機能するかどうかはわかりません。そうでない場合は、その旨コメントしてください!2 つのセッションが 1 つのマシンでアプリ インスタンスを共有することを保証できないため、shinyapps.io や一般的なクラウド/負荷分散では、この方法ではおそらく機能しません。
library(shiny)
globalMax <- 0
app <- shinyApp(
ui= pageWithSidebar(
headerPanel("Shared data demo"),
sidebarPanel(
actionButton("plusButton", "+1")
),
mainPanel(
verbatimTextOutput("sharedMax")
)
),
server= function(input,output){
observe({
if (input$plusButton > globalMax) {
globalMax <<- input$plusButton
}
})
output$sharedMax <- renderText({
paste0( "Shared max value: ", globalMax, "\n",
"Local value: ", input$plusButton)
})
}
)
runApp(app)