2017-01-24 12 views
4

с тех пор, как пару дней я пытаюсь найти решение для построения, которое появляется неправильно (за пределами ширины окна) в блестящем приложении при использовании функции show/hide sidebar.R/shinyjs: Plot появляется за пределами ширины окна после использования функции show/hide sidebar

Вот пример кода:

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) 

Как мы можем видеть в этом примере кода, я хотел бы боковой панели, чтобы появиться, когда пользователь открывает вторую вкладку (боковая панель рухнула, когда input$tabs == 1). Это работает очень хорошо, за исключением того, когда я нажимаю, чтобы увидеть TAB2, а затем вернуться к tab1 и снова TAB2, сюжет изменяется и ось х разрезают:

enter image description here

+0

Вы переопределяете набор данных, который вы планируете каждый раз, когда вы нажимаете вкладки, потому что вызов 'rnorm()' находится в 'renderPlot'. Разве это не источник вашей проблемы? – ddiez

+0

О, я убираю свой предыдущий комментарий. Я использовал фиксированный набор данных и теперь получил вашу точку (возможно, лучше сделать это в вашем примере, чтобы удалить путаницу, вызванную изменением сюжета). – ddiez

+0

Просто несвязанный комментарий стороны: вы можете определить обе функции js в одном вызове/в одной строке. Вам не нужно называть 'extendShinyjs()' дважды –

ответ

1

А «Hacky» способ сделать это, чтобы вызвать окно изменения размера события, когда вы добавить/удалить боковую панель, чтобы заставить участок перерисовывать нужный размер после того, как боковая панель показана/скрыты:

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

я не правильное исправление этой проблемы, но обходным путем является установка ширины в вашем вызове plotOutput() (например, я попробовал width=800). Тогда размеры графика будут фиксированными и (как только размер окна будет изменен до соответствующих размеров), график не будет разрезан.

+0

Спасибо за ответ, однако для меня важно, чтобы график был отзывчивым, поэтому установка ширины как фиксированной не является решением для меня. Спасибо, в любом случае! –

+1

Нет проблем! Добавлен тег shinydashboard, поскольку я чувствую, что это может быть проблемой. Возможно, кто-то еще даст вам лучшее решение. – ddiez