Mach die Tabelle interaktiv
Datatables aus dem Paket DT sind oft die bessere Wahl, um Daten in einer Shiny-App anzuzeigen, verglichen mit den eingebauten Tabellen. Shiny-Tabellen lassen sich mit zwei einfachen Codeänderungen in Datatables umwandeln: Statt tableOutput() und renderTable() verwendest du DT::dataTableOutput() und DT::renderDataTable(). Datatables bieten zahlreiche Möglichkeiten zur Anpassung, aber wir werden hier keine speziellen Optionen nutzen.
Beachte, dass es beim Paket DT üblich ist, das Paket nicht zu laden, sondern beim Aufruf der Datatable-Funktionen das Präfix DT:: zu verwenden.
Diese Übung ist Teil des Kurses
Fallstudien: Webanwendungen mit Shiny in R erstellen
Anleitung zur Übung
Der Code für die Shiny-App aus der letzten Programmieraufgabe wird ohne Änderungen bereitgestellt. Deine Aufgabe ist es, die einfache Shiny-Tabelle durch eine DT-Tabelle zu ersetzen. Konkret:
- Ersetze im UI die Tabellen-Ausgabefunktion durch die
DT-Datatable-Ausgabe (Zeile 11). - Ersetze im Server die Tabellendarstellung durch eine
DT-Datatable-Renderfunktion (Zeile 31).
Interaktive Übung
Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.
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("download_data"),
plotOutput("plot"),
# Replace the tableOutput() with DT's version
tableOutput("table")
)
server <- function(input, output) {
filtered_data <- reactive({
data <- gapminder
data <- subset(
data,
lifeExp >= input$life[1] & lifeExp <= input$life[2]
)
if (input$continent != "All") {
data <- subset(
data,
continent == input$continent
)
}
data
})
# Replace the renderTable() with DT's version
output$table <- renderTable({
data <- filtered_data()
data
})
output$download_data <- downloadHandler(
filename = "gapminder_data.csv",
content = function(file) {
data <- filtered_data()
write.csv(data, file, row.names = FALSE)
}
)
output$plot <- renderPlot({
data <- filtered_data()
ggplot(data, aes(gdpPercap, lifeExp)) +
geom_point() +
scale_x_log10()
})
}
shinyApp(ui, server)