htmlcssrdataframeshiny

Displaying a vector of values wrapping at screen width


I have a vector of values and each value is associated with a name; length of vector changes as per the user input. Although I used table related commands, I like to know other ways to display this kind of data, which is essentially a vector (a single row) of values with names). The problem shows up when selected sample size produces the output that is greater than screen width. Scrolling horizontally allows flexibility to glance over the data, but I am looking for a solution that wraps up the data at the screen width and prints in multiple rows without the need to scroll. Here is the code to play:

ui <- fluidPage(
   tabPanel("Test",
            numericInput("samsize","specify sample size",4,1,52),
            tableOutput('table')
   ))

server <- function(input, output) {

   data <- reactive({

      # create a vector of lower- and upper- case alphabets
      # create a vector assigning numbers to alphabets
      alphabets <- c(letters,LETTERS)
      Index <- seq(1,length(alphabets),1)
      names(Index) <- alphabets

      # sample values
      SampleIndex <- sample(Index,input$samsize)

      # convert it into a matrix
      data <- matrix(SampleIndex,nrow=1)
      colnames(data)=names(SampleIndex)

      data
   })

   output$table <- renderTable(data(),digits = 0)

}

shinyApp(ui, server)

As you see in the below picture, for a sample size '36' one need to scroll the page horizontally to see all the values.screen shot

width in renderTable did not offer any solution

Converting data into a html object/text might be one option, but not sure how to retain the names.


Solution

  • You can use renderUI together with uiOutput to create yourself the HTML object you want to display for example using div:

    library(shiny)
    ui <- fluidPage(
      tabPanel("Test",
               numericInput("samsize","specify sample size",4,1,52),
               uiOutput('myTable')
      ))
    
    server <- function(input, output) {
      data <- reactive({
        alphabets <- c(letters,LETTERS)
        Index <- seq(1,length(alphabets),1)
        names(Index) <- alphabets
    
        # Notice I don't put the vector in a one row matrix as in you example
        sample(Index,input$samsize)
      })
    
      library(purrr) # map is a nice alternative to lapply
      output$myTable <- renderUI(map(names(data()),~div(strong(.),
                                                        div(data()[.]),
                                                        style="float:left;padding:10px 20px;")))
    }
    
    shinyApp(ui, server)
    

    enter image description here