0Pricing
R Academy · Pelajaran

Pendalaman Pemrograman Reaktif

Pahami nilai reaktif, objek reaktif, pengamat, dan graf reaktif.

Pendalaman Pemrograman Reaktif adalah pelajaran R Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar R Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus R Academy mencakup 4 pelajaran total.

Reaktivitas: Gagasan Inti

Model pemrograman reaktif Shiny secara otomatis melacak dependensi antarkomputasi. Ketika suatu masukan berubah, hanya keluaran yang bergantung padanya yang dieksekusi ulang—tidak ada yang lain. Memahami grafik dependensi ini adalah kunci untuk menulis aplikasi Shiny yang efisien dan bebas bug.

library(shiny)

# Simplest reactive relationship:
# output depends on input — Shiny tracks this automatically
server <- function(input, output, session) {
  output$result <- renderText({
    paste('You typed:', input$text_in)  # depends on text_in
  })
}

reactive({}) — Komputasi Bersama

reactive({...}) membuat ekspresi reaktif yang hasilnya disimpan dalam cache dan dapat digunakan bersama. Jika beberapa keluaran menggunakan komputasi mahal yang sama, bungkus komputasi tersebut dalam reactive() agar dihitung sekali setiap kali terjadi perubahan, bukan sekali untuk setiap pemakai. Panggil seperti fungsi: data_subset().

server <- function(input, output, session) {
  # Computed once, shared by multiple outputs
  filtered_data <- reactive({
    subset(mtcars, cyl == input$cyl_select)
  })

  output$plot  <- renderPlot({ plot(filtered_data()$wt,
                                    filtered_data()$mpg) })
  output$table <- renderTable({ filtered_data() })
  # filtered_data() is only recomputed once when cyl_select changes
}

reactiveVal() — Satu Nilai Reaktif

reactiveVal(initial_value) membuat variabel reaktif yang dapat dibaca dan ditulis secara terprogram. Baca dengan memanggilnya tanpa argumen; tulis dengan memanggilnya menggunakan nilai baru. Ini berguna untuk menyimpan keadaan yang dapat berubah dan menjadi dependensi bagi beberapa pengamat atau keluaran.

server <- function(input, output, session) {
  counter <- reactiveVal(0)   # initial value = 0

  observeEvent(input$increment, {
    counter(counter() + 1)    # read current, write new
  })

  observeEvent(input$reset, {
    counter(0)                 # reset to 0
  })

  output$count <- renderText(paste('Count:', counter()))
}

reactiveValues() — Beberapa Variabel Keadaan

reactiveValues(key = value, ...) mirip daftar bernama, tetapi setiap elemennya bersifat reaktif. Ketika suatu elemen berubah, hanya keluaran yang membaca elemen tersebut yang menjadi tidak valid. Gunakan ini untuk mengelompokkan variabel keadaan terkait yang diperbarui bersama.

server <- function(input, output, session) {
  state <- reactiveValues(
    data         = NULL,
    current_page = 1,
    total_rows   = 0
  )

  observeEvent(input$load_btn, {
    state$data       <- read.csv(input$file$datapath)
    state$total_rows <- nrow(state$data)
    state$current_page <- 1
  })

  output$info <- renderText({
    paste('Page', state$current_page, '| Rows:', state$total_rows)
  })
}

observeEvent() — Merespons Peristiwa

observeEvent(eventExpr, handlerExpr) menjalankan handlerExpr setiap kali eventExpr berubah. Fungsi ini digunakan untuk efek samping: memperbarui status, menulis ke basis data, mengunduh berkas, atau berpindah ke tab. Penangan tersebut tidak mengembalikan nilai.

server <- function(input, output, session) {
  observeEvent(input$save_btn, {
    # Runs once each time save_btn is clicked
    write.csv(current_data(), '/tmp/export.csv', row.names = FALSE)
    showNotification('Saved!', type = 'message')
  })

  observeEvent(input$reset_btn, {
    updateTextInput(session, 'search', value = '')
    updateSliderInput(session, 'range', value = c(0, 100))
  })
}

eventReactive() — Nilai Sesuai Permintaan

eventReactive(eventExpr, valueExpr) mirip dengan reactive(), tetapi hanya menghitung ulang ketika peristiwa tertentu terjadi (misalnya klik tombol), bukan setiap kali dependensinya berubah. Gunakan fungsi ini untuk menjalankan perhitungan yang membutuhkan banyak sumber daya hanya ketika diminta secara eksplisit oleh pengguna.

server <- function(input, output, session) {
  # Only re-run the model when 'Run Model' is clicked
  model_result <- eventReactive(input$run_btn, {
    # Expensive computation — only on button click
    lm(as.formula(input$formula), data = get(input$dataset))
  })

  output$summary <- renderPrint({
    summary(model_result())
  })
}

isolate() — Membaca Tanpa Dependensi

isolate({expr}) membaca nilai atau ekspresi reaktif tanpa membuat dependensi reaktif. Perhitungan di sekitarnya TIDAK akan dijalankan ulang ketika nilai yang diisolasi berubah. Gunakan fungsi ini di dalam observe() atau observeEvent() untuk mengakses status saat ini tanpa berlangganan pada perubahan.

server <- function(input, output, session) {
  observeEvent(input$add_row_btn, {
    # Read current_data without depending on it
    current <- isolate(data_rv())
    new_row <- data.frame(
      id    = nrow(current) + 1,
      value = input$new_value
    )
    data_rv(rbind(current, new_row))
  })
}

