2017-12-15 1 views
5

Ich habe eine Shiny-App - vereinfachtes Beispiel hier - und möchte, dass die Seitenleiste dynamisch ausgeblendet wird, wenn ich in Tab-Elementen navigiere. In der Tat werden Nutzer sich hauptsächlich mit ihrem Handy mit der App verbinden.R Shiny - Blendet die Seitenleiste automatisch aus, wenn Sie in Tab-Einträge navigieren

Mit Hilfe der Post Hide sidebar in default in shinydashboard kann ich standardmäßig die Seitenleiste ausblenden, wenn Sie in der App ankommen, aber nach der Seitenleiste wird immer angezeigt.

Hier ist mein eigentlicher Code:

### 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) 

Antwort

1

ich ein id zu Ihrem sidebarmenu hinzugefügt (Hinweis: nur ein benötigen sidebarmenu mit mehrer menuItems) und ein observeEvent auf Änderungen in dem ausgewählten Registerkarte zu hören, mit dass 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) 

Nun wird jedes Mal, wenn Sie von einer Registerkarte auf die andere wechseln, wird die Seitenleiste wieder ausgeblendet.

Hoffe, das hilft!

+0

Zusätzlicher Kommentar: Nachdem ich meine App veröffentlicht habe, ist das Verhalten gut, wenn ich einen Browser von meinem PC verwende, aber nicht, wenn ich einen Browser von meinem Handy verwende. Irgendeine Idee ? https://salsapedia.shinyapps.io/TestApp/ – Kumpelka

+1

Ich habe die Seite in einem mobilen Browser untersucht und es scheint, dass die verwendeten Klassen von der Breite des Browsers abhängen. Also habe ich die Zeile 'removeClass (selector =" body ", class =" sidebar-open ")' hinzugefügt, um mit kleinen Browsern umgehen zu können. Ich hoffe, dass dies Ihr Problem löst. – Florian

Verwandte Themen