我是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)