【问题标题】:R Shiny - Display static text outside sidebar panelR Shiny - 在侧边栏面板外显示静态文本
【发布时间】:2019-03-03 19:06:11
【问题描述】:

我想在 Shiny 的侧边栏面板之外显示静态文本。我能够在侧边栏面板内显示文本。但是,如果我尝试在侧边栏面板之外显示文本,则会收到此错误:“match.arg 中的错误:'arg' 必须为 NULL 或字符向量”。

下面是一个示例代码,它在侧边栏面板中显示“这是一个静态文本”这句话。我想在侧边栏面板“正下方”显示文本,但不在面板窗口内。

下面的代码给了我这个输出:

但我希望它看起来像这样:

我如何做到这一点?

library(shiny)

# Define UI for application that draws a histogram
ui <- fluidPage(

   # Application title
   titlePanel("Old Faithful Geyser Data"),

   # Sidebar with a slider input for number of bins 
   sidebarLayout(
      sidebarPanel(
         sliderInput("bins",
                     "Number of bins:",
                     min = 1,
                     max = 50,
                     value = 30),
         h5("This is a static text")
      ),

      # Show a plot of the generated distribution
      mainPanel(
         plotOutput("distPlot")
      )
   )
)

# Define server logic required to draw a histogram
server <- function(input, output) {

   output$distPlot <- renderPlot({
      # generate bins based on input$bins from ui.R
      x    <- faithful[, 2] 
      bins <- seq(min(x), max(x), length.out = input$bins + 1)

      # draw the histogram with the specified number of bins
      hist(x, breaks = bins, col = 'darkgray', border = 'white')
   })

}

# Run the application 
shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    sidebarPanel 函数会将所有内容放在 form 中,类为 well。一个 hacky 解决方案(也许有更好的解决方案)是创建一个自定义函数 siderbarPanelfunction 将元素放在 form 之外。下面是带有函数sidebarPanel2 的代码,它只是对原始函数的自定义,将元素放在“正下方”。你可以放任何东西,而不仅仅是文字。

    library(shiny)
    
    sidebarPanel2 <- function (..., out = NULL, width = 4) 
    {
      div(class = paste0("col-sm-", width), 
        tags$form(class = "well", ...),
        out
      )
    }
    
    # Define UI for application that draws a histogram
    ui <- fluidPage(
      # Application title
      titlePanel("Old Faithful Geyser Data"),
      # Sidebar with a slider input for number of bins 
      sidebarLayout(
        sidebarPanel2(fluid = FALSE,
          sliderInput("bins",
                     "Number of bins:",
                     min = 1,
                     max = 50,
                     value = 30),
          out = h5("This is a static text")
        ),
        # Show a plot of the generated distribution
        mainPanel(
          plotOutput("distPlot")
        )
      )
    )
    
    # Define server logic required to draw a histogram
    server <- function(input, output) {
       output$distPlot <- renderPlot({
          # generate bins based on input$bins from ui.R
          x    <- faithful[, 2] 
          bins <- seq(min(x), max(x), length.out = input$bins + 1)
          # draw the histogram with the specified number of bins
          hist(x, breaks = bins, col = 'darkgray', border = 'white')
       })
    }
    
    # Run the application 
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 谢谢。这解决了我的问题。在找到更好的解决方案之前,我将其标记为正确答案。 :)
    【解决方案2】:

    另一种选择:您根本不能使用sidebarLayout(),而只需定义自己的shiny-input-container 样式(有关调整滑块组件样式的更多示例,请参阅this answer)。然后,您可以使用 fluidRow()column() 嵌套 (example) 对输入小部件、文本和绘图进行更复杂的排列。

    library(shiny)
    
    # Define UI for application that draws a histogram
    ui <- fluidPage(
    
      #CSS Styles
      tags$style(HTML(
        paste0(".shiny-input-container {background-color: #f5f5f5; border: 1px solid #e3e3e3;",
               "padding-left: 10px; padding-right: 10px; border-radius: 3px;}")
               )),
    
      # Application title
      titlePanel("Old Faithful Geyser Data"),
    
      #use column to mimic sidebarPanel
      column(
        width = 4,
        sliderInput("bins",
                    "Number of bins:",
                    min = 1,
                    max = 50,
                    value = 30),    
        hr(),
        h5("This is a static text")
      ),
    
      #use column to mimic main panel
      column(
        width = 8,
        plotOutput("distPlot")
      )
    
    )
    
    # Define server logic required to draw a histogram
    server <- function(input, output) {
    
      output$distPlot <- renderPlot({
        # generate bins based on input$bins from ui.R
        x    <- faithful[, 2] 
        bins <- seq(min(x), max(x), length.out = input$bins + 1)
    
        # draw the histogram with the specified number of bins
        hist(x, breaks = bins, col = 'darkgray', border = 'white')
      })
    
    }
    
    # Run the application 
    shinyApp(ui = ui, server = server)
    

    reprex package (v0.2.1) 于 2018 年 9 月 28 日创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      • 2020-02-02
      • 1970-01-01
      相关资源
      最近更新 更多