はじめに
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
のたびに計算が実行されるため、処理が重くなってしまいます。
server <- function(input, output, session) {
output$bmi <- renderText({
bmi <- input$weight/(input$height^2)
paste("あなたのBMIは", round(bmi, 1),"です。")
})
下記は、Reactive関数を使う例です。
renderText
外に処理を記述しています。
また、プログラム自体の可読性も高くなったように見えます(もっと複雑なプログラムだと、わかりやすいのかも・・??)
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などなど、まだまだ色々な関数があるので、見ていきたいと思います。