Когда Shiny actionButtons нажал (и не щелкнул), измените цвет и запишите значение щелчка - PullRequest
0 голосов
/ 09 ноября 2019

Расширяя на изменение цвета actionButton Shiny R , я написал скрипт, который я надеюсь абстрагировать и упростить:

Я хочу иметь несколько actionButtons и менять их цвет в зависимости от того,нажмите кнопку, затем запишите выбранную опцию.

Требуемый вывод

library(shiny)
shinyApp(
  ui = fluidPage(
    uiOutput("button"),
    uiOutput("button2"),
    uiOutput("button3"),

    textOutput("clickedButton")
  ),
  server = function(input, output) {

    global <- reactiveValues(clicked = FALSE)

    observe({
      if(length(input$option1)){
        if(input$option1) global$clicked <- TRUE
        global2$clicked <- FALSE
        global3$clicked <- FALSE
      }
    })

    output$button <-  renderUI({
      if(!is.null(input$option1) & global$clicked){
        actionButton(inputId= "option1", "Option 1",
                     style = "color: white;
                     background-color: #35e51d;
                     position: relative;
                     text-align:center;
                     text-indent: -2px;
                     border-radius: 6px;
                     border-width: 2px;
                     float: left;
                     display: inline-block;
                     margin-right: 3px;")
      }else{
        actionButton(inputId= "option1", "Option 1",
                     style = "color: black;
                     background-color: white;
                     position: relative;
                     text-align:center;
                     text-indent: -2px;
                     border-radius: 6px;
                     border-width: 2px;
                     float: left;
                     display: inline-block;
                     margin-right: 3px;")
      }

    })

    global2 <- reactiveValues(clicked = FALSE)

    observe({
      if(length(input$option2)){
        if(input$option2) global2$clicked <- TRUE
        global$clicked <- FALSE
        global3$clicked <- FALSE
      }
    })

    output$button2 <-  renderUI({
      if(!is.null(input$option2) & global2$clicked){
        actionButton(inputId= "option2", "Option 2",
                     style = "color: white;
                     background-color: #35e51d;
                     position: relative;
                     text-align:center;
                     text-indent: -2px;
                     border-radius: 6px;
                     border-width: 2px;
                     float: left;
                     display: inline-block;
                     margin-right: 3px;")
      }else{
        actionButton(inputId= "option2", "Option 2",
                     style = "color: black;
                     background-color: white;
                     position: relative;
                     text-align:center;
                     text-indent: -2px;
                     border-radius: 6px;
                     border-width: 2px;
                     display: inline-block;
                     float: left;
                     margin-right: 3px;")
      }
    })

      global3 <- reactiveValues(clicked = FALSE)


      observe({
        if(length(input$option3)){
          if(input$option3) global3$clicked <- TRUE
          global$clicked <- FALSE
          global2$clicked <- FALSE
        }
      })

      output$button3 <-  renderUI({
        if(!is.null(input$option3) & global3$clicked){
          actionButton(inputId= "option3", "Option 3",
                       style = "color: white;
                       background-color: #35e51d;
                       position: relative;
                       text-align:center;
                       text-indent: -2px;
                       border-radius: 6px;
                       border-width: 2px
                       float: left;
                       display: inline-block;
                       margin-right: 3px;")
        }else{
          actionButton(inputId= "option3", "Option 3",
                       style = "color: black;
                       background-color: white;
                       position: relative;
                       text-align:center;
                       text-indent: -2px;
                       border-radius: 6px;
                       border-width: 2px
                       float: left;
                       display: inline-block;
                       margin-right: 3px;")
        }

      })


      output$clickedButton <- renderText({
        clicked <- c(global$clicked, global2$clicked, global3$clicked)
        names <- c("Option 1", "Option 2", "Option 3")
        names[which(clicked == TRUE)]
      })
  }
)

Этот код чрезвычайно хрупок с множеством операторов наблюдения для переключения между global, global2 и global3 (в идеалехотелось бы иметь возможность использовать код для любого количества кнопок) и я думаю, что есть более элегантное решение для сохранения нажатой опции, чем у меня выше.

Любые советы / советы / помощь приветствуются!

1 Ответ

1 голос
/ 10 ноября 2019

Опция, использующая radioGroupButtons в пакете shinyWidgets:

library(shiny)
library(shinyWidgets)

ui <- fluidPage(
  radioGroupButtons(
    inputId = "somevalue",
    label = "Make a choice: ",
    choices = c("Option 1", "Option 2", "Option 3"),
    individual = TRUE
  ),
  verbatimTextOutput("value")
)

server <- function(input, output) {
  output[["value"]] <- renderPrint({ input[["somevalue"]] })
}

shinyApp(ui, server)

enter image description here

...