2017-01-24 4 views
4

seit einigen Tagen Ich versuche, Lösung zu plotten erscheinen falsch (über die Breite der Box) in glänzenden app während Verwendung der Funktion zeigen/ausblenden Sidebar.R/shinyjs: Plot erscheint über die Box-Breite nach der Verwendung der Funktion zeigen/verbergen Sidebar

Es folgt ein Beispielcode:

library(shiny) 
library(shinydashboard) 
library(ggplot2) 
library(shinyjs) 

ui <- dashboardPage(
    dashboardHeader(), 
    dashboardSidebar(), 
    dashboardBody(
    useShinyjs(), 
    extendShinyjs(text = 'shinyjs.hideSidebar = function(params) { $("body").addClass("sidebar-collapse") }'), 
    extendShinyjs(text='shinyjs.showSidebar = function(params) { $("body").removeClass("sidebar-collapse") }'), 
    fluidRow(tabsetPanel(id='tabs', 
         tabPanel(value=1,title="Plot1", 
            fluidRow(
            column(12, 
            plotOutput('plot1', height=800)))), 
         tabPanel(value=2, title="Plot2", 
            fluidRow(
            column(12, 
            plotOutput('plot2', height=800)))) 
      ) 
    ))) 
) 
) 

server <- function(input, output, session) { 
    output$plot1 <- renderPlot({ 
    out <- ggplot(data.frame(X1=rnorm(1000)),aes(X1))+ 
     geom_density(fill='light blue')+ 
     theme_minimal() 
    print(out) 
    }) 
    output$plot2 <- renderPlot({ 
    out <- ggplot(data.frame(X1=rnorm(1000)),aes(X1))+ 
     geom_density(fill='light blue')+ 
     theme_minimal() 
    print(out) 
    }) 

    observe({ 
    if (input$tabs == 1) { 
     js$hideSidebar() 
    } 
    else { 
     js$showSidebar() 
    } 
    }) 
} 

shinyApp(ui, server) 

Wie wir in diesem Beispielcode sehen können, ich die Sidebar möchte angezeigt werden, wenn der Benutzer die zweite Registerkarte öffnet (Sidebar brach zusammen, als input$tabs == 1). Es funktioniert ziemlich gut, außer wenn ich drücke tab2 zu sehen, dann zu tab1 zurückgehen und wieder Tab2, das Grundstück der Größe verändert und die x-Achse geschnitten:

enter image description here

+0

Sie definieren den Datensatz, den Sie plotten, jedes Mal neu, wenn Sie auf die Registerkarten klicken, weil der Aufruf von 'rnorm()' in 'renderPlot' steht. Ist das nicht die Ursache Ihres Problems? – ddiez

+0

Oh, ich ziehe meinen vorherigen Kommentar zurück. Ich habe einen festen Datensatz verwendet und jetzt habe ich Ihren Standpunkt verstanden (in Ihrem Beispiel könnte es besser sein, die Verwirrung zu beseitigen, die durch die Änderung des Diagramms verursacht wurde). – ddiez

+0

Nur ein nicht verwandter Seitenkommentar: Sie können beide js-Funktionen in einem Aufruf/in einer Zeichenfolge definieren. Sie müssen 'extendShinyjs()' nicht zweimal aufrufen –

Antwort

1

A „Hacky“ Weg, dies zu tun, ist ein Fenster Größe ändern Ereignis auszulösen, wenn Sie die Seitenleiste hinzufügen/entfernen die Handlung zu zwingen, in der richtigen Größe neu gezeichnet werden, nachdem die Sidebar ist/versteckt gezeigt:

extendShinyjs(text = 'shinyjs.hideSidebar = function(params) { $("body").addClass("sidebar-collapse"); 
       $(window).trigger("resize"); }'), 
extendShinyjs(text='shinyjs.showSidebar = function(params) { $("body").removeClass("sidebar-collapse"); 
       $(window).trigger("resize"); }') 
0

ich nicht von eine korrekte Lösung für dieses Problem, aber eine Problemumgehung ist, auch die Breite in Ihrem Anruf auf plotOutput() (zB ich habe versucht width=800). Dann werden die Abmessungen des Plots festgelegt und (sobald das Fenster auf die entsprechenden Abmessungen verkleinert wird) wird das Plot nicht geschnitten.

+0

Danke für die Antwort, aber es ist wichtig für mich, dass die Handlung reaktionsfreudig ist, deshalb ist es nicht die Lösung für mich, die Breite als fest einzustellen. Danke trotzdem! –

+1

Kein Problem! Shinydashboard-Tag hinzugefügt, da ich denke, dass es dort ein Problem sein könnte. Vielleicht gibt Ihnen jemand anderes eine bessere Lösung. – ddiez

Verwandte Themen