R/shinyjs: 使用功能 show/hide 侧边栏后,绘图超出框宽
R/shinyjs: Plot appears beyond the box width after using function show/hide sidebar
几天以来,我一直在尝试寻找解决方案,以解决在使用功能 show/hide 侧边栏时在闪亮的应用程序中出现错误(超出框宽度)的情况。
示例代码如下:
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 时,绘图被调整大小并且 x 轴被切割:
我没有正确解决此问题,但解决方法是在您对 plotOutput()
的调用中也设置宽度(例如,我试过 width=800
)。然后图的尺寸将被固定并且(一旦 window 调整到适当的尺寸)图不会被切割。
一个 "hacky" 方法是在 add/remove 侧边栏时触发 window 调整大小事件,以强制在侧边栏关闭后以正确的大小重新绘制绘图shown/hidden:
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"); }')
几天以来,我一直在尝试寻找解决方案,以解决在使用功能 show/hide 侧边栏时在闪亮的应用程序中出现错误(超出框宽度)的情况。
示例代码如下:
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 时,绘图被调整大小并且 x 轴被切割:
我没有正确解决此问题,但解决方法是在您对 plotOutput()
的调用中也设置宽度(例如,我试过 width=800
)。然后图的尺寸将被固定并且(一旦 window 调整到适当的尺寸)图不会被切割。
一个 "hacky" 方法是在 add/remove 侧边栏时触发 window 调整大小事件,以强制在侧边栏关闭后以正确的大小重新绘制绘图shown/hidden:
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"); }')