LoginSignup
1
0

More than 3 years have passed since last update.

ShinyのReactive Programmingの整理

Last updated at Posted at 2020-04-03

はじめに

Shinyを勉強し始めました。Reactive Programmingが、少しわからなかったので自分用のメモを書きます。

Reactive Programmingとは

パフォーマンスの高いShinyアプリを作成するためには、
1. リアクティブソース
2. コンダクター
3. エンドポイント
の3つを理解する必要があります。

1.リアクティブソース

いわゆる「input」のことです。
これには、「textInput」,「sliderInput」,「selectInput」,「dateInput」などがあります。

2.コンダクター

リアクティブソースとエンドポイントをつなげる関数のようなものです(と、理解しています)
負荷が大きい処理に対して使用されるものです。
これは、reactive関数を使って処理していきます。

3.エンドポイント

いわゆる「output」のことです。
これには、renderXXX系の処理が該当します。例えば「renderText」「renderPlot」「renderTable」などです。

3つの整理

renderXXXは、呼び出されるたびにrenderXXX内の処理がすべて実行されます。そのため、負荷が大きい処理がrenderXXX内に含まれていると、アプリが重くなってしまいます。そのため、コンダクターを使用することで処理を軽くします。

Reactive関数の実例

BMIを計算する例を考えてみます。
BMI = 身長 / 体重* 体重
による計算することが可能です。

下記は、Reactive関数を使わない例です。
renderTextの中に、BMIの計算を書いています。
これですと、renderTextのたびに計算が実行されるため、処理が重くなってしまいます。

Reactive関数を使わない例.r
server <- function(input, output, session) {
  output$bmi <- renderText({
    bmi <- input$weight/(input$height^2)
    paste("あなたのBMIは", round(bmi, 1),"です。")
  })

下記は、Reactive関数を使う例です。
renderText外に処理を記述しています。
また、プログラム自体の可読性も高くなったように見えます(もっと複雑なプログラムだと、わかりやすいのかも・・??)

Reactive関数を使った例.r
server <- function(input, output, session) {
  BMI_calc <- reactive({
    input$weight/(input$height^2)
  })
  output$bmi <- renderText({
    bmi <- BMI_calc()
    paste("あなたのBMIは", round(bmi, 1),"です。")
  })

おわりに

Reactiveの考え方が少しわかったような気がします。この他にもObserveや、Delay、EventReactive、Isolationなどなど、まだまだ色々な関数があるので、見ていきたいと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0