R,Shiny:selectInput

时间:2017-04-23 17:04:03

标签: r shiny

我很擅长闪亮,但我没有找到解决方案来做我想做的事。

我的目标是为动态创建的选择字段(selectInput)设置上一个/下一个按钮(我需要这个用于未来的开发,因为选择将随数据集的变化而变化)。

我从这篇文章中激励自己Add back/next button to date range input in shiny

但是我无法在我的情况下做同样的事情。

这是我尝试的一个简单示例(目标是将其应用于更复杂的数据集)。

library(shiny)

vector_choices <- seq(5, 50, by = 5)

ui <- fluidPage(
    sidebarLayout(
        sidebarPanel(
            uiOutput("selector"),
            tags$div(class="row",
                     tags$div(uiOutput("prevBin")),
                     tags$div(uiOutput("nextBin")))

      ),

      mainPanel(
         textOutput("text"),
         plotOutput("distPlot")
      )
   )
)

server <- function(input, output, session) {
    output$selector <- renderUI({
        selectInput("bins",
                    "Bins",
                    choices = as.list(vector_choices),
                    selected = 25)
    })

    output$prevBin <- renderUI({
        actionButton("prevBin", 
                     label = "Previous")
    })
    output$nextBin <- renderUI({
        actionButton("nextBin", 
                     label = "Next")
    })

    observeEvent(input$prevBin, {
        current <- which(vector_choices == input$bins)
        if(current > 1){
            updateSelectInput(session, "bins",
                              choices = as.list(vector_choices),
                              selected = vector_choices[current - 1])
        }
    })
    observeEvent(input$nextBin, {
        current <- which(vector_choices == input$bins)
        if(current < length(vector_choices)){
            updateSelectInput(session, "bins",
                              choices = as.list(vector_choices),
                              selected = vector_choices[current + 1])
        }
    })

    output$distPlot <- renderPlot({
      x <- rnorm(100)
      bins <- seq(min(x), max(x), length.out = as.numeric(input$bins))
      hist(x, breaks = bins, col = 'darkgray', border = 'white')
    })
}

shinyApp(ui = ui, server = server)

如果有人遇到这个问题,或者是一位有光泽的专家,可以指出我正确的方向,我们将不胜感激。

由于

编辑:我根据BigDataScientist的答案更正了代码,并为列表的第一次和最后一次出现添加了条件。

1 个答案:

答案 0 :(得分:2)

你很亲密。

您要更新selectInput()而不是renderUI()创建selectInput()的{​​{1}}

因此请将updateSelectInput() "selector"替换为"bins"

updateSelectInput(session, "bins", choices = vector_choices,
                      selected = vector_choices[current - 1])