web-dev-qa-db-ja.com

R Shinyにグローバル変数はありますか?

R Shinyでグローバル変数をどのように宣言して、同じコードを複数回実行する必要がないようにしますか?非常に単純な例として、まったく同じデータを使用する2つのプロットがありますが、一度だけデータを計算したいだけです。

i.Rファイルは次のとおりです。

_library(shiny)

# Define UI for application that plots random distributions 
shinyUI(pageWithSidebar(

# Application title
headerPanel("Hello Shiny!"),

# Sidebar with a slider input for number of observations
sidebarPanel(
sliderInput("obs", 
            "Number of observations:", 
            min = 1,
            max = 1000, 
            value = 500)
  ),

# Show a plot of the generated distribution
 mainPanel(
   plotOutput("distPlot1"),
  plotOutput("distPlot2")
 )
))
_

server.Rファイルは次のとおりです。

_library(shiny)

shinyServer(function(input, output) {

  output$distPlot1 <- renderPlot({ 
    dist <- rnorm(input$obs)
    hist(dist)
  })

  output$distPlot2 <- renderPlot({ 
    dist <- rnorm(input$obs)
    plot(dist)
  })

})
_

_output$distPlot1_と_output$distPlot2_の両方が、同じコードを2回再実行するdist <- rnorm(input$obs)を行うことに注意してください。 「dist」ベクトルを1回実行し、すべてのrenderplot関数で使用できるようにするにはどうすればよいですか?私はdistを次のような関数の外側に配置しようとしました:

_library(shiny)

shinyServer(function(input, output) {

  dist <- rnorm(input$obs)

  output$distPlot1 <- renderPlot({ 
    hist(dist)
  })

  output$distPlot2 <- renderPlot({ 
    plot(dist)
  })

})
_

しかし、「dist」オブジェクトが見つからないというエラーが表示されます。これは実際のコードのおもちゃの例です。複数の「レンダリング」機能に貼り付けるコードが50行あります。何か助け?

このコードを実行する場合は、ファイルを作成して実行するだけです。library(shiny)getwd()runApp( "C:/ Desktop/R Projects/testShiny")

ここで、「testShiny」は私のRスタジオプロジェクトの名前です。

37
user3022875

Shiny webpage のこのページでは、Shiny変数のスコープについて説明しています。

グローバル変数は、server.R(リカードの回答による)またはglobal.R

Global.Rで定義されたオブジェクトは、shinyServer()以外のserver.Rで定義されたオブジェクトと似ていますが、1つの重要な違いがあります。これらは、ui.Rのコードにも表示されます。これは、Rセッションのグローバル環境にロードされるためです。 ShinyアプリのすべてのRコードは、グローバル環境またはその子で実行されます。

実際には、server.Rとui.Rの間で変数を共有する必要があることは多くありません。 ui.Rのコードは、Shinyアプリの起動時に1回実行され、キャッシュされて接続する各Webブラウザーに送信されるHTMLファイルを生成します。これは、一部の共有構成オプションの設定に役立つ場合があります。

23
nico

上記の@nicoにリストされているリンクで述べたように、関数内で<<-分類子を使用して、関数の外部から変数にアクセスできるようにすることもできます。

foo <<- runif(10)

の代わりに

foo <- runif(10)

リンクには、「オブジェクトが変更されると、変更されたオブジェクトがすべてのユーザーセッションで表示されます。ただし、<-演算子はローカルの値のみを割り当てるため、<<-代入演算子を使用してbigDataSetを変更する必要があります環境。"

これを使用して、光沢のあるさまざまなレベルの成功を収めました。いつものように、グローバル変数には注意してください。

10
Jim Crozier