web-dev-qa-db-fra.com

Obtenez la taille de la fenêtre dans Shiny

Je voudrais déterminer la taille de la fenêtre du navigateur dans Shiny pour m'aider à mieux mettre en forme mon div divs. Plus précisément, je voudrais déterminer le rapport hauteur/largeur de la fenêtre pour voir combien de div je dois étaler sur l’écran et cela a toujours l’air agréable. Ma pensée initiale serait que le nombre de parcelles serait floor(width/(height-navbar_height)).

J'en ai fait quelques recherches et je suis actuellement incapable de trouver une solution possible et je suis actuellement amené à croire que cette fonctionnalité n'est tout simplement pas présente dans la structure clientData. Des pensées?

16
Justace Clutter

Voir l'exemple ci-dessous. Il utilise Javascript pour détecter la taille de la fenêtre du navigateur (taille initiale et tout redimensionnement éventuel) et utilise Shiny.onInputChange pour envoyer les données au code du serveur pour traitement. Il utilise l'événement shiny:connected pour obtenir la taille initiale de la fenêtre, car Shiny.onInputChange n'est pas prêt à être utilisé jusqu'à ce que shiny soit connecté.

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)
25
Xiongbing Jin

Version plus courte pour obtenir les dimensions de fenêtre en brillant avec JS à partir du paquetage htmlwidgets:

window_height <- JS('window.innerHeight')
window_width <- JS('window.innerWidth')
0
JaKu