Tepkisel Programlamaya Derinlemesine Bakış
Tepkisel değerleri, tepkiselleri, gözlemcileri ve tepkisel grafiği anlayın.
Tepkisel Programlamaya Derinlemesine Bakış, CoddyKit'te ücretsiz bir R Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, R Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. R Academy kursu toplamda 4 dersten oluşur.
Reaktiflik: Temel Fikir
Shiny'nin reaktif programlama modeli, hesaplamalar arasındaki bağımlılıkları otomatik olarak izler. Bir girdi değiştiğinde yalnızca ona bağlı çıktılar yeniden çalıştırılır; başka hiçbir işlem yapılmaz. Bu bağımlılık grafiğini anlamak, verimli ve hatasız Shiny uygulamaları yazmanın anahtarıdır.
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({}) — Paylaşılan Hesaplamalar
reactive({...}), sonucu önbelleğe alınan ve paylaşılan bir reaktif ifade oluşturur. Birden çok çıktı aynı maliyetli hesaplamayı kullanıyorsa, hesaplamayı her tüketici için bir kez yapmak yerine her değişiklikte bir kez yapmak üzere bunu reactive() içine alın. İşlev gibi çağırın: 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() — Tek Reaktif Değer
reactiveVal(initial_value), program aracılığıyla okuyup yazabileceğiniz reaktif bir değişken oluşturur. Hiç bağımsız değişken vermeden çağırarak okuyun; yeni bir değer vererek çağırarak yazın. Bu, birden çok gözlemcinin veya çıktının bağlı olduğu değiştirilebilir durumu saklamak için kullanışlıdır.
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() — Birden Çok Durum Değişkeni
reactiveValues(key = value, ...), her öğesi reaktif olan adlandırılmış bir liste gibidir. Herhangi bir öğe değiştiğinde yalnızca o öğeyi okuyan çıktılar geçersizleşir. Birlikte güncellenen ilişkili durum değişkenlerini gruplamak için kullanın.
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() — Olaylara Yanıt Verme
observeEvent(eventExpr, handlerExpr), eventExpr her değiştiğinde handlerExpr'yi çalıştırır. Durum güncelleme, veritabanına yazma, bir dosya indirme veya bir sekmeye geçme gibi yan etkiler için kullanılır. İşleyici bir değer döndürmez.
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() — İhtiyaç Anında Değer
eventReactive(eventExpr, valueExpr), reactive() işlevine benzer; ancak bağımlılıkları her değiştiğinde değil, yalnızca belirli bir olay gerçekleştiğinde (örneğin bir düğmeye tıklandığında) yeniden hesaplanır. Pahalı hesaplamaları yalnızca kullanıcının açık isteği üzerine çalıştırmak için kullanılır.
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() — Bağımlılık Oluşturmadan Okuma
isolate({expr}), bir reaktif değeri veya ifadeyi reaktif bağımlılık oluşturmadan okur. Çevreleyen hesaplama, yalıtılmış değer değiştiğinde yeniden çalışmaz. Değişikliklere abone olmadan mevcut duruma erişmek için bunu observe() veya observeEvent() içinde kullanın.
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() — Otomatik Yenileme
Reaktif bir bağlam içinde kullanılan invalidateLater(ms), bu bağlamın ms milisaniye sonra yeniden çalıştırılmasını planlar. Bu işlev; canlı veri akışını yenilemek, saati güncellemek veya yeni veritabanı satırlarını düzenli aralıklarla kontrol etmek gibi yoklama işlemleri için kullanılır.
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 — Reaktif Grafiğin Hatalarını Ayıklama
reactlog paketi, reaktif bağımlılık grafiğini görselleştirir. Uygulamayı çalıştırmadan önce etkinleştirin ve etkileşimde bulunduktan sonra reactlog_show() çağrısını yaparak hangi reaktif düğümlerin hangi sırayla geçersiz kılındığını görün. Karmaşık uygulamalardaki hataları ayıklamak için vazgeçilmezdir.
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 chainsReaktif Yalıtım Karşıt Örüntüsü
Yaygın bir hata, reaktif olmayan bir bağlam içinde yanlışlıkla reaktif bir değeri okumak veya yalıtılması gereken bir hesaplama içinde reaktif bir değeri okuyarak istenmeyen bağımlılıklar oluşturmaktır. Bağımlılıkları nerede oluşturacağınız ve durumu tek seferlik bir anlık görüntü olarak nerede okuyacağınız konusunda her zaman bilinçli davranın.
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() ve observeEvent() Karşılaştırması
observe({...}), okuduğu reaktiflerden herhangi biri değiştiğinde otomatik olarak yeniden çalışan bir reaktif gözlemci oluşturur. observeEvent(event, {...}) ise daha kontrollüdür; yalnızca belirli bir olay gerçekleştiğinde tetiklenir. İstenmeyen yeniden çalışmaları önlemek için düğme aracılığıyla başlatılan yan etkilerde observeEvent() kullanmayı tercih edin.
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)
}Kısa Kontrol
reactive({}) ile eventReactive(event, {}) arasındaki temel fark nedir?
Reaktif Programlamanın Özeti
Reaktif Programlamaya Derinlemesine Bakış bölümünden temel çıkarımlar:
reactive({}): önbelleğe alınan hesaplama; bağımlılıklar değiştiğinde yeniden çalışır.reactiveVal(init): değiştirilebilir tek bir reaktif değişken;val()ile okunur,val(new)ile yazılır.reactiveValues(...): adlandırılmış reaktif durum değişkenleri listesi.observeEvent(event, {}): belirli bir olayın tetiklediği yan etkiler.eventReactive(event, {}): yalnızca belirli bir olay gerçekleştiğinde hesaplanan değer.isolate({}): bağımlılık oluşturmadan reaktif bir değeri okur.invalidateLater(ms): canlı güncellemeler için periyodik yeniden çalıştırma planlar.- Reaktif bağımlılık grafiğini görselleştirmek ve hatalarını ayıklamak için
reactlogkullanın.
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()) })
}Sıkça Sorulan Sorular
“Tepkisel Programlamaya Derinlemesine Bakış” dersi ücretsiz mi?
Evet — “Tepkisel Programlamaya Derinlemesine Bakış” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve R Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. R Academy kursu toplamda 4 dersten oluşur.
“Tepkisel Programlamaya Derinlemesine Bakış” dersinde ne öğreneceğim?
Tepkisel değerleri, tepkiselleri, gözlemcileri ve tepkisel grafiği anlayın. R Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
R Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te R Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“Tepkisel Programlamaya Derinlemesine Bakış” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu R Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her R Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Tepkisel Programlamaya Derinlemesine Bakış
- Kod Yeniden Kullanımı için Shiny Modülleri
- renderUI ve insertUI ile Dinamik Kullanıcı Arayüzü
- Shiny Uygulamalarını Dağıtma