Penerokaan Mendalam Pengaturcaraan Reaktif
Fahami nilai reaktif, reaktif, pemerhati dan graf reaktif.
Penerokaan Mendalam Pengaturcaraan Reaktif ialah pelajaran R Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran R Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus R Academy merangkumi sejumlah 4 pelajaran.
Kereaktifan: Idea Teras
Model pengaturcaraan reaktif Shiny menjejaki kebergantungan antara pengiraan secara automatik. Apabila input berubah, hanya output yang bergantung padanya akan dilaksanakan semula — tiada yang lain. Memahami graf kebergantungan ini ialah kunci untuk menulis aplikasi Shiny yang cekap dan bebas pepijat.
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({}) — Pengiraan Dikongsi
reactive({...}) mencipta ungkapan reaktif yang hasilnya dicache dan dikongsi. Jika beberapa output menggunakan pengiraan mahal yang sama, bungkuskannya dalam reactive() supaya pengiraan dilakukan sekali bagi setiap perubahan, bukannya sekali bagi setiap pengguna. Panggilnya 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() — Nilai Reaktif Tunggal
reactiveVal(initial_value) mencipta pemboleh ubah reaktif yang boleh dibaca dan ditulis secara terprogram. Baca dengan memanggilnya tanpa argumen; tulis dengan memanggilnya menggunakan nilai baharu. Ini berguna untuk menyimpan keadaan boleh ubah yang menjadi kebergantungan beberapa pemerhati atau output.
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() — Berbilang Pemboleh Ubah Keadaan
reactiveValues(key = value, ...) seperti senarai bernama yang setiap elemennya reaktif. Apabila mana-mana elemen berubah, hanya output yang membaca elemen tersebut menjadi tidak sah. Gunakannya untuk mengumpulkan pemboleh ubah keadaan berkaitan yang dikemas kini bersama-sama.
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() — Memberi Respons kepada Peristiwa
observeEvent(eventExpr, handlerExpr) menjalankan handlerExpr setiap kali eventExpr berubah. Ia digunakan untuk kesan sampingan seperti mengemas kini keadaan, menulis ke pangkalan data, memuat turun fail atau beralih ke tab. Pengendali 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 Atas Permintaan
eventReactive(eventExpr, valueExpr) seperti reactive(), tetapi hanya mengira semula apabila peristiwa tertentu berlaku, contohnya klik butang, bukannya setiap kali kebergantungannya berubah. Gunakannya untuk menjalankan pengiraan yang mahal hanya apabila diminta secara jelas 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() — Baca Tanpa Kebergantungan
isolate({expr}) membaca nilai atau ungkapan reaktif tanpa mewujudkan kebergantungan reaktif. Pengiraan di sekelilingnya TIDAK akan dijalankan semula apabila nilai yang diasingkan berubah. Gunakannya dalam observe() atau observeEvent() untuk mengakses keadaan semasa tanpa melanggan 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() — Segar Semula Automatik
invalidateLater(ms) dalam konteks reaktif menjadualkannya untuk dilaksanakan semula selepas ms milisaat. Ini digunakan untuk pengundian berkala: menyegarkan suapan data langsung, mengemas kini jam atau menyemak baris baharu dalam pangkalan data pada sela masa yang tetap.
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 — Menyahpepijat Graf Reaktif
Pakej reactlog memvisualkan graf kebergantungan reaktif. Dayakannya sebelum menjalankan aplikasi dan panggil reactlog_show() selepas berinteraksi dengannya untuk melihat nod reaktif yang dibatalkan kesahihannya serta susunannya. Ini penting untuk menyahpepijat 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 chainsCorak Anti Pengasingan Reaktif
Kesilapan yang biasa berlaku ialah membaca nilai reaktif secara tidak sengaja dalam konteks bukan reaktif, atau mencipta kebergantungan yang tidak dikehendaki dengan membaca nilai reaktif dalam pengiraan yang sepatutnya diasingkan. Sentiasa tentukan dengan sengaja tempat untuk mencipta kebergantungan dan tempat untuk membaca keadaan sebagai petikan sekali sahaja.
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() berbanding observeEvent()
observe({...}) mencipta pemerhati reaktif yang berjalan semula secara automatik setiap kali mana-mana nilai reaktif yang dibacanya berubah. observeEvent(event, {...}) lebih terkawal: ia hanya dicetuskan oleh peristiwa tertentu. Utamakan observeEvent() untuk kesan sampingan yang dipacu oleh butang bagi mengelakkan pelaksanaan semula yang tidak disengajakan.
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)
}Semakan Pantas
Apakah perbezaan utama antara reactive({}) dengan eventReactive(event, {})?
Ulang Kaji Pengaturcaraan Reaktif
Perkara utama daripada Pendalaman Pengaturcaraan Reaktif:
reactive({}): pengiraan yang dicache dan dijalankan semula apabila kebergantungan berubah.reactiveVal(init): satu pemboleh ubah reaktif yang boleh diubah; baca denganval(), tulis denganval(new).reactiveValues(...): senarai bernama bagi pemboleh ubah keadaan reaktif.observeEvent(event, {}): kesan sampingan yang dicetuskan oleh peristiwa tertentu.eventReactive(event, {}): nilai yang dikira hanya apabila peristiwa tertentu berlaku.isolate({}): membaca nilai reaktif tanpa mencipta kebergantungan.invalidateLater(ms): menjadualkan pelaksanaan semula berkala untuk kemas kini langsung.- Gunakan
reactloguntuk memvisualkan dan menyahpepijat graf kebergantungan 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()) })
}Pelajari R dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 43
- Pelajaran
- 159
Soalan Lazim
Adakah pelajaran “Penerokaan Mendalam Pengaturcaraan Reaktif” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran R Academy, termasuk “Penerokaan Mendalam Pengaturcaraan Reaktif”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus R Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Penerokaan Mendalam Pengaturcaraan Reaktif”?
Fahami nilai reaktif, reaktif, pemerhati dan graf reaktif. Anda berlatih R Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan R Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran R Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “Penerokaan Mendalam Pengaturcaraan Reaktif” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran R Academy ini?
Ya. Setiap pelajaran R Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Penerokaan Mendalam Pengaturcaraan Reaktif
- Modul Shiny untuk Guna Semula Kod
- UI Dinamik dengan renderUI dan insertUI
- Menggunakan Aplikasi Shiny dalam Pengeluaran