如何防止 splitLayout、Shiny、R 中的两个输入标签重叠?

Posted

技术标签:

【中文标题】如何防止 splitLayout、Shiny、R 中的两个输入标签重叠?【英文标题】:How to prevent the overlapping of two input labels in splitLayout, Shiny, R? 【发布时间】:2019-09-04 03:59:41 【问题描述】:

以下示例的ui 包含四个selectInput。最后两个在splitLayout 中。我注意到,当我启动应用程序时,如果窗口大小不够大,最后两个标签会重叠,如第一个屏幕截图所示。是否可以使splitLayout 中的输入标签动态变化取决于窗口的宽度?比较将是前两个selectInput。如第二个屏幕截图所示,当我减小窗口宽度时,标签会变为两行。我希望splitLayout 中的最后两个selectInput 具有相同的行为。

library(shiny)

# Define UI
ui <- fluidPage(
  mainPanel(
    selectInput(inputId = "A", label = "This is a long lebel with lots of words", choices = letters[1:5], selected = "a"),
    selectInput(inputId = "B", label = "This is a long lebel with lots of words", choices = letters[1:5], selected = "a"),
    splitLayout(
      selectInput(inputId = "C", label = "This is a long lebel with lots of words", choices = letters[1:5], selected = "a"),
      selectInput(inputId = "D", label = "This is a long lebel with lots of words", choices = letters[1:5], selected = "a"),
      # Expand the menu in splitLayout
      # From: https://***.com/a/40098855/7669809
      tags$head(tags$style(html("
                              .shiny-split-layout > div 
                                overflow: visible;
                              
                              ")))
  )
  )
)

# Server logic
server <- function(input, output, session)



# Complete app with UI and server components
shinyApp(ui, server)

第一张截图:

第二张截图:

更新

@Simran 指出overflow: visible 是导致此问题的原因。但是,我需要这个来根据这篇文章在selectInput 中扩展我的菜单:https://***.com/a/40098855/7669809

【问题讨论】:

可能重复:***.com/questions/3587390/… @Simran 感谢您指出这篇文章。尽管我相信您提到的帖子与我的问题有关,但该帖子并未提及有关Shiny 的任何内容。我没有 HTML 方面的经验。如果您不介意,您能否帮助我开发正确的 div 行,我可以插入到我的 R 代码中? 【参考方案1】:

我假设您可以选择使用 fluidRow()column()

那么你可以使用:

    fluidRow(
      column(width = 4,
        selectInput(...)
      ),
      column(width = 4,
        selectInput(...)
      )
    )

注 1:

你可以通过column()的width参数来控制输入的宽度。

注2:

旁注:如果您想使用 12 的全宽,您还必须将 mainPanel() 设置为 12,参见例如这里: https://***.com/a/44214927/3502164

完整应用 - 可重现的示例:

library(shiny)

# Define UI
ui <- fluidPage(
  mainPanel(
    selectInput(inputId = "A", label = "This is a long lebel with lots of words", choices = letters[1:5], selected = "a"),
    selectInput(inputId = "B", label = "This is a long lebel with lots of words", choices = letters[1:5], selected = "a"),
    fluidRow(
      column(width = 4,
        selectInput(inputId = "C", label = "This is a long lebel with lots of words", choices = letters[1:5], selected = "a")        
      ),
      column(width = 4,
        selectInput(inputId = "D", label = "This is a long lebel with lots of words", choices = letters[1:5], selected = "a")
      )
    ),
      # Expand the menu in splitLayout
      # From: https://***.com/a/40098855/7669809
      tags$head(tags$style(HTML("
                              .shiny-split-layout > div 
                                display: inline-block;
                              
                              ")))
    )
)

# Server logic
server <- function(input, output, session)



# Complete app with UI and server components
shinyApp(ui, server)

【讨论】:

很好的解决方案。谢谢。当系统允许我这样做时,我会奖励你赏金。【参考方案2】:

删除overflow: visible。这就是使文本溢出 div 的原因。我在您的代码中看到了这一点:

.shiny-split-layout > div 
  overflow: visible;

【讨论】:

感谢您的回答。我给了你一个赞成票。但是overflow: visible 是我在selectInput 中展开菜单所必需的。至少这是我从这篇文章“***.com/a/40098855/7669809”中学到的。有没有办法在防止文本溢出的同时扩展菜单? 我建议查看从您的代码生成的 HTML 输出,并添加针对更具体元素的样式。我怀疑您使用此样式所针对的div 是围绕其他元素的包装器,并且需要单独保留其溢出以像容器一样运行。也许一个更具体的元素需要overflow:visible,但这让我觉得这是一种可能需要不同布局的hacky方法。 感谢您的建议。好点子。我会调查div更多。

以上是关于如何防止 splitLayout、Shiny、R 中的两个输入标签重叠?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止我的 Shiny App 在开源闪亮服务器中断开连接?

如何在 R Shiny 中仅使用一个下载按钮下载多个图?

如何从 R/Shiny 应用程序下载多个文件?

R-Shiny:如何显示使用 saveHTML() 函数创建的动画和控件?

R Shiny:如何构建动态 UI(文本输入)

如何在 R Shiny 中翻页