我有一个在R Shiny的双面板页面的主面板中设置为100%宽度(默认)的图。侧边栏可以通过切换操作按钮进行隐藏。
当侧边栏可见(默认)时,该图填充主面板的宽度。当侧边栏被隐藏时,我想让情节扩展到现在可用空间的100%,即整个浏览器窗口。但这不会发生!它保持相同的大小。
library(shiny) library(shinyBS) UI <- fluidPage( bsButton("showpanel","Show/hide sidebar",type = "toggle",value = TRUE),sidebarLayout( conditionalPanel(condition = "input.showpanel == true",sidebarPanel("This is my sidebar.") ),mainPanel(plotOutput("plot",width = "100%")) ) ) SERVER <- function(input,output) { output$plot <- renderPlot({ plot(1:10,main = "The width of this plot adjusts\nto window resizes but not to\nshow/hide sidepanel!") }) } runApp(shinyApp(UI,SERVER))
目前为止:
>从UI文件中定义绘图对象,如上所述。
>将服务器文件中的plot对象定义为renderUI对象。
>根据标签设置CSS标签$ head(标签$ style(“#myplot {height:100vh!important;}”))从这个问题,Scaling shiny plots to window height。
可能的解决方法:
>使图形的宽度动态,并根据切换按钮的状态。然后我可以让剧情例如侧边栏隐藏时宽度为140%。这并不普遍,并且失去了使用fluidPage的适应性的要点。
(fluidPage根据浏览器窗口大小更改布局,例如,如果您将浏览器窗口关于手机的大小,则会将侧边栏放在主面板上方。)
解决方法
这样做的一个方法是使用反应式布局(有很多问题,例如
Switch between layouts reactively with shiny)。在你的情况下,会是这样的
library(shiny) library(shinyBS) UI <- shinyUI( fluidPage( bsButton("showpanel",uIoUtput('ui') ) ) SERVER <- function(input,output) { output$ui <- renderUI({ if (input$showpanel) { sidebarLayout( sidebarPanel("This is my sidebar."),mainPanel(plotOutput('plot')) ) } else { plotOutput('plot') } }) output$plot <- renderPlot({ plot(1:10,main = "The width of this plot adjusts\nto window resizes and to\nshow/hide sidepanel!") }) } runApp(shinyApp(UI,SERVER))