Đặt các đầu ra khác nhau lên các tab khác nhau
Tab rất hữu ích khi bạn có quá nhiều nội dung và muốn chia nhỏ ra. Để tạo một tab, bạn chỉ cần bọc các phần tử UI trong hàm tabPanel(), và cung cấp tiêu đề cho tab bằng đối số title.
Để các tab xuất hiện trong UI, các tab panel cần được nhóm vào một “vùng chứa” tabset bằng cách bọc tất cả các tab panel trong tabsetPanel().
Nhiệm vụ của bạn là thêm các tab vào ứng dụng Shiny sao cho phần nhập liệu và nút tải xuống nằm trong một tab, biểu đồ ở một tab khác, và bảng ở tab thứ ba. Vì đây chỉ là thay đổi về giao diện, mọi chỉnh sửa mã đều thực hiện ở phần UI mà thôi.
Bài tập này là một phần của khóa học
Nghiên cứu tình huống: Xây dựng ứng dụng web với Shiny trong R
Hướng dẫn bài tập
- Dùng hàm
tabsetPanel()để tạo một vùng chứa cho ba tab panel:- Tab đầu tiên cho phần nhập liệu, và đặt tên tab là "Inputs".
- Tab thứ hai hiển thị biểu đồ, và đặt tên tab là "Plot" (dòng 16).
- Tab thứ ba hiển thị bảng, và đặt tên tab là "Table" (dòng 21).
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
ui <- fluidPage(
h1("Gapminder"),
# Create a container for tab panels
___(
# Create an "Inputs" tab
tabPanel(
title = ___,
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")
),
# Create a "Plot" tab
___(
title = "Plot",
plotOutput("plot")
),
# Create "Table" tab
___(
title = ___,
DT::dataTableOutput("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
})
output$table <- DT::renderDataTable({
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)