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 merupakan bagian dari kursus
Studi Kasus: Membangun Aplikasi Web dengan Shiny di R
Instruksi 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 langsung praktik
Cobalah latihan ini dengan melengkapi kode contoh ini.
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)