2017-12-15 85 views
5

Mam aplikację Shiny - uproszczony przykład tutaj - i chcę, aby pasek boczny ukrywał się dynamicznie po przejściu do elementów karty. Rzeczywiście użytkownicy będą łączyć się z aplikacją głównie za pomocą telefonu komórkowego.R Błyszczące - Automatyczne ukrywanie paska bocznego podczas nawigacji w elementach tabulatora.

Przy pomocy posta Hide sidebar in default in shinydashboard, wiem, jak ukryć domyślnie pasek boczny po dotarciu do aplikacji, ale po wyświetleniu paska bocznego.

Oto mój rzeczywisty kod:

### Load librairies 
library(shiny) ; library(shinydashboard) ; library(shinyjs) 
library(dplyr) 

### Load data 
Weather <- c("cold", "rain", "snow","heat","sun") 
Answer <- c("Take a coat","Take an umbrella","Take gloves","Take a swimsuit","Take solair cream") 
Mydata <- data.frame(Weather, Answer, stringsAsFactors = FALSE) 

remove(Weather, Answer) 

### Shiny 
Entete <- dashboardHeader(title = "My app") 

BarreLaterale <- dashboardSidebar(
    sidebarMenu(menuItem(text = "Home", tabName = "MyHome", icon = icon("home"))), 
    sidebarMenu(menuItem(text = "My search", tabName = "Search", icon = icon("search"))) 
) 

Corps <- dashboardBody(

    useShinyjs(), 

    tabItems(

    tabItem(tabName = "MyHome", 
      fluidPage("Hello, welcome to the home page") 
    ),   

    tabItem(tabName = "Search", 
      fluidRow(
       box(title = "Weather choice", width = 6, solidHeader = TRUE, status = "danger", 
        selectInput(inputId = "WeatherChoice", label = NULL, choices = unique(Mydata$Weather))), 
       box(title = "Answer", width = 6, solidHeader = TRUE, status = "danger", 
        textOutput("ReturnAnswer")) 
      ) 
    ) 

) 
) 

Interface <- dashboardPage(Entete, BarreLaterale, Corps, skin = "red") 

### Server R 
Serveur <- function(input, output, session) { 

    output$ReturnAnswer <- renderText({ 
    as.character(Mydata %>% filter(Weather == input$WeatherChoice) %>% select(Answer)) 
    }) 

    addClass(selector = "body", class = "sidebar-collapse") 

} 

### Application 
shinyApp(Interface, Serveur) 

Odpowiedz

1

I dodaje id do sidebarmenu (Uwaga: trzeba tylko jedną sidebarmenu z wieloma menuItems) oraz observeEvent słuchać zmian w wybranej zakładki, używając że id:

### Load librairies 
library(shiny) ; library(shinydashboard) ; library(shinyjs) 
library(dplyr) 

### Load data 
Weather <- c("cold", "rain", "snow","heat","sun") 
Answer <- c("Take a coat","Take an umbrella","Take gloves","Take a swimsuit","Take solair cream") 
Mydata <- data.frame(Weather, Answer, stringsAsFactors = FALSE) 

remove(Weather, Answer) 

### Shiny 
Entete <- dashboardHeader(title = "My app") 

BarreLaterale <- dashboardSidebar(
    sidebarMenu(id="mysidebar", 
       menuItem(text = "Home", tabName = "MyHome", icon = icon("home")), 
       menuItem(text = "My search", tabName = "Search", icon = icon("search"))) 
) 

Corps <- dashboardBody(

    useShinyjs(), 

    tabItems(

    tabItem(tabName = "MyHome", 
      fluidPage("Hello, welcome to the home page") 
    ),   

    tabItem(tabName = "Search", 
      fluidRow(
       box(title = "Weather choice", width = 6, solidHeader = TRUE, status = "danger", 
        selectInput(inputId = "WeatherChoice", label = NULL, choices = unique(Mydata$Weather))), 
       box(title = "Answer", width = 6, solidHeader = TRUE, status = "danger", 
        textOutput("ReturnAnswer")) 
      ) 
    ) 

) 
) 

Interface <- dashboardPage(Entete, BarreLaterale, Corps, skin = "red") 

### Server R 
Serveur <- function(input, output, session) { 

    output$ReturnAnswer <- renderText({ 
    as.character(Mydata %>% filter(Weather == input$WeatherChoice) %>% select(Answer)) 
    }) 

    # this line is now actually obsolete. 
    addClass(selector = "body", class = "sidebar-collapse") 

    observeEvent(input$mysidebar, 
       { 
       # for desktop browsers 
       addClass(selector = "body", class = "sidebar-collapse") 
       # for mobile browsers 
       removeClass(selector = "body", class = "sidebar-open") 
       }) 

### Application 
shinyApp(Interface, Serveur) 

teraz, za każdym razem przełączać z jednej karty na drugą, pasek boczny jest ponownie ukryte.

Mam nadzieję, że to pomoże!

+0

Dodatkowy komentarz: po opublikowaniu mojej aplikacji zachowanie jest dobre, gdy korzystam z przeglądarki z mojego komputera, ale nie w przeglądarce mobilnej. Dowolny pomysł ? https://salsapedia.shinyapps.io/TestApp/ – Kumpelka

+1

Sprawdziłem stronę w przeglądarce mobilnej i wydaje się, że używane klasy zależą od szerokości przeglądarki. Dodałem więc wiersz 'removeClass (selector =" body ", class =" sidebar-open ")' do obsługi przeglądarek o małej szerokości, mam nadzieję, że to rozwiązuje twój problem. – Florian

Powiązane problemy