renderUI中的闪亮滑块-停止更新选择参数

时间:2018-08-07 20:22:44

标签: shiny shiny-reactivity

我是Shiny的新手;尝试制作具有动态范围游标滑块的仪表板,其中每个新滑块的左值将被迫等于前一个的右值。

我想让用户灵活地创建年龄段。他首先选择 x_level 个段(作为简单的数字输入)。然后在服务器功能中,我尝试创建 x_level 个滑块。在第一个中,应将左侧处理程序固定为最小年龄(例如18岁),并且用户可以修改右侧处理程序。在下一个滑块中,他应将左处理程序固定到在第一个处理程序上刚刚选择的内容,然后他可以再次选择右处理程序。因此它看起来像范围滑块(具有两个值),但实际上只有合适的值才是灵活的。

问题在于,一旦我指定了 selected 参数,每次评估renderUI函数时,滑块上的范围就会返回到最初指定的选定值。

一些注意事项: -本质上,我不需要指定 selected 参数,但这是我知道的让Widget知道它是范围滑块的唯一方法,而不是单值滑块(创建于未指定已选择) -为每个滑块创建单独的输出而不是循环执行可解决该问题,但是在这种情况下,滑块的数量不再灵活。

任何方向,我将不胜感激!谢谢。

library(shiny)

ui <- fluidPage(
 numericInput("x_levels", "Number of segments:", 1,min=1,max=10, width = "200px"),
 uiOutput("x_sliders")
          )

server <- function(input, output, session) {

output$x_sliders <- renderUI({
n <- input$x_levels
values <- seq(18, 99, 1)

lapply(1:n, FUN = function(i) {

if (i==1) {

  shinyWidgets::sliderTextInput(paste0("x_slider",i),paste0("Select range for segment",i),
                                choices=values, selected = c(18, 28), 
                                from_fixed = 18, 
                                grid = T)
          }

  else {

  shinyWidgets::sliderTextInput(paste0("x_slider",i),paste0("Select range for segment",i),
                                choices=values, selected = c(as.numeric(input[[paste0("x_slider",i-1)]][2]), as.numeric(input[[paste0("x_slider",i-1)]][2]+10), 
                                from_fixed = as.numeric(input[[paste0("x_slider",i-1)]][2]),
                                grid = T))
   }                     

  })
})    
}
shinyApp(ui, server)

0 个答案:

没有答案