fonts - style - shinydashboard cheat sheet
cómo hacer que la casilla checkboxgroup ingrese código de color en Shiny (3)
Es un poco de mente abierta. Investigué un poco con Google, pero sin éxito.
Tengo un proyecto brillante, en el que uso un checkboxGroupInput en el panel lateral, algo así:
checkboxGroupInput("variable", "Variable:", choices = names ,selected = names )
donde los ''nombres'' son un vector de caracteres.
Incluyo leyenda (diferentes colores para diferentes nombres) en un gráfico en el panel principal. Ahora estoy pensando en cambiar los colores de texto de los nombres (un color para cada nombre) en el panel lateral para poder deshacerme de la leyenda en el gráfico.
Alguien sabe como hacerlo? muchas gracias.
@HubertL
Tu versión final funciona genial. Sin embargo, quiero que las cosas sean más dinámicas: en lugar de asignar un color a una opción permanentemente, prefiero asignar los primeros N colores al elemento N elegido. Desafortunadamente, el código que he personalizado no funciona como quiero.
Por ejemplo, tengo 6 colores, y tengo las seis variables elegidas por defecto, cuando desactivo cualquiera de (dos, tres, cuatro, cinco), supongo que los colores después de la verificación se actualizarán correctamente. digamos (''azul'', ''rojo'', ''verde'', ''púrpura'', ''limón'', ''marrón'') para (''uno'', ''dos'', ''tres'', ''cuatro'', ''cinco'', '' seis '') ; cuando elimino ''tres'', quiero ver (''azul'', ''rojo'', ''verde'', ''púrpura'', ''limón'') para (''uno'', ''dos'', ''cuatro'', ''cinco'' , ''seis''), pero el color real es (''azul'', ''rojo'', ''púrpura'', ''limón'', ''azul'') .
aquí está el código que usé para probar:
my_names <- c (''uno'', ''dos'', ''tres'', ''cuatro'', ''cinco'', ''seis'')
my_selected <- c (''uno'', ''dos'', ''tres'', ''cuatro'', ''cinco'', ''seis'')
my_colors <-c (''azul'', ''rojo'', ''verde'', ''púrpura'', ''limón'', ''marrón'')
shinyApp (ui = fluidPage (uiOutput ("my_cbgi")),
server = function(input, output, session) { my <- reactiveValues(selected=my_selected) observeEvent(input$variable,{my$selected <- input$variable}) output$my_cbgi <- renderUI(my_checkboxGroupInput("variable", "Variable:", choices = my_names, selected=my$selected, colors=my_colors[1:length(my$selected)])) })
No se puede hacer esto directamente en brillante, PERO se puede analizar el HTML creado brillante en el inspector del navegador /
<div id="variable" class="form-group shiny-input-checkboxgroup shiny-input-container">
<label class="control-label" for="variable">Variable:</label>
<div class="shiny-options-group">
<div class="checkbox">
<label>
<input type="checkbox" name="variable" value="1" checked="checked"/>
<span>one</span>
</label>
</div>
<div class="checkbox">
<label>
<input type="checkbox" name="variable" value="2" checked="checked"/>
<span>two</span>
</label>
</div>
<div class="checkbox">
<label>
<input type="checkbox" name="variable" value="3"/>
<span>three</span>
</label>
</div>
</div>
</div>
luego puedes recrearlo usando renderUI
:
my_checkboxGroupInput <- function(variable, label, choices, selected, colors){
choices_names <- choices
if(length(names(choices))>0) my_names <- names(choices)
div(id=variable,class="form-group shiny-input-checkboxgroup shiny-input-container shiny-bound-input",
HTML(paste0(''<label class="control-label" for="'',variable,''">'',label,''</label>'')),
div( class="shiny-options-group",
HTML(paste0(''<div class="checkbox" style="color:'', colors,''">'',
''<label>'',
''<input type="checkbox" name="'', variable,
''" value="'', choices,
''"'', ifelse(choices %in% selected, ''checked="checked"'', ''''),
''/>'',
''<span>'', choices_names,''</span>'',
''</label>'',
''</div>'', collapse = " "))
)
)
}
library(shiny)
my_names <- c(''one''=1,''two''=2,''three''=3)
my_selected <- c(1,2)
my_colors <-c(''blue'',''red'',''green'')
shinyApp(
ui=fluidPage(uiOutput("my_cbgi")),
server = function(input, output, session) {
output$my_cbgi <- renderUI(my_checkboxGroupInput("variable", "Variable:",
choices = my_names,
selected=my_selected,
colors=my_colors))
}
)
Editar
Para mostrar en color solo los elementos seleccionados, necesita modificar ligeramente la función y usar un valor reactivo para mapear la entrada $ variable como la selección actual, como esta:
my_checkboxGroupInput <- function(variable, label,choices, selected, colors){
my_names <- choices
if(length(names(choices))>0) my_names <- names(choices)
div(id=variable,class="form-group shiny-input-checkboxgroup shiny-input-container shiny-bound-input",
HTML(paste0(''<label class="control-label" for="'',variable,''">'',label,''</label>'')),
div( class="shiny-options-group",
HTML(paste0(''<div class="checkbox">'',
''<label>'',
''<input type="checkbox" name="'', variable,
''" value="'', choices,
''"'', ifelse(choices %in% selected, ''checked="checked"'', ''''),
''/>'',
''<span '', ifelse(choices %in% selected, paste0(''style="color:'', colors,''"''),''''), ''>'',my_names,''</span>'',
''</label>'',
''</div>'', collapse = " "))
)
)
}
my_names <- c(''one''=1,''two''=2,''three''=3)
my_selected <- c(1,2)
my_colors <-c(''blue'',''red'',''green'')
shinyApp(ui=fluidPage(uiOutput("my_cbgi")),
server = function(input, output, session) {
my <- reactiveValues(selected=my_selected)
observeEvent(input$variable,{my$selected <- input$variable})
output$my_cbgi <- renderUI(my_checkboxGroupInput("variable", "Variable:",
choices = my_names,
selected=my$selected,
colors=my_colors))
})
Puede usar las tags$style
para eso:
lapply(1:length(names), function(x) {
n <- length(names)
col <- gplots::col2hex(rainbow(n)[x])
css_col <- paste0("#variable div.checkbox:nth-child(",x,
") span{color: ", col,";}")
tags$style(type="text/css", css_col)
}),
checkboxGroupInput("variable", "Variable:",
choices = names, selected = names)