【问题标题】:How to align different input fields in Shiny (vertical offset/padding/alignment)?如何在 Shiny 中对齐不同的输入字段(垂直偏移/填充/对齐)?
【发布时间】:2018-02-15 16:31:43
【问题描述】:

新的闪亮。我正在为一些实验数据创建一个数据探索应用程序。

我首先选择一个变量作为子集,然后使用滑块为所述变量选择一个范围(如图所示)。子集数据以红色覆盖在原始图上。

我希望sliderInputselectInput 在同一级别对齐。最好的方法是什么?我还想为这些变量添加一个复选框或单选按钮,如果选择这些变量将添加一个辅助图(或辅助轴 - 我知道,不推荐,但这是所需要的)。我还没有实现,但把它放在这里,因为这需要相同的对齐。

代码

为简洁起见,sliderInputselectInput 的参数已被删除。 zdat() 是一个反应式data.table

用户界面

fluidRow(
    column(4,
           uiOutput("subsetZoomPlot_x"), # Select x-axis for SortZoomPlot
           uiOutput("subsetZoomPlot_y"), # Select y-axis for SortZoomPlot 
           uiOutput("subsetZoomPlot_var1"), # Subset data by var1 
           uiOutput("subsetZoomPlot_var2"), # Subset data by var2
           uiOutput("subsetZoomPlot_var3") # Subset zoomplot data by var3
           ),

    column(4,
           uiOutput("subsetZoomPlot_var1_slider"), # range for subsetZoomPlot_var1 (slider input)
           uiOutput("subsetZoomPlot_var2_slider"), # range for subsetZoomPlot_var1 (slider input)
           uiOutput("subsetZoomPlot_var3_slider") # range for subsetZoomPlot_var1 (slider input)
    )
  ),

  fluidRow(
    plotOutput("subsetZoomPlot")
  )

服务器

output$subsetZoomPlot_x <- renderUI({
    selectInput(inputId = "subsetZoomPlot_x", ...)
  })

  output$subsetZoomPlot_y <- renderUI({
    selectInput(inputId = "subsetZoomPlot_y", ...)
  })

  output$subsetZoomPlot_var1 <- renderUI({
    selectInput(inputId = "subsetZoomPlot_var1", ...)
  })

  output$subsetZoomPlot_var2 <- renderUI({
    selectInput(inputId = "subsetZoomPlot_var2", ...)
  })

  output$subsetZoomPlot_var3 <- renderUI({
    selectInput(inputId = "subsetZoomPlot_var3", ...)
  })

  output$subsetZoomPlot_var1_slider <- renderUI({
    vmin <- floor(min(zdat()[, get(input$subsetZoomPlot_var1)]))
    vmax <- ceiling(max(zdat()[, get(input$subsetZoomPlot_var1)]))
    sliderInput(...)
  })

  output$subsetZoomPlot_var2_slider <- renderUI({
    vmin <- floor(min(zdat()[, get(input$subsetZoomPlot_var2)]))
    vmax <- ceiling(max(zdat()[, get(input$subsetZoomPlot_var2)]))
    sliderInput(...)
  })

  output$subsetZoomPlot_var3_slider <- renderUI({
    vmin <- floor(min(zdat()[, get(input$subsetZoomPlot_var3)]))
    vmax <- ceiling(max(zdat()[, get(input$subsetZoomPlot_var3)]))
    sliderInput(...)
  })

编辑: 我为 UI 部分添加了我当前的代码。它已经有 fluidrow(column(), column()) 用于布局。我的问题是我希望var1 的滑块(屏幕截图中的rh)与选择rh 的下拉菜单(selectInput)对齐在同一级别,并且对于其他两个变量也是如此。这意味着第二列需要垂直移位。对selectInputsliderInput 的每个组合使用多个fluidrow 语句是唯一的方法吗?

