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
<Kurs>Fallstudien: Webanwendungen mit Shiny in R erstellen</Kurs>Übungsanweisungen
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 praktische Übung
Versuche dich an dieser Übung, indem du diesen Beispielcode vervollständigst.
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)