在Shiny中创建一个可变数量的“sliderInput”

时间:2015-04-18 03:45:31

标签: r shiny

我的数据是一个列数可变的矩阵。此外,矩阵内的值范围也是可变的。 我想构建一个可变数量的sliderInput,每个都对应于矩阵中的一列。 每个滑块的上限应对应于矩阵中的maxRange。 有任何建议如何一次性完成吗?

 lapply(1:ncol, function(i) {
        sliderInput(
          paste0('a', i), 
          paste0('SelectA', i),
          min = min(c(1:maxRange)),
          max = max(c(1:maxRange)),
          value = c(1, maxRange),
          step =1
          )
      }
      )

2 个答案:

答案 0 :(得分:1)

当我想创建一组与数据集派生的值相对应的输入元素(min,max选项列表等)时,我遇到了类似的问题。从广义上讲,我会通过global.R获取所有必需的数据,然后引用元素中的概念,以便在滑块中获取min/max

<强> global.R

# Get dates for the slider
## Delete pointless month
dta.nom$DATE_NAME <- sub("February ", replacement = "", x = dta.nom$DATE_NAME)
## Convert to number and get min/max
dta.nom$DATE_NAME <- as.numeric(x = dta.nom$DATE_NAME)
yr.min <- min(dta.nom$DATE_NAME)
yr.max <- max(dta.nom$DATE_NAME)

然后在滑块

<强> ui.R

# Select the dates for the data
sliderInput("sliderYears", label = h5("Years"), min = yr.min, 
            max = yr.max, value = c(2000, 2010), sep = "",
            step = 1, animate = FALSE), 

完整代码位于GitHub。我不确定我是否理解正确,但如果您有兴趣在Shiny中动态连接界面元素,那么您可以使用updateSelectInput。使用global代码并引用界面元素中的值时,可以解决与引用数据有关的任何其他问题。

答案 1 :(得分:1)

如果有人遇到同样的问题,这是我的解决方案:

ui.R

    .... 
    sidebarPanel(
        selectInput(
            inputId = "dataName",
            label   = "Select your data",
            choices = c("data1", "data2", "data3", "data4")
          ),

        uiOutput(outputId = "sliders")
    ),
   .....

server.R

  .....
  output$sliders <- renderUI({
      numSliders <- numCols(input$dataName)
      lapply(1:numSliders, function(i) {
        sliderInput(
                    inputId = paste0('column', i),
                    label = paste0('Select the range for column ', i),
                    min = min(selectRange(input$dataName)),
                    max = max(selectRange(input$dataName)),
                    value = c(min(selectRange(input$dataName)), max(selectRange(input$dataName))),
                    step =1)
        })
    })
........

selectRangeglobal.R中的另一个功能:

global.R

selectRange <- function(x){
  if(x == "data1"){choices = c(1:100)}
  if(x == "data2"){choices = c(1:50)}
  if(x == "data3"){choices = c(1:75)}
  if(x == "data4"){choices = c(1:150)}
return(choices)  
}