【问题讨论】:

  • 元素对齐是 UI 的问题,所以你最好共享你的 UI 而不是你的服务器。无论如何,您应该read this guide,尤其是fluid grid system 上的部分。
  • 感谢您的建议,但这个问题更多的是水平对齐。我正在尝试找到一种方法来获得正确的垂直对齐,而无需为每一行输入变量和滑块创建一个新行。也就是说,如果有可能有垂直填充/偏移。

标签: r shiny


【解决方案1】:

所有布局问题都需要在闪亮应用代码的 UI 部分中解决。

据我所知,您的问题中包含的代码似乎位于服务器部分,因为您的应用中似乎有动态输入。

这是一些简单的 UI 代码,可以将选择输入与滑块输入对齐

library(shiny)


ui <- fluidPage(title = 'Example',

            fixedRow(
              column(width = 2,
                     selectInput('input1_choice', 'Select Plot variable 1',
                                 choices = letters[11:20])),
              column(width = 2,
                     sliderInput('input1_val', 'Select Variable 1 Value',
                                 0, 10, 5)
              )
            ),
            fixedRow(
              column(width = 2,
                     selectInput('input2_choice', 'Select Plot variable 2',
                                 choices = letters[1:10])
              ),
              column(width = 2,
                     sliderInput('input2_val', 'Select Varaible 2 Value',
                                 0, 10, 5)
              )
            )
)

shinyApp(ui, server = function(input, output) { })

因此,每个 fixedRow 调用都会在 UI 中创建一行,并且在 fixedRow 调用中的每个列调用都会在该行中创建一个列来填充 UI 对象。

当您更改 UI 对象的类型时,该行的高度可以更改,但不会重叠或渗入此处演示的另一行:

library(shiny)


ui <- fluidPage(title = 'Example',

            fixedRow(
              column(width = 2,
                     selectInput('input1_choice', 'Select Plot Variable 1',
                                 choices = letters[11:20])),
              column(width = 2,
                     radioButtons('input1_val', 'Select Variable 1 Value',
                                 choices = LETTERS[11:20])
              )
            ),
            fixedRow(
              column(width = 2,
                     selectInput('input2_choice', 'Select Plot Variable 2',
                                 choices = letters[1:10])
              )
            ),
            fixedRow(
              column(width = 2,
                     selectInput('input3_choice', 'Select Plot Variable 3',
                                 choices = letters[1:10])
              ),
              column(width = 2,
                     sliderInput('input3_val', 'Select Variable 3 Value',
                                 0, 10, 5)
              )
            )
)

shinyApp(ui, server = function(input, output) { })

这些示例与您需要的唯一区别是将我所做的显式 UI 对象调用(例如 selectInput)替换为 uiOutput 调用。

就像一些 cmets 所说的那样,那里有文档。我发现https://shiny.rstudio.com/reference/shiny/latest/ 特别有用。

【讨论】:

  • 感谢您的回答。我的 UI 代码中已经有 fluidrow。垂直对齐更重要 - 我希望变量的下拉菜单和变量的滑块处于同一级别,即 rh 的滑块将与选择 rh 的下拉菜单相邻。
  • 我没有足够的代表在答案中发布图像,但这是第二个代码块的 UI 输出的屏幕截图,如果这就是您要查找的内容,请告诉我 @987654322 @
  • 我使用了多个 fluidrow 语句来创建这个屏幕:imgur.com/a/WInOO 但这样做很乏味。仍在寻找垂直填充。这是我当前 ui 代码的屏幕截图:imgur.com/a/Zh7WC
【解决方案2】:

不确定它是否是最佳解决方案,但您可以在 UI 中使用列:

fluidRow(
column(4,selectInput("select_x", "Select X Axis", ...)),
column(8),
column(4,selectInput("select_y", "Select Y Axis", ...)),
column(8)
column(4, selectInput("subsetZoomPlot_var1", ...)),
column(4, sliderInput(...)),
column(4),
column(4, selectInput("subsetZoomPlot_var2", ...)),
column(4, sliderInput(...)),
column(4),
...
)

【讨论】:

    猜你喜欢
    • 2017-04-17
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2021-09-11
    • 2012-01-23
    • 2019-11-23
    相关资源
    最近更新 更多