如何在Shiny(垂直偏移/填充/对齐)中对齐不同的输入字段?

时间:2018-02-15 16:31:44

标签: r shiny

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

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

enter image description here

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

CODE

sliderInputselectInput的论点已被删除,以简洁起见。 zdat()是一个被动的data.table

UI

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")
  )

SERVER

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)并且其他两个变量也一样。这意味着第二列需要垂直移位。对于fluidrowselectInput的每个组合,使用多个sliderInput语句是唯一的方法吗?

2 个答案:

答案 0 :(得分:0)

所有布局问题都需要在闪亮的应用代码的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) { })

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

就像有些评论说那里有文件。我发现https://shiny.rstudio.com/reference/shiny/latest/特别有用。

答案 1 :(得分:0)

不确定它是最佳解决方案,但您可以在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),
...
)
相关问题