2016-05-03 19 views
7

Vorrei stabilire le dimensioni della finestra del browser in Shiny per aiutarmi a definire meglio i miei div plot. In particolare vorrei determinare le proporzioni della finestra per vedere quanti div dovrei diffondere sullo schermo e sembra ancora bello. Il mio pensiero iniziale sarebbe che il numero di grafici sarebbe floor(width/(height-navbar_height)).Ottieni le dimensioni della finestra in Shiny

Ho fatto un po 'di ricerca per questo e al momento non sono in grado di individuare una possibile soluzione e sono attualmente in grado di credere che questa funzione non sia semplicemente presente nella struttura clientData. qualche idea?

risposta

16

Vedere l'esempio di seguito. Usa Javascript per rilevare le dimensioni della finestra del browser (dimensione iniziale e qualsiasi ridimensionamento) e usa Shiny.onInputChange per inviare i dati al codice server per l'elaborazione. Utilizza l'evento shiny:connected per ottenere le dimensioni iniziali della finestra, poiché Shiny.onInputChange non è pronto per l'uso finché non viene collegato il lucido.

library(shiny) 

# Define UI for application that draws a histogram 
ui <- shinyUI(fluidPage(

    # Application title 
    titlePanel("Old Faithful Geyser Data"), 

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
     sidebarPanel(
     tags$head(tags$script(' 
           var dimension = [0, 0]; 
           $(document).on("shiny:connected", function(e) { 
            dimension[0] = window.innerWidth; 
            dimension[1] = window.innerHeight; 
            Shiny.onInputChange("dimension", dimension); 
           }); 
           $(window).resize(function(e) { 
            dimension[0] = window.innerWidth; 
            dimension[1] = window.innerHeight; 
            Shiny.onInputChange("dimension", dimension); 
           }); 
          ')), 
     sliderInput("bins", 
        "Number of bins:", 
        min = 1, 
        max = 50, 
        value = 30) 
    ), 

     # Show a plot of the generated distribution 
     mainPanel(
     verbatimTextOutput("dimension_display"), 
     plotOutput("distPlot") 
    ) 
    ) 
)) 

# Define server logic required to draw a histogram 
server <- shinyServer(function(input, output) { 
    output$dimension_display <- renderText({ 
     paste(input$dimension[1], input$dimension[2], input$dimension[2]/input$dimension[1]) 
    }) 

    output$distPlot <- renderPlot({ 
     # generate bins based on input$bins from ui.R 
     x <- faithful[, 2] 
     bins <- seq(min(x), max(x), length.out = input$bins + 1) 

     # draw the histogram with the specified number of bins 
     hist(x, breaks = bins, col = 'darkgray', border = 'white') 
    }) 
}) 

# Run the application 
shinyApp(ui = ui, server = server) 
+0

Grazie per questo. Scusa ci è voluto così tanto tempo per controllare. Sembra però che ci sarebbe un posto migliore per aggiungere questo al di fuori del sidebarPanel. Ad esempio, subito dopo la chiamata a pagina fluida. –

+0

Non importa dove si aggiunge il Javascript, poiché il Javascript apparirà nella sezione 'head' dell'HTML indipendentemente (come abbiamo usato' tags $ head'). Puoi verificare il codice sorgente della pagina html. –

0

Shorter versione per ottenere dimensioni della finestra a lucido con JS dalla confezione htmlwidgets:

window_height <- JS('window.innerHeight') 
window_width <- JS('window.innerWidth') 
Problemi correlati