Is there any way to get a tooltip for each and every cell in datatable in r shiny? There are so many ways to get the hover row or column. But I could not find a way to get both row and column index and show a different hover tooltip for each and every cell. Can anyone modify the following code?
library(shiny)
library(DT)
shinyApp(
ui = fluidPage(
dataTableOutput('table'),
verbatimTextOutput('hoverIndex'),
),
server = function(server, input, output) {
output$hoverIndex <- renderText({
UI_out <- input$hoverIndexJS
return(paste("hover column info", UI_out))
})
output$table <- renderDataTable({
DT_out <- data.frame(`A` = 1:5, `B` = 11:15, `C` = LETTERS[1:5])
DT_out <- datatable(DT_out
,rownames = F
,callback = JS("
/* code for columns on hover */
table.on('mouseenter', 'td', function() {
var td = $(this);
var col = table.cell( this ).index().columnVisible;
var row = table.cell( this ).index().row;
$('td[row][col]).attr('title', row+col);
Shiny.onInputChange('hoverIndexJS', info_out);
});"
)
)
return(DT_out)
})
}
)
It is entirely possible, but you messed up the callback
code.
There was a typo in there, which failed the whole script. Additionally, you have to know that the callback should return the table object in order to work. If you dont, the table won't even be drawn.
Here is a corrected version with lighter logic.
library(shiny)
library(DT)
shinyApp(
ui = fluidPage(
dataTableOutput('table'),
verbatimTextOutput('hoverIndex')
),
server = function(server, input, output) {
output$hoverIndex <- renderText({
paste("hover column info", input$hoverIndexJS)
})
output$table <- renderDataTable({
datatable(data.frame(`A` = 1:5, `B` = 11:15, `C` = LETTERS[1:5]),
rownames = F,
callback = JS("
table.on('mouseenter', 'td', function() {
Shiny.onInputChange('hoverIndexJS', this.innerHTML);
});
return table;
")
)
})
}
)
Answering the comment, below is a version with two tables. But it is kind of cheap way to do it.
library(shiny)
library(DT)
shinyApp(
ui = fluidPage(
dataTableOutput('tableWithHoverEffect'),
dataTableOutput('tableWithHoverData')
),
server = function(session, input, output) {
observeEvent(input$hoveredCellInfo, {
info <- input$hoveredCellInfo
content <- as.character(table2[info$row, info$column])
})
table1 <- data.frame(A = 1:5, B = 11:15, C = LETTERS[1:5])
table2 <- data.frame(D = 10:14, E = LETTERS[6:10], F = c(T, F, F, T, T))
output$tableWithHoverEffect <- renderDataTable({
datatable(table1, rownames = F,
callback = JS("
table.on('mouseenter', 'tbody td', function() {
var column = $(this).index();
var row = $(this).parent().index();
var dataFromOtherTable = $('#tableWithHoverData').find('tbody tr').eq(row).find('td').eq(column).text();
this.setAttribute('title', dataFromOtherTable);
});
return table;
")
)
})
output$tableWithHoverData <- renderDataTable({
datatable(table2, rownames = F)
})
}
)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With