2014-10-07 17 views
11

Ich habe eine Shiny-App, die eine Datentabelle ergibt, aber ich kann nicht die erste Spalte und die Header einfrieren, so dass die Tabelle schwer zu lesen ist, wie Sie oder gehen über. Gibt es trotzdem die Scheiben einzufrieren? Ich habe versucht zu suchen, habe aber nichts gefunden.Freezing Header und erste Spalte mit data.table in Shiny

+0

letzten Shiny Update Folgen, können Sie versuchen, hier und sehen, was Sortiermöglichkeiten zur Verfügung stehen https://datatables.net/upgrade/1.10-convert –

Antwort

12

Interessante Frage und jetzt dank der jüngsten Aktualisierung von Shiny zu data.tables 1.10.2 es viel einfacher ist, die verschiedenen Plug-Ins und Erweiterungen zu verwenden. Für Ihre Frage scheint die FixedHeader Erweiterung ideal. So fügen Sie diese Erweiterung müssen wir die entsprechende JavaScript und CSS Datei enthalten (siehe 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 hat eine Option initComplete, die uns einen Rückruf an, bestimmen können, sobald Tisch gezogen wird usw.

function(settings, json) { 
    new $.fn.dataTable.FixedHeader(this, { 
              left: true, 
              right: true 
              }); 
             } 

Wir werden eine modifizierte Version des iris Datensatzes verwenden einen Index und einige zufällige Daten am Ende hinzufügen, um von links nach rechts Scrollen zu zeigen:

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 
              }); 
             }") 
            ) 
    ) 
    }) 
) 

so in dem Bild können wir sehen, wir sind bis 8 und über einige Wege nach unten gescrollt, aber der Header und die erste Spalte (unsere Spalte hinzugefügt Index) sind noch sichtbar.

enter image description here

+1

glücklich, wenn die Antwort löst helfen Ihre Frage gilt es zu markieren, indem Sie sie ankreuzen. – jdharrison

+1

Vielen Dank für Ihre Hilfe! Gibt es eine Möglichkeit, den Header der ersten Spalte einzufrieren, so dass er sichtbar ist, wenn ich nach rechts scrolle? – Kamal

+2

Nach der 'dataTables'-Dokumentation und Ihrer exzellenten detaillierten Antwort habe ich das 'FixedColumns'-Plugin in einer meiner glänzenden Apps ausprobiert. Ich habe 'fixedcolumns/3.0.2' css und js Dateien sowie 'dataTables 1.10.4' css und js Dateien in meine Kopfzeile aufgenommen und die' initComplete' in meine Optionen mit einer kleinen Änderung wie folgt eingeschlossen: 'function (settings, json) { new $ .fn.dataTable.FixedColumns (this, {}); } '. Wenn ich die App jedoch ausführte, zeigte die Tabelle weiterhin die Meldung "processing ..." an und wurde nicht wie erwartet geladen. Ich verwende derzeit die neueste glänzende Version, 0,11. Gedanken? –

3

FixedHeader nicht funktioniert, gibt falsche Spaltennamen während x-Scrollen, aber FixedColumns funktioniert. Es ist aufgrund incompatibility zwischen ihnen

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)) 
    ) 
    ) 
    } 
) 
) 
Verwandte Themen