Вот решение с headerCallback
.
library(shiny)
library(DT)
library(glue) # for easier text concatenation
x <- data.frame(a_long_column_name = c("AAAAA", "AAA", "AAA", "BBB", "BBB", "CCC"),
a_really_unnecessarily_long_column_name = c("Alice", "Alice", "Alice", "Bob", "Bob", "Charlie"),
a_silly_and_unnecessarily_long_column_name_which_i_cant_change = c("T-Shirt", "Pants", "Socks", "Socks", "Pants", "T-Shirt"),
another_silly_and_unnecessarily_long_column_name_which_i_cant_change = c("Red", "Orange", "Green", "Blue", "Purple", "Yellow"))
headerCallback <- c(
"function(thead, data, start, end, display){",
sprintf(" var tooltips = [%s];", toString(paste0("'", colnames(x), "'"))),
" for(var i = 1; i <= tooltips.length; i++){",
" $('th:eq('+i+')',thead).attr('title', tooltips[i-1]);",
" }",
"}"
)
runApp(list(
ui = basicPage(
DTOutput('mytable')
),
server = function(input, output) {
output$mytable = renderDT({
datatable(
x,
selection = "single",
filter = "top",
colnames = glue(
"{substr(colnames(x),1,5)}..."
),
options = list(
headerCallback= JS(headerCallback)
)
)
})
}
))
РЕДАКТИРОВАТЬ
Вот решение с использованием библиотеки qTip2 .
library(shiny)
library(DT)
library(glue) # for easier text concatenation
x <- data.frame(a_long_column_name = c("AAAAA", "AAA", "AAA", "BBB", "BBB", "CCC"),
a_really_unnecessarily_long_column_name = c("Alice", "Alice", "Alice", "Bob", "Bob", "Charlie"),
a_silly_and_unnecessarily_long_column_name_which_i_cant_change = c("T-Shirt", "Pants", "Socks", "Socks", "Pants", "T-Shirt"),
another_silly_and_unnecessarily_long_column_name_which_i_cant_change = c("Red", "Orange", "Green", "Blue", "Purple", "Yellow"))
qTips <- function(titles){
settings <- sprintf(paste(
"{",
" content: {",
" text: '%s'",
" },",
" show: {",
" ready: false",
" },",
" position: {",
" my: 'bottom %%s',",
" at: 'center center'",
" },",
" style: {",
" classes: 'qtip-youtube'",
" }",
"}",
sep = "\n"
), titles)
n <- length(titles)
settings <- sprintf(settings, ifelse(1:n > n/2, "right", "left"))
sprintf("var tooltips = [%s];", paste0(settings, collapse=","))
}
headerCallback <- c(
"function(thead, data, start, end, display){",
qTips(colnames(x)),
" for(var i = 1; i <= tooltips.length; i++){",
" $('th:eq('+i+')',thead).qtip(tooltips[i-1]);",
" }",
"}"
)
runApp(list(
ui = basicPage(
tags$head(
tags$link(rel = "stylesheet", type = "text/css", href = "https://cdnjs.cloudflare.com/ajax/libs/qtip2/3.0.3/jquery.qtip.css"),
tags$script(src = "https://cdnjs.cloudflare.com/ajax/libs/qtip2/3.0.3/jquery.qtip.js")
),
br(),
DTOutput('mytable')
),
server = function(input, output) {
output$mytable = renderDT({
datatable(
x,
selection = "single",
filter = "top",
colnames = glue("{substr(colnames(x),1,5)}..."),
options = list(
headerCallback= JS(headerCallback)
)
)
})
}
))
Эти всплывающие подсказки можно настраивать путем установки атрибута style.classes
.Например, используйте этот CSS:
.myqtip {
font-size: 15px;
line-height: 18px;
background-color: rgb(245,245,245,0.8);
border-color: rgb(54,57,64);
}
и установите classes: 'myqtip'
вместо classes: 'qtip-youtube'
.Смотрите сайт для демонстраций.Вы также можете изменить положение, установить эффект скрытия и т. Д.