Ответ 1
Интересный вопрос и теперь благодаря недавнему обновлению Shiny до data.tables 1.10.2
гораздо проще использовать различные плагины и расширения. Для вашего вопроса расширение FixedHeader кажется идеальным. Чтобы добавить это расширение, мы должны включить соответствующий файл JavaScript
и CSS
(см. http://cdn.datatables.net/):
tagList(
singleton(tags$head(tags$script(src='//cdn.datatables.net/fixedheader/2.1.2/js/dataTables.fixedHeader.min.js',type='text/javascript'))),
singleton(tags$head(tags$link(href='//cdn.datatables.net/fixedheader/2.1.2/css/dataTables.fixedHeader.css',rel='stylesheet',type='text/css')))
)
data.tables
имеет опцию initComplete
, которая позволяет нам оговорить обратный вызов, когда таблица будет нарисована и т.д.
function(settings, json) {
new $.fn.dataTable.FixedHeader(this, {
left: true,
right: true
} );
}
Мы будем использовать модифицированную версию набора данных iris
, добавляющую индекс и некоторые случайные данные в конце, чтобы показать прокрутку слева направо:
library(shiny)
myData <- cbind(list(index = row.names(iris)), iris
, rep(list(row.names(iris)), 10))
names(myData)[7:16] <- paste0("randomData", 1:10)
runApp(
list(ui = fluidPage(
tagList(
singleton(tags$head(tags$script(src='//cdn.datatables.net/fixedheader/2.1.2/js/dataTables.fixedHeader.min.js',type='text/javascript'))),
singleton(tags$head(tags$link(href='//cdn.datatables.net/fixedheader/2.1.2/css/dataTables.fixedHeader.css',rel='stylesheet',type='text/css')))
),
dataTableOutput("mytable")
)
, server = function(input, output, session){
output$mytable <- renderDataTable(myData,
options = list(
pageLength = 50,
initComplete = I("function(settings, json){
new $.fn.dataTable.FixedHeader(this, {
left: true,
right: true
} );
}")
)
)
})
)
поэтому на изображении мы видим, что мы прокручиваем вниз до записи 8 и по каким-то причинам, но заголовок и первый столбец (наш добавленный индексный столбец) все еще видны.