【问题标题】:Fixed position for sidebar and mainpanel in RShinyR Shiny 中侧边栏和主面板的固定位置
【发布时间】:2019-05-31 09:07:56
【问题描述】:

我想在我的 RShiny 应用程序中有一个固定宽度的侧边栏,在调整窗口大小时它保持在原位。

我已经设法获得了一个固定宽度的侧边栏,但侧边栏和主面板之间仍然存在白色间距。似乎应该有一个直截了当的解决方案,但我的搜索到目前为止是徒劳的。

这是一个基于“Old Faithful Geyser Data”模板的最小示例。我添加了将侧面板保持在固定宽度的标签。

library(shiny)

ui <- fluidPage(

   titlePanel("Old Faithful Geyser Data"),
   sidebarLayout(
      sidebarPanel(
          tags$head(
              tags$style(type="text/css", "select { max-width: 240px; }"),
              tags$style(type="text/css", ".span4 { max-width: 290px; }"),
              tags$style(type="text/css", ".well { max-width: 280px; }")
          ),
         sliderInput("bins", "Number of bins:", min = 1, max = 50, value = 30)
      ),
      mainPanel(
         plotOutput("distPlot")
      )
   )
)

server <- function(input, output) {
   output$distPlot <- renderPlot({
      x    <- faithful[, 2] 
      bins <- seq(min(x), max(x), length.out = input$bins + 1)
      hist(x, breaks = bins, col = 'darkgray', border = 'white')
   })
}

shinyApp(ui = ui, server = server)

正常输出看起来不错。

当拖动窗口时,侧边栏会变得非常宽,从主面板中占据宝贵的屏幕空间。

固定侧边栏面板的宽度时,它在扩展窗口时保持形状,但主面板无法利用整个区域。期望的反应是侧边栏面板保持大小不变​​,而主面板可以利用所有可用空间。

有人对如何解决这个问题有任何想法吗?谢谢!

【问题讨论】:

  • 不完全是所需的功能,但sidebarPanel(width = 3,...) 是否适合您?侧边栏不会固定为宽度,但比例会固定,..?
  • 感谢您的建议!我也试过这个,但我对它并不满意。我正在使用 RShiny 探索一个大型交互式数据表,经常将其拉伸到多个计算机显示器上以尽可能多地查看,所以所有“屏幕空间”在这里都很重要,如果我将侧面板做得太薄对于正常的窗口宽度,输入看起来很奇怪。

标签: r shiny


【解决方案1】:

这样可以吗?

library(shiny)

ui <- fluidPage(
  tags$head(
    tags$style(type="text/css", "select { max-width: 240px; }"),
    tags$style(type="text/css", ".span4 { max-width: 290px; }"),
    tags$style(type="text/css", ".well { max-width: 280px; }")
  ),

  titlePanel("Old Faithful Geyser Data"),
  div(
    style = "display:flex; align-items:flex-start",
    wellPanel( # sidebar
      sliderInput("bins", "Number of bins:", min = 1, max = 50, value = 30),
      textInput("text", "Enter text:")
    ),
    div( # main panel
      style = "flex-grow:1; resize:horizontal; overflow: hidden",
      plotOutput("distPlot")
    )
  )
)

server <- function(input, output) {
  output$distPlot <- renderPlot({
    x    <- faithful[, 2] 
    bins <- seq(min(x), max(x), length.out = input$bins + 1)
    hist(x, breaks = bins, col = 'darkgray', border = 'white')
  })
}

shinyApp(ui = ui, server = server)

【讨论】:

  • 感谢您的代码!差不多好了。但是当我运行它时,输入面板最终会出现在图上方。能不能把它放到主图的左边?
  • @Jakob37 奇怪,我不明白这种行为。我用的是 Chrome,你呢?你可以试试style = "display:flex; align-items:flex-start; flex-direction:row"
  • 在此解决方案的 wellPanel 中添加行 style = "float:left;" 正是我所追求的。太好了,谢谢!
  • 我在 Ubuntu 上使用 Chromium。我尝试根据您的评论更新样式 - 在这种情况下,它仍然会出现在不同的行上。
  • 啊哈,现在明白了。我通常通过 R-studio 查看器运行。直接在 Chrome 中运行它时,您的初始解决方案效果很好。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
相关资源
最近更新 更多