Variabel reaktif

Studi Kasus: Membangun Aplikasi Web dengan Shiny di R

Dean Attali

Shiny Consultant

Duplikasi kode

data <- gapminder
data <- subset(
    data,
    lifeExp >= input$life[1] & lifeExp <= input$life[2]
)
if (input$continent != "All") {
    data <- subset(
        data,
        continent == input$continent
   )
}
  • Diduplikasi 3 kali
    1. renderTable()
    2. renderPlot()
    3. downloadHandler()
Studi Kasus: Membangun Aplikasi Web dengan Shiny di R

Variabel reaktif mengurangi duplikasi kode

  • Kode terduplikasi ⇒ banyak tempat untuk dirawat
    • Saat kode perlu diperbarui
    • Saat bug perlu diperbaiki
  • Mudah lupa satu instance, memicu bug
  • Gunakan variabel reactive() alih-alih menduplikasi kode
Studi Kasus: Membangun Aplikasi Web dengan Shiny di R

Variabel reaktif

output$my_table <- renderTable({
    data <- gapminder
    data <- subset(
        data,
        lifeExp >= input$life[1] & lifeExp <= input$life[2]
    )
})
my_data <- reactive({

data <- gapminder data <- subset( data, lifeExp >= input$life[1] & lifeExp <= input$life[2] )
})
output$my_table <- renderTable({ my_data() })
Studi Kasus: Membangun Aplikasi Web dengan Shiny di R

Caching pada variabel reaktif

  • Variabel reaktif melakukan cache nilai
  • Mengingat nilainya sendiri
  • Tidak jalan lagi jika dependensi tidak berubah
Studi Kasus: Membangun Aplikasi Web dengan Shiny di R

Caching pada variabel reaktif

  output$table <- renderTable({
      fit_model(input$num)
  })

  output$plot <- renderPlot({
      ggplot(
        fit_model(input$num), ...)
  })
  • fit_model() butuh 5 dtk
  • fit_model() dipanggil dua kali = 10 dtk
x <- reactive({
    fit_model(input$num)
})

output$table <- renderTable({ x() })
output$plot <- renderPlot({ ggplot(x(), ...) })
  • x() dipanggil dua kali, kode di dalam x hanya jalan sekali
  • fit_model() dipanggil sekali = 5 dtk
Studi Kasus: Membangun Aplikasi Web dengan Shiny di R

Variabel reaktif bersifat malas

  • Variabel malas = tidak dihitung sampai nilainya dibutuhkan

    x <- reactive({
        fit_model(input$num)
    })
    
    output$download <- downloadHandler(
        filename = "x.csv",
        content = function(file) {
            write.csv(x(), file)
        }
    )
    
  • x() hanya berjalan saat unduhan diminta, bukan tiap input$num berubah

Studi Kasus: Membangun Aplikasi Web dengan Shiny di R

Ayo berlatih!

Studi Kasus: Membangun Aplikasi Web dengan Shiny di R

Preparing Video For Download...