Variabel reaktif mengurangi duplikasi kode
Pada latihan sebelumnya, kode untuk memfilter gapminder berdasarkan nilai masukan digandakan tiga kali: sekali pada tabel, sekali pada plot, dan sekali pada pengendali unduhan.
Variabel reaktif dapat digunakan untuk mengurangi duplikasi kode, yang umumnya merupakan praktik baik karena memudahkan pemeliharaan.
Latihan ini adalah bagian dari kursus
Studi Kasus: Membangun Aplikasi Web dengan Shiny di R
Petunjuk latihan
Potongan kode duplikat yang memfilter data telah dihapus. Tugas Anda adalah menambahkan sebuah variabel reaktif yang memfilter data, lalu gunakan variabel tersebut sebagai gantinya. Secara spesifik:
- Buat variabel reaktif bernama
filtered_datadengan menggunakan fungsireactive()yang memanfaatkan kode pemfilteran dari latihan sebelumnya (baris 15). - Gunakan variabel reaktif tersebut untuk merender keluaran tabel, keluaran plot, dan berkas unduhan (baris 33, 42, dan 50).
Latihan interaktif praktis
Cobalah latihan ini dengan menyelesaikan kode contoh berikut.
ui <- fluidPage(
h1("Gapminder"),
sliderInput(inputId = "life", label = "Life expectancy",
min = 0, max = 120,
value = c(30, 50)),
selectInput("continent", "Continent",
choices = c("All", levels(gapminder$continent))),
downloadButton(outputId = "download_data", label = "Download"),
plotOutput("plot"),
tableOutput("table")
)
server <- function(input, output) {
# Create a reactive variable named "filtered_data"
filtered_data <- ___({
# Filter the data (copied from previous exercise)
data <- gapminder
data <- subset(
data,
lifeExp >= input$life[1] & lifeExp <= input$life[2]
)
if (input$continent != "All") {
data <- subset(
data,
continent == input$continent
)
}
data
})
output$table <- renderTable({
# Use the filtered_data variable to render the table output
data <- ___
data
})
output$download_data <- downloadHandler(
filename = "gapminder_data.csv",
content = function(file) {
# Use the filtered_data variable to create the data for
# the downloaded file
data <- ___
write.csv(data, file, row.names = FALSE)
}
)
output$plot <- renderPlot({
# Use the filtered_data variable to create the data for
# the plot
data <- ___
ggplot(data, aes(gdpPercap, lifeExp)) +
geom_point() +
scale_x_log10()
})
}
shinyApp(ui, server)