闪亮的滑块输入显示重复值

Posted

技术标签:

【中文标题】闪亮的滑块输入显示重复值【英文标题】:Shiny sliderInput showing duplicate values 【发布时间】:2022-01-15 06:07:54 【问题描述】:

我对@9​​87654324@ 有疑问。在我的应用程序中,当用户加载数据 (actionBTTN) 时,我的 sliderInput 的年份会根据该数据更新(使用 updateSliderInput)。但我注意到,对于包含几年 (4-5) 的数据,sliderInput 会显示重复的年份。我还注意到,它似乎只在我的屏幕尺寸更大时才会发生。

以下是小窗口的外观: no duplicated year values, how I would like it to be in the app 这是使用更大窗口时的外观: duplicated year values

这是我的应用程序示例:


library(shiny)
library(shinyWidgets)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      # initial input with no years selected, it will update once data is loaded
      sliderInput(
        inputId = "years", 
        label = "Choose a time range:", 
        min = 0, max = 1, 
        value = c(0,1), 
        #dragRange = TRUE, 
        step = 1, 
        sep = ''
      ),
      actionBttn(
        inputId = "load_data",
        label = "Get data!",
        color = "primary",
        style = "fill", 
        icon = icon("arrow-alt-circle-down"),
        size = "xs",
        block = TRUE
      )
    ),
    mainPanel()
  )
)

server = function(input, output, session) 
  observeEvent(input$load_data, 
    mydata <- data.frame(numbers = c(1:5), year = c(2010:2014))
    
    minim = min(mydata$year)
    maxim = max(mydata$year)
    
    updateSliderInput(session, inputId = "years",
                      min = minim, max = maxim, 
                      value = c(minim, maxim),
                      # calculate step dynamically (@Isa's idea)
                      step = seq(minim, maxim, length.out = length(mydata$year))[2] - seq(minim, maxim, length.out = length(mydata$year))[1])
  )


shinyApp(ui, server)

我已经尝试更改 stepsep 参数,还将 mydata$year 设置为整数。有没有人遇到过同样的问题? 欢迎所有帮助。

谢谢:)

【问题讨论】:

这可能是updateSliderInput() 中的一个错误,如问题#2398 中所述 谢谢!我会看的。但正如 2019 年报道的那样,我不认为他们目前正在研究它。但很高兴知道! 请尝试 alandipert 在该链接中的解决方法。 【参考方案1】:

也许这就是你所期待的

mydata <- data.frame(numbers = c(1:6), year = c(2010:2015))

library(shiny)
library(shinyWidgets)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      # initial input with no years selected, it will update once data is loaded
      sliderInput(
        inputId = "years", 
        label = "Choose a time range:", 
        min=0, max=1, 
        value = 0, 
        dragRange = TRUE, 
        step = seq(0, 1, length.out = length(mydata$year))[2] - seq(0, 1, length.out = length(mydata$year))[1], 
        # step = 0.2, # Above step calculates dynamically
        sep = ''
      ),
      actionBttn(
        inputId = "load_data",
        label = "Get data!",
        color = "primary",
        style = "fill", 
        icon = icon("arrow-alt-circle-down"),
        size = "xs",
        block = TRUE
      )
    ),
    mainPanel()
  )
)

server = function(input, output, session) 
  observeEvent(input$load_data, 
    min = min(mydata$year)
    max = max(mydata$year)

    updateSliderInput(session, inputId = "years",
                      min = min, max = max, 
                      value = min, step = 1)
  )


shinyApp(ui, server)

updateSliderInput 重复值背后的原因是,当参数 ticks 作为 TRUE 传递时,在 ui 对象中填充 sliderInput 生成的刻度数。

sliderInput 的场景代码后面为刻度数:

range <- max - min
if (ticks) 
    n_steps <- range/step
    scale_factor <- ceiling(n_steps/10)
    n_ticks <- n_steps/scale_factor

else 
    n_ticks <- NULL

您可以通过将光标保持在功能上并在窗口中按 f2 来检查任何功能的整体工作情况。

因此,如果我们希望这些值不重复,那么刻度数应该等于所考虑变量的不同值的数量。

【讨论】:

嗨@Isa,谢谢!这有很大帮助。问题是mydata 在选择后被加载,所以它只在“服务器端”可用(我的数据在reactiveVlaues 中)。我编辑了我的代码来表示它。我像你一样计算了这些步骤,但是在updateSliderInput 内它不起作用。刻度没有正确标记年份

以上是关于闪亮的滑块输入显示重复值的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个输入(旋钮)添加到单个滑块?

闪亮的条件面板绕过多个相关的滑块

闪亮的应用程序不更新隐藏的滑块

html 可重复使用的滑块

在ggplot中使用过滤器时闪亮的范围滑块错误

Kivy - 另一个屏幕上的滑块类值更改