【问题标题】:R Shiny layout of blocks, rows and headersR 块、行和标题的闪亮布局
【发布时间】:2020-02-03 18:00:21
【问题描述】:

我正在完成我的 R Shiny 应用程序,我正在为块和标题的布局而苦苦挣扎。因为我有很多块,所以我单独构建了我的布局,并使用fluidRow 和column 的组合在我的Shiny 应用程序的ui 中对其进行了编码。通常我的每个块都有一个标题,形式为 p(...),然后是相同形式下的一些信息。

由于我喜欢拥有“控件”侧边栏面板的想法,因此我的应用左侧的块用于控制我在应用上使用的不同输入。当用户做事时,左侧的块是受影响和修改的块。

我有一个属于同一“类别”的完整行块。它是一个动态 UI,可以有 1 到 8 个块,具体取决于用户可以使用的滑块输入。我想要实现的是在块上方有一个标题行(段落或标题,无关紧要),然后有块,同时在“控制面板”上只保留一个单元左侧。

几张图让大家看得更清楚:

https://i.imgur.com/Htt4oIK.jpg 是我目前大部分街区所拥有的。标题一行(蓝色),内容一行(绿色)。深绿色是一般的“行”,红色是“块”。此布局的代码如下:

fluidRow(
    column(4, wellPanel()),
    column(2, mainPanel(
        p("blue"),
        p("green")
    )),
    column(2, mainPanel()),
    column(2, mainPanel()),
    column(2, mainPanel())
)

现在,那个:

https://i.imgur.com/i728blL.jpg 是我想要达到的目标,但我还没有达到那个结果。我尝试了几件事:

1) 对标题和内容使用不同的fluidRow。问题在于格式,因为左侧的控制框是第一行的一部分,它限制了行本身的高度,这意味着标题将远高于内容。看起来像这样:https://i.imgur.com/sU0AEds.jpg,我想减少无用的空间。

语法是:

fluidRow(
    column(4, wellPanel()),
    column(8, mainPanel(
        p("blue")
    ))
),
fluidRow(
    column(4, mainPanel()),
    column(2, mainPanel(
        p("green")
    )),
    column(2, mainPanel()),
    column(2, mainPanel()),
    column(2, mainPanel())
)

2) 将子块嵌套在更大的列中。代码如下:

fluidRow(
    column(4, wellPanel()),
    column(8, mainPanel(
        p("blue"),
        column(2, mainPanel(
            p("green")
        )),
        column(2, mainPanel()),
        column(2, mainPanel()),
        column(2, mainPanel())
    ))
)

问题在于,不知何故,列中的列似乎表现不正常。不是让宽度为 2 的列占据我宽度为 8 列的整个空间,而是它们最终具有奇怪的宽度并相互重叠。

想法?可能有一个简单的 HMTL 解决方案,但我真的不是这方面的专家。 谢谢!

【问题讨论】:

标签: html r layout shiny


【解决方案1】:

您可以将第二列拆分为宽度为 3 的四列。将这些列放在 fluidRow 中也会使它们与上面的标题元素对齐。


编辑

动态生成的列和框。将框的宽度设置为ceiling(12 / number of boxes)。当宽度之和超过 12 时,框会溢出第二行。我们必须使用ceilingfloor 之类的东西,因为引导系统中不允许使用分数,并且当width 为例如1.5 时,框会继承父列的宽度。一个选项是将最大框宽度设置为 3,并在用户选择 > 4 个框时具有两行布局。


代码:

library(shiny)

wp <- tagList(wellPanel(
  h3("Title"),
  p(
    "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
  )
))

ui <- fluidPage(fluidRow(
  column(
    width = 4,
    wp,
    sliderInput(
      "n_boxes",
      label = "Number of boxes",
      min = 1,
      max = 8,
      value = 2,
      step = 1
    )
  ),
  column(width = 8,
         wellPanel(h2("T I T L E")),
         uiOutput("blocks"))
))

server <- function(input, output) {
  make_boxes <- reactive({
    box_width <- ceiling(12 / input$n_boxes)
    message(box_width)

    x <-
      lapply(1:input$n_boxes, function(x)
        column(width = box_width, wp))
    x
  })

  output$blocks <- renderUI({
    fluidRow(make_boxes())
  })
}

shinyApp(ui, server)

有关允许列的 with 超过 12 并使用水平滚动条的潜在替代方法,请查看此线程:R shiny Dashboard : Exceed the bootstrap width = 12 and add an horizontal scrollbar

【讨论】:

  • 您好,感谢您提出此解决方案。标题效果很好,但其他内容没有。我在标题下有可变数量的块(1 到 8 个),所以每个单元的宽度不能超过 1。我期待看到会占据页面 2/3 的内容,但实际上它们使用 1 个单位空间,无论它们是否嵌套在子流体行中。此外,当单位数量达到 8 个时,最后一个通常会在新行上结束(可能只是一个显示错误)。有趣的是,在浏览器上,页面一直在“调整”宽度,这使得它基本上不可读。
  • 看看我的编辑是否能让你更接近。并查看链接中的替代方法。
  • 这行得通。我仍然在浏览器版本的 Shiny 上遇到一些显示故障。这很奇怪,就像页面在“抽搐”一样,好像在不断地调整它的宽度却不知道该适应哪个宽度。我在 Chrome 上只有 75% 的缩放级别有问题,其他都很好,这很奇怪......我不知道究竟是什么导致了这个问题。我对 SO 不是很熟悉,我现在应该用绿色复选标记你的答案吗?
  • 如果您认为我的回复解决了您的问题,您可以单击复选标记“接受”该答案。但您也可以等待其他成员回复可能更好的解决方案。它是由你决定。见:stackoverflow.com/help/someone-answers
  • 我认为您的回答已经足够好了(此外,您提供了两种不同的解决方案)。再次感谢!
猜你喜欢
  • 2018-10-04
  • 2022-10-14
  • 2020-07-04
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 2018-07-30
  • 1970-01-01
相关资源
最近更新 更多