Изменить выбор с помощью selectInput ИЛИ actionButton - PullRequest
0 голосов
/ 19 февраля 2019

Я разрабатываю приложение Shiny для анализа результатов опроса и хочу, чтобы пользователи могли выбирать вопрос из выпадающего списка selectInput («Перейти к выбору») или нажатия actionButtons («Предыдущий»)., "Следующий").Эти статьи были полезной отправной точкой:

https://shiny.rstudio.com/reference/shiny/1.0.4/reactiveVal.html

https://shiny.rstudio.com/articles/action-buttons.html

Моя проблема в том, что selectInput конфликтует с результатами actionButtons, так какоба контролируют один и тот же объект.Как мне заставить их работать вместе?Я не хочу использовать isolate() с selectInput и заставлять пользователей нажимать дополнительную кнопку;Я бы хотел, чтобы выбор изменился, как только они его выберут.Спасибо!

library(shiny)

ui <- fluidPage(

   mainPanel(

     actionButton("previous_q", 
                  "Previous"), 
     actionButton("next_q", 
                  "Next"), 
     selectInput("jump", 
                 "Jump to Question", 
                 choices = 1:10), 
     textOutput("selected")

   )
)

server <- function(input, output) {

  # Select based on "Previous" and "Next" buttons -------

  selected <- reactiveVal(1)

  observeEvent(input$previous_q, {

    newSelection <- selected() - 1
    selected(newSelection)

  })

  observeEvent(input$next_q, {

    newSelection <- selected() + 1
    selected(newSelection)

  })

  # Jump to selection (COMMENTED OUT SO APP DOESN'T CRASH) ----------------

  #observeEvent(input$jump, {

    #newSelection <- input$jump
    #selected(newSelection)

  #})

  # Display selected

  output$selected <- renderText({ 
    paste(selected())                     
  })
}

shinyApp(ui = ui, server = server)

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Добро пожаловать на SO!

@ StéphaneLaurent был немного быстрее - я все равно опубликую свое решение: как он уже упоминал, вам понадобится as.integer(input$jump)

Более того, вы этого не делаетенужно reactiveVal() "выбрано".Это также заботится об ограничении вашего выбора:

library(shiny)

selectInputChoices = 1:10

ui <- fluidPage(mainPanel(
  actionButton("previous_q",
               "Previous"),
  actionButton("next_q",
               "Next"),
  selectInput(
    "jump",
    "Jump to Question",
    choices = selectInputChoices,
    selected = 1
  ),
  textOutput("selected")
))

server <- function(input, output, session) {
  # Select based on "Previous" and "Next" buttons -------
  observeEvent(input$previous_q, {
    req(input$jump)
    if (as.integer(input$jump) > min(selectInputChoices)) {
      newSelection <- as.integer(input$jump) - 1
      updateSelectInput(session, inputId = "jump", selected = newSelection)
    }
  })

  observeEvent(input$next_q, {
    req(input$jump)
    if (as.integer(input$jump) < max(selectInputChoices)) {
      newSelection <- as.integer(input$jump) + 1
      updateSelectInput(session, inputId = "jump", selected = newSelection)
    }
  })

  # Display selected
  output$selected <- renderText({
    req(input$jump)
    paste(input$jump)
  })
}

shinyApp(ui = ui, server = server)
0 голосов
/ 19 февраля 2019

Проблема в том, что input$jump - это строка символов, а не число.Do:

  observeEvent(input$jump, {

    newSelection <- as.integer(input$jump)
    selected(newSelection)

  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...