tooltip or popover in Shiny datatables for row names?

前端 未结 2 2126
温柔的废话
温柔的废话 2020-12-18 06:54

I’m stuck with trying to include something like a tooltip or popover with additional info when the user hovers over / clicks on the row names of a datatable, so they don’t h

相关标签:
2条回答
  • 2020-12-18 07:12

    This code works but running in client side mode. To make it simpler I have used the first five rows of the iris dataset, but I guess the idea is clear. If you hover over the row names the tooltip will be displayed.

    ui.R

        library(shiny)
        library(DT)
        shinyUI(
                mainPanel(
                        DT::dataTableOutput("tbl")
                )   
        )    
    

    server.R

        library(shiny)
        library(DT)
        shinyServer(function(input, output,session) {
                output$tbl = DT::renderDataTable(
                        datatable(iris[1:5, ], callback = JS("
                                        var tips = ['First row name', 'Second row name', 'Third row name',
                                        'Fourth row name', 'Fifth row name'],
                                        firstColumn = $('#tbl tr td:first-child');
                                        for (var i = 0; i < tips.length; i++) {
                                        $(firstColumn[i]).attr('title', tips[i]);
                                        }")), server = FALSE)
        }) 
    
    0 讨论(0)
  • 2020-12-18 07:12

    It didn't work because your code didn't use the title attribute, that is used for displaying the label on hover.

    container = htmltools::withTags(table(
      class = 'display',
      thead(
        tr(lapply(rep(c('ratios','name1', 'name2', 'name3','name4','name5'), 1),th))
      )
    ))
    # OUTPUT OF CONTAINER
    #<table class="display">
    #  <thead>
    #    <tr>
    #      <th>ratios</th>
    #      <th>name1</th>
    #      <th>name2</th>
    #      <th>name3</th>
    #      <th>name4</th>
    #      <th>name5</th>
    #    </tr>
    #  </thead>
    #</table>
    

    I changed your code to the following (using the title attribute), and now it should work:

    Label is set with columnLabels <- paste0("label", 1:6) and other than that only container is changed.

      # Render table here 
      output$mytable <- DT::renderDataTable({
        columnLabels <- paste0("label", 1:6)
    
        DT::datatable(
          tdata[1:5,],
    
          options = list(paging = FALSE, searching = FALSE, info = FALSE, sort = FALSE,
                         columnDefs=list(list(targets=1:4, class="dt-right")) ),
    
          rownames = paste("rowname",1:5),
    
          container = htmltools::withTags(table(
            class = 'display',
            thead(
              #tags$th(title=active_columns[i], colnames(data)[i])
              tr(apply(data.frame(colnames=c('ratios','name1', 'name2', 'name3','name4','name5'), labels=columnLabels), 1,
                       function(x) th(title=x[2], x[1])))
            )
          ))
        )
      })
    # OUTPUT OF CONTAINER
    #<table class="display">
    #  <thead>
    #    <tr>
    #      <th title="label1">ratios</th>
    #      <th title="label2">name1</th>
    #      <th title="label3">name2</th>
    #      <th title="label4">name3</th>
    #      <th title="label5">name4</th>
    #      <th title="label6">name5</th>
    #    </tr>
    #  </thead>
    #</table>
    
    0 讨论(0)
提交回复
热议问题