非滑块数字范围输入

时间:2018-03-20 22:56:54

标签: r shiny

我正在开发一个应用程序,它根据用户选择他们想要过滤特定数据集的指标,动态地将一组UI元素(当前是滑块)呈现为三列。我遇到的问题是,不同的指标具有极其可变的范围(即商品总销售额与客户退货率),这意味着滑块不是最佳的。我想知道你是否有人知道数字范围输入可以采取两个数字输入(最小和最大)类似于范围滑块的末端?我无法使用此功能找到Shiny内置的东西,但我希望你们中的一个人可能有一些自定义输入元素的经验。任何帮助将不胜感激。请参阅下文,了解演示动态滑块生成的代码段。

谢谢!

output$filters <- renderUI({
if (input$geoselect == "US") {
  atts <- tolower(input$ucolselect)
 if(length(input$ucolselect) >= 3) {

  fluidRow(column(width = 4, lapply(1:round(
    1 / 3 * length(atts)
  ), function(i) {
    sliderInput(
      inputId = atts[i],
      label = atts[i],
      min = min(us[, tolower(colnames(us)) %in% atts[i]], na.rm = TRUE),
      max = max(us[, tolower(colnames(us)) %in% atts[i]], na.rm = TRUE)
      ,
      value = c(min(us[, tolower(colnames(us)) %in% atts[i]], na.rm = TRUE), max(us[, tolower(colnames(us)) %in% atts[i]], na.rm = TRUE)),
      step = NULL
    )
  })),
  column(width = 4,

         lapply((1 + round(1 / 3 * length(atts))):round(2 / 3 * length(atts)), function(i) {
           sliderInput(
             inputId = atts[i],
             label = atts[i],
             min = min(us[, tolower(colnames(us)) %in% atts[i]], na.rm = TRUE),
             max = max(us[, tolower(colnames(us)) %in% atts[i]], na.rm = TRUE)
             ,
             value = c(min(us[, tolower(colnames(us)) %in% atts[i]], na.rm = TRUE), max(us[, tolower(colnames(us)) %in% atts[i]], na.rm = TRUE)),
             step = NULL
           )
         })),
    .....

2 个答案:

答案 0 :(得分:1)

numericRangeInput()https://github.com/dreamRs/shinyWidgets/pull/150)中刚刚添加了一个名为shinyWidgets的功能。它不在CRAN上,但是您可以从GitHub安装开发版本。

devtools::install_github("dreamRs/shinyWidgets")

output$filters <- renderUI({
  if (input$geoselect == "US") {
    atts <- tolower(input$ucolselect)
    if (length(input$ucolselect) >= 3) {
      fluidRow(column(width = 4, lapply(1:round(
        1 / 3 * length(atts)
      ), function(i) {
        numericRangeInput(
          inputId = atts[i],
          label = atts[i],
          value = c(min(us[, tolower(colnames(us)) %in% atts[i]], na.rm = TRUE), max(us[, tolower(colnames(us)) %in% atts[i]], na.rm = TRUE))
        )
      })),
      column(width = 4,
             lapply((1 + round(1 / 3 * length(atts))):round(2 / 3 * length(atts)), function(i) {
               numericRangeInput(
                 inputId = atts[i],
                 label = atts[i],
                 value = c(min(us[, tolower(colnames(us)) %in% atts[i]], na.rm = TRUE), max(us[, tolower(colnames(us)) %in% atts[i]], na.rm = TRUE))
               )
             })), 

更新:numericRangeInput()现在位于shinyWidgets 0.4.5中的CRAN上

答案 1 :(得分:0)

为什么不numericInput?这还包括最小值,最大值和步长值。但据我所知,您可以输入大于最大值或小于最小值的值,因此最好在服务器上使用updateNumericInput()管理它,并在代码中以min:max范围返回值。希望我明白你的意思,这将有所帮助。