Расширяя на изменение цвета 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 (в идеалехотелось бы иметь возможность использовать код для любого количества кнопок) и я думаю, что есть более элегантное решение для сохранения нажатой опции, чем у меня выше.
Любые советы / советы / помощь приветствуются!