R shiny custom icon/image in selectInput

前端 未结 3 940
你的背包
你的背包 2020-12-23 23:29

I have the following code in my shiny application to give the user the possibly to choose what pointshape they would like to use on the plot.

selectInput(\"p         


        
3条回答
  •  长情又很酷
    2020-12-24 00:19

    Here is a working example. The aim here is to display the colours in the colour palette (rather than just the palette name) to the user in the dropdown menu. Here the images in dropdown are created during runtime. This may or may not be desirable. If the images in dropdown never change (ie; static), See SeGa's answer.

    This is modified from the example shown here.

    ui.R file

    ## UI.R
    
    fluidPage(
      title='Plots in Selectize Input',
      tags$h2('Plots in Selectize Input'),
      fluidRow(
        column(4,
               selectizeInput('palette',label="Palette",choices=NULL,options=list(
                 placeholder='Select a colour palette',maxOptions=4)
               )),
        column(8,
          plotOutput('plot')
          )
        )
      )
    

    server.R file

    ## SERVER.R
    
    library(ggplot2)
    
    data(diamonds)
    len <- length(levels(diamonds$cut))
    clist <- list("rainbow"=rainbow(len),"topo"=topo.colors(len),
                  "terrain"=terrain.colors(len),"cm"=cm.colors(len))
    
    function(input,output,session) {
    
      paletteurl <- session$registerDataObj(
    
        name='uniquename1',
        data=clist,
        filter=function(data,req) {
    
          query <- parseQueryString(req$QUERY_STRING)
          palette <- query$palette
          cols <- clist[[palette]]
    
          image <- tempfile()
          tryCatch({
            png(image,width=100,height=50,bg='transparent')
            par(mar=c(0,0,0,0))
            barplot(rep(1,length(cols)),col=cols,axes=F)
          },finally = dev.off())
    
          shiny:::httpResponse(
            200,'image/png',readBin(image,'raw',file.info(image)[,'size'])
          )
        }
      )
    
      updateSelectizeInput(
        session,'palette',server=TRUE,
        choices=names(clist),
        selected=1,
        options=list(render=I(sprintf(
          "{
            option: function(item, escape) {
            return '
    ' + escape(item.value) + '
    '; } }", paletteurl ))) ) output$plot <- renderPlot({ shiny::req(input$palette) cols <- clist[[input$palette]] ggplot(diamonds,aes(x=carat,y=price,colour=cut))+ geom_point()+ scale_colour_manual(values=cols)+ theme_minimal(base_size=18) }) }

    If someone understands this better, you are welcome to improve/update this answer. Even add another answer to show a different usage.

提交回复
热议问题