Ваш первый shinydashboard

Создание дашбордов с помощью shinydashboard

Png Kee Seng

Researcher

Что мы уже умеем

  • Разметка пользовательского интерфейса (UI)
    • Заголовок, боковая панель, тело
  • Определите выходные данные и их взаимодействие с пользовательским вводом
  • Эту роль выполняет server

рисунок

header <- dashboardHeader(...)
sidebar <- dashboardSidebar(...)
body <- dashboardBody(...)

ui <- dashboardPage(header, sidebar, body)
server <- function(input, output) { ... }
shinyApp(ui, server)
Создание дашбордов с помощью shinydashboard

Server

  • Необходимо определить выходные и входные данные
  • Задайте выходные данные и их взаимодействие с пользовательским вводом
  • Удобно выносить вспомогательные функции отдельно — это снижает загромождённость кода и улучшает его читаемость
    • Размещайте такие функции в начале кода

Server — как официант, который передаёт ваши пожелания на кухню. Server в shinyApp сообщает R, как входные данные должны взаимодействовать с выходными.

Создание дашбордов с помощью shinydashboard

Добавление графика

  • Возвращаемся к дашборду глобального футбольного турнира
  • Добавим hexbin-график для команды 1
  • Затем разместим этот график в server
  • Что если нужен такой же график для команды 2?
soccer %>%
  ggplot(aes(x=`1_passes_compeletd`, 
             y=`1_goal_prevented`)) +
  geom_hex(bins=10) + theme_classic()
server <- function(input, output){
  output$plot1 <- renderPlot({
  fifa %>%
    ggplot(aes(x=`1_passes_compeletd`, 
               y=`1_goal_prevented`)) +
    geom_hex(bins=10) + theme_classic()
  })
}
Создание дашбордов с помощью shinydashboard

Определение объектов ggplot внутри server

server <- function(input, output) {
  output$plot1 <- renderPlot({
    if (input$team == 1){

fifa %>% ggplot(aes(x=`1_passes_compeletd`, y=`1_goal_prevented`)) + geom_hex(bins=10) + theme_classic()
} else if (input$team == 2){
fifa %>% ggplot(aes(x=`2_passes_compeletd`, y=`2_goal_prevented`)) + geom_hex(bins=10) + theme_classic()
} }) }
Создание дашбордов с помощью shinydashboard

Использование вспомогательных функций

plot_hex <- function(team){
  if (team == 1){
    soccer %>% ggplot(aes(x=`1_passes_compeletd`, 
                        y=`1_goal_prevented`)) +
      geom_hex(bins=10) + theme_classic()
  }
  else if (team == 2){
    soccer %>% ggplot(aes(x=`2_passes_compeletd`, 
                        y=`2_goal_prevented`)) +
      geom_hex(bins=10) + theme_classic()
  }
}
Создание дашбордов с помощью shinydashboard

Использование вспомогательных функций

С вспомогательной функцией

server <- function(input, output) {
  output$plot1 <- renderPlot(plot_hex(input$team)) 
}
  • Разве так не читабельнее?

Без вспомогательной функции

server <- function(input, output) {
  output$plot1 <- renderPlot({
    if (input$team == 1){
      soccer %>% ggplot(aes(x=`1_passes_compeletd`, 
              y=`1_goal_prevented`)) +
        geom_hex(bins=10) + theme_classic()
      }
    else if (input$team == 2){
      soccer %>% ggplot(aes(x=`2_passes_compeletd`, 
              y=`2_goal_prevented`)) +
        geom_hex(bins=10) + theme_classic()
      }
    })
}
Создание дашбордов с помощью shinydashboard

Собираем всё вместе

# A complete shinydashboard

header <- dashboardHeader(title = "Soccer tournament")
sidebar <- dashboardSidebar(sidebarMenu(menuItem("Passes/goals", tabName = "passtab"), menuItem("Empty", tabName = "emptytab")))
body <- dashboardBody(tabItems( tabItem("passtab", fluidRow(box(selectInput("team", "Team number", choices = c(1,2))), box(plotOutput("plot1"))) ), tabItem("emptytab")) )
ui <- dashboardPage(header, sidebar, body)
server <- function(input, output) { output$plot1 <- renderPlot(plot_hex(input$team)) }
shinyApp(ui, server)
Создание дашбордов с помощью shinydashboard

Анимация, показывающая, как выглядит готовый shinydashboard. Пользователь может переключаться между страницами и вкладками, а также задавать входные данные для получения разных результатов.

Создание дашбордов с помощью shinydashboard

Давайте потренируемся!

Создание дашбордов с помощью shinydashboard

Preparing Video For Download...