Замораживание заголовка и первого столбца с использованием data.table в Shiny

У меня есть приложение Shiny, которое дает таблицу данных, но я не могу заморозить первый столбец и заголовки, поэтому таблица трудно читать, когда вы спускаетесь или переходите. Стоит ли вообще замораживать панели? Я пробовал поиск, но ничего не нашел.

Ответ 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 и по каким-то причинам, но заголовок и первый столбец (наш добавленный индексный столбец) все еще видны.

enter image description here

Ответ 2

FixedHeader не работает, дает неправильные имена столбцов во время прокрутки x, но работает FixedColumns. Это связано с несовместимость между ними

library(shiny)
library(DT)
runApp(
  list(ui = fluidPage(

    dataTableOutput("mytable")
  )
  , server = function(input, output, session){
    Rows <- c(1:50)
    for (y in 1:15){
      x<-y-1
      assign(letters[x+1],runif(5, 0, 1))
    }
    x <- data.frame(Rows, mget(letters[1:15]), row.names=NULL) 
    x<- x[2:15]
    output$mytable <- renderDataTable(
      DT::datatable(x, rownames=FALSE,extensions = c('FixedColumns',"FixedHeader"), 
                    options = list(dom = 't', 
                                   scrollX = TRUE, 
                                   paging=FALSE,
                                   fixedHeader=TRUE,
                                   fixedColumns = list(leftColumns = 1, rightColumns = 0))
      )
    )
  } 
  )
)