invalidateLater() — Penyegaran Otomatis

invalidateLater(ms) di dalam konteks reaktif menjadwalkan eksekusi ulang setelah ms milidetik. Fungsi ini digunakan untuk polling: menyegarkan umpan data langsung, memperbarui jam, atau memeriksa baris baru dalam basis data secara berkala.

server <- function(input, output, session) {
  live_data <- reactive({
    invalidateLater(5000)   # re-run every 5 seconds
    # Fetch fresh data from external source
    httr2::request('https://api.example.com/stats') |>
      httr2::req_perform() |>
      httr2::resp_body_json()
  })

  output$live_plot <- renderPlot({
    plot(live_data()$time, live_data()$value, type = 'l')
  })
}

reactlog — Men-debug Graf Reaktif

Paket reactlog memvisualisasikan graf dependensi reaktif. Aktifkan paket tersebut sebelum menjalankan aplikasi, lalu panggil reactlog_show() setelah berinteraksi dengan aplikasi untuk melihat simpul reaktif mana yang dibatalkan validasinya dan dalam urutan apa. Fitur ini penting untuk men-debug aplikasi yang kompleks.

library(reactlog)

# Enable reactlog BEFORE launching the app
reactlog_enable()

# Launch your app
shinyApp(ui, server)

# After interacting in the browser, in the R console:
shiny::reactlogShow()

# A viewer opens showing the reactive graph
# with timestamps and invalidation chains

Anti-Pola Isolasi Reaktif

Kesalahan yang umum terjadi adalah membaca nilai reaktif secara tidak sengaja di dalam konteks nonreaktif, atau membuat dependensi yang tidak diinginkan dengan membaca nilai reaktif di dalam perhitungan yang seharusnya diisolasi. Selalu tentukan dengan sengaja di mana dependensi dibuat dan di mana status dibaca sebagai cuplikan satu kali.

server <- function(input, output, session) {
  # WRONG: output depends on input$name, but also re-runs
  # every time input$slider changes (unintended dependency)
  output$msg <- renderText({
    paste(input$name, 'total:', input$slider * 2)
  })

  # CORRECT: output only responds to input$name changes;
  # slider is read as a snapshot
  output$msg_correct <- renderText({
    slider_val <- isolate(input$slider)
    paste(input$name, 'snapshot total:', slider_val * 2)
  })
}

observe() vs observeEvent()

observe({...}) membuat pengamat reaktif yang otomatis dijalankan ulang setiap kali nilai reaktif apa pun yang dibacanya berubah. observeEvent(event, {...}) lebih terkendali: fungsi ini hanya terpicu oleh peristiwa tertentu. Gunakan observeEvent() untuk efek samping yang dipicu tombol agar eksekusi ulang yang tidak diinginkan dapat dihindari.

server <- function(input, output, session) {
  # observe: re-runs on ANY change in input$x or input$y
  observe({
    cat('x or y changed:', input$x, input$y, '\n')
  })

  # observeEvent: only runs when button is clicked
  observeEvent(input$submit_btn, {
    cat('Form submitted with x =', isolate(input$x), '\n')
  }, ignoreNULL = TRUE, ignoreInit = TRUE)
}

Pemeriksaan Singkat

Apa perbedaan utama antara reactive({}) dan eventReactive(event, {})?

Rangkuman Pemrograman Reaktif

Hal-hal penting dari Pendalaman Pemrograman Reaktif:

  • reactive({}): perhitungan yang disimpan dalam tembolok dan dijalankan ulang ketika dependensinya berubah.
  • reactiveVal(init): satu variabel reaktif yang dapat diubah; baca dengan val(), tulis dengan val(new).
  • reactiveValues(...): daftar bernama yang berisi variabel status reaktif.
  • observeEvent(event, {}): efek samping yang dipicu oleh peristiwa tertentu.
  • eventReactive(event, {}): nilai yang dihitung hanya ketika peristiwa tertentu terjadi.
  • isolate({}): membaca nilai reaktif tanpa membuat dependensi.
  • invalidateLater(ms): menjadwalkan eksekusi ulang secara berkala untuk pembaruan langsung.
  • Gunakan reactlog untuk memvisualisasikan dan men-debug graf dependensi reaktif.
server <- function(input, output, session) {
  # State
  rv <- reactiveValues(data = NULL, n = 0)

  # Load data on button click
  observeEvent(input$load, {
    rv$data <- read.csv(input$file$datapath)
    rv$n    <- nrow(rv$data)
  })

  # Expensive model only on 'Run' click
  model <- eventReactive(input$run, {
    lm(y ~ ., data = isolate(rv$data))
  })

  output$summary <- renderPrint({ summary(model()) })
}

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pendalaman Pemrograman Reaktif” gratis?

Ya — teks lengkap “Pendalaman Pemrograman Reaktif” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus R Academy, upgrade ke CoddyKit PRO. Kursus R Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Pendalaman Pemrograman Reaktif”?

Pahami nilai reaktif, objek reaktif, pengamat, dan graf reaktif. Kamu berlatih R Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai R Academy?

Tidak diperlukan pengalaman sebelumnya. R Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Pendalaman Pemrograman Reaktif” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran R Academy ini?

Ya. Setiap pelajaran R Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Pendalaman Pemrograman Reaktif
  2. Modul Shiny untuk Penggunaan Ulang Kode
  3. UI Dinamis dengan renderUI dan insertUI
  4. Menerapkan Aplikasi Shiny
← Kembali ke R Academy