2016-07-04 11 views
0

Ich bin ziemlich neu in der Anwendung, also vergib mir, wenn es offensichtlich ist. Ich habe eine Datentabelle, die basierend auf einem Kartencenter neu berechnet werden kann. Es funktioniert gut. Ich möchte jedoch bestimmte Einstellungen lesen und behalten (bewahren): nämlich Seitenlänge und Spaltensichtbarkeit. Wenn ein Benutzer im Moment 20 Einträge pro Seite ändert und die Karte verschiebt, rendert er sie mit der Standard-Seitenlänge und der Spalte vis (mit colvis in buttons). Ich dachte, ich könnte es in einer Variablen speichern und es beim erneuten Rendern der Tabelle abrufen, aber nicht sicher, wie man aus den Optionen liest. ist es in R Studio für Shiny gebaut Irgendwelche Ideen?Shiny für R DT: wie man Seitenlänge und Spaltensichtbarkeit liest/behält

EDIT: Ich habe die Daten über die Seitenlänge und Spaltensichtbarkeit mit der Option stateSave = TRUE und dann lesen lesen Eingang $ Btable_state $ length (und ich kann auch lesen, welche Spalten sichtbar sind), aber jetzt ist mein Problem: wann Wenn eine Tabelle neu gerendert wird, wird sie zuerst auf den Wert NULL gesetzt und überschreibt, was in der Eingabe $ Btable_state gespeichert ist. Wie kann ich es nur erfassen und beeinflussen, wenn es durch Änderungen an den Filtern geändert wird und nicht durch das erneute Rendern der Tabelle selbst?

EDIT2: Da meine Anwendung eine Verbindung zu meinen Google-Blättern benötigt, was nicht replizierbar wäre, kann sie am folgenden Beispiel von Github (vnijs/dt_state) ausprobiert werden. Wie die Nicht-Standardseitenlänge (zB 50) zu erhalten, wenn Spalten Neuordnen (aber die Aktion der selectizeInput ohne Verknüpfung, nur den letzten richtigen Zustand zu halten)

#ui.r 
shinyUI(fluidPage(
    sidebarLayout(
    sidebarPanel(
     uiOutput("ui_view_vars"), 
     tags$a(id = "refresh", href = "#", class = "action-button", 
      list(icon("refresh"), "Clear state"), 
      onclick = "window.location.reload();") 
    ), 
    mainPanel(
     tabPanel("View", DT::dataTableOutput("dataviewer") 

    ) 
    ) 
) 
)) 

#server.r 
library(shiny) 
library(DT) 

dat <- iris 

## store state in global environment for now 
if (!exists("r_state")) r_state <- list() 

## Only used from a 'clean' start 
r_state$dataviewer_search_columns <- list("","2.5...4","","","[\"setosa\"]") 

shinyServer(function(input, output, session) { 
    output$ui_view_vars <- renderUI({ 
    vars <- colnames(dat) 

    ## using selectizeInput with drag_drop and DT 
    selectizeInput("view_vars", "Select variables to show:", choices = vars, 
        selected = vars, multiple = TRUE, 
        options = list(plugins = list('remove_button', 'drag_drop'))) 
    }) 

    ## make nested list 
    mknl <- function(x) list(search = x) 

    observeEvent(input$dataviewer_search_columns, { 
    r_state$dataviewer_search_columns <<- input$dataviewer_search_columns 
    }) 

    observeEvent(input$dataviewer_state, { 
    r_state$dataviewer_state <<- input$dataviewer_state 
    }) 

    observeEvent(input$refresh, { 
    r_state <<- list() 
    }) 

    output$dataviewer <- DT::renderDataTable({ 
    req(input$view_vars) 

    search <- r_state$dataviewer_state$search$search 
    if (is.null(search)) search <- "" 

    DT::datatable(iris[,input$view_vars], 
        filter = list(position = "top", clear = TRUE), 
        rownames = FALSE, 
        selection = "none", 
        options = list(
        stateSave = TRUE, 
        searchCols = lapply(r_state$dataviewer_search_columns, mknl), 
        search = list(search = search, regex = TRUE), 
        order = {if (is.null(r_state$dataviewer_state$order)) list() 
         else r_state$dataviewer_state$order}, 
        processing = FALSE 
       ), 
        callback = DT::JS("$(window).unload(function() { table.state.clear(); })") 
    ) 
    }) 

    output$tbl_col_search <- renderPrint(input$dataviewer_search_columns) 

}) 
+0

Wie viele Tabellen haben Sie 1? –

+0

zwei Tabellen, Entschuldigung sollte erwähnt haben, sie sind nicht in Bezug auf den Inhalt verwandt und ich möchte nur auf einem behalten (aber nichts dagegen, wenn es auf beiden behält) – Slav

+0

Wollen Sie die gleiche Anzahl pro Seite für beide? –

Antwort

1

Ok, hat einen Blick auf das Beispiel unten, es sollte Ihr Paging erhalten. Beachten Sie, dass ich die Schaltfläche hinzugefügt habe, die alles von Grund auf auf den ersten Wert rendern sollte. Bitte sehen Sie sich A client-side table Beispiel und die 2.2 DataTables Information Seite auch an.

rm(list=ls()) 
library(shiny) 
library(DT) 

ui <- basicPage(actionButton("Go","Go"),DT::dataTableOutput('x1')) 

server <- shinyServer(function(input, output, session){ 

    tableparams <- reactiveValues() 
    observeEvent(input$Go,{ 
    if(is.null(input$x1_rows_current)){ 
     tableparams$pageLength <- 5 
    } 
    else{ 
     tableparams$pageLength <- length(input$x1_rows_current) 
    } 
    }) 
    my_data <- eventReactive(input$Go,{iris}) 
    output$x1 = DT::renderDataTable(datatable(my_data(),options = list(pageLength = tableparams$pageLength))) 
}) 
shinyApp(ui = ui, server = server) 
+0

vielen Dank, und was wäre der Name der Spalte Sichtbarkeit Eigenschaft? – Slav

+0

zusätzlich ist die Aktion mit der Schaltfläche Go verbunden, wenn ich wollte, dass sie automatisch ist (ohne Klick-Aktion) wie soll ich das machen? Die Tabelle kann erneut gerendert werden durch: Änderung des Zooms, Änderung der Schwenkung, Änderung des Datumsfilters - es gibt viel zu viele Aktionen, um sie anzuhängen. – Slav

+0

Last but not least - wenn ein Benutzer 25 Einträge pro Seite auswählt, aber die aktuelle gefilterte Ansicht hat nur 21 Einträge, dann haben alle nächsten Ansichten 21 Seitenlänge, wenn ich richtig verstanden habe – Slav