observeEvent & eventReactive
Penjelasan
reactive() dan render*() otomatis bereaksi terhadap SEMUA input yang dipakai di dalamnya — kadang kamu justru ingin aksi hanya terjadi saat event spesifik, misalnya tombol diklik, bukan setiap kali user mengetik di textInput. observeEvent(input$tombol, {...}) menjalankan blok kode (efek samping seperti menyimpan file atau print) HANYA saat input$tombol berubah (biasanya actionButton), mengabaikan perubahan input lain di dalam blok tersebut. eventReactive(input$tombol, {...}) mirip tapi mengembalikan NILAI reaktif (seperti reactive()), cocok dipakai saat kamu ingin komputasi baru dijalankan hanya setelah user menekan tombol 'Proses', bukan otomatis tiap ketik.
Contoh Konsep
library(shiny)
ui <- fluidPage(
textInput("teks", "Masukkan teks:"),
actionButton("proses", "Proses"),
textOutput("hasil")
)
server <- function(input, output) {
hasil_proses <- eventReactive(input$proses, {
toupper(input$teks)
})
output$hasil <- renderText({
hasil_proses()
})
observeEvent(input$proses, {
message("Tombol proses diklik!")
})
}
shinyApp(ui = ui, server = server)
Praktikum
Lengkapi eventReactive agar teks hanya dibalik (pakai paste(rev(strsplit(x, "")[[1]]), collapse = "")) saat tombol 'balik' diklik.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Pakai observeEvent untuk efek samping (menyimpan data, print log, update UI), dan eventReactive untuk nilai yang dipakai output — jangan tertukar, karena observeEvent tidak bisa 'dipanggil' seperti reactive expression.