Как использовать selectInput в качестве кнопки действия?

#r #shiny

Вопрос:

Я пытаюсь использовать selectInput в качестве кнопки действия. Мне нравится, как каждый раз, когда я нажимаю кнопку действия, счетчик добавляет цифры. Я пытаюсь добиться того же эффекта для selectInput.

В приведенном ниже примере я демонстрирую функциональность кнопки действия. Я попытался имитировать этот эффект с помощью selectInput с помощью этого кода.

  selectnumber <- eventReactive(input$select,
                                if (input$select == "A") {
                                             input$action   1
  })
  
 

При таком подходе число обновляется, но это зависит от кнопки действия. Вместо этого я бы хотел, чтобы номер обновлялся всякий раз, когда я выбираю A после того, как я выбрал B.

 library(shiny)

ui <- fluidPage(
    sidebarLayout(
        sidebarPanel(
          selectInput("select", "Select Input", choices = c(" ", "A", "B")),
          actionButton("action", "Action Button")
        ),
        mainPanel(
         textOutput("out1"),
          textOutput("out2")
        )
    )
)

server <- function(input, output) {
  output$out1 <- renderText({
    paste("Action Button: ", input$action)
  })
  
#  count <- reactive({
#    input$action
# })
  
  selectnumber <- eventReactive(input$select,
                                if (input$select == "A") {
   input$action   1
  })
  
  output$out2 <- renderText({
    paste("Select Input: ", selectnumber())
  })
}

options(shiny.autoreload = TRUE)
shinyApp(ui = ui, server = server)


 

Есть ли лучший рабочий способ заставить selectInput вести себя как кнопка действия?

Ответ №1:

Вот один из способов использования observeEvent и reactiveValues . Это увеличивает количество при каждом выборе 'A' в selectInput .

 library(shiny)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput("select", "Select Input", choices = c(" ", "A", "B")),
      actionButton("action", "Action Button")
    ),
    mainPanel(
      textOutput("out1"),
      textOutput("out2")
    )
  )
)

server <- function(input, output) {

  rv <- reactiveValues(count = 0)
  output$out1 <- renderText({
    paste("Action Button: ", input$action)
  })
  
  observeEvent(input$select, {
          if (input$select == "A") rv$count <- rv$count   1
  })
  
  output$out2 <- renderText({
    paste("Select Input: ", rv$count)
  })
}

options(shiny.autoreload = TRUE)
shinyApp(ui = ui, server = server)