2016-05-03 13 views
7

私はShinyのブラウザウィンドウのサイズを決めて、プロットのdivをよりうまくレイアウトするのを助けたいと思います。具体的には、ウィンドウのアスペクト比を決定して、画面全体にいくつのdivを表示するかを確認したいと思います。私の最初の考えは、プロットの数がfloor(width/(height-navbar_height))になるということです。Shinyのウィンドウのサイズを取得

私はこれを探していましたが、現時点で可能な解決策を見つけることができず、現在のところ、この機能は単にclientData構造に存在しないと考えています。何かご意見は?

答えて

16

次の例を参照してください。 Javascriptを使用してブラウザのウィンドウサイズ(初期サイズと任意のサイズ)を検出し、Shiny.onInputChangeを使用して、処理のためにサーバーコードにデータを送信します。これはshiny:connectedイベントを使用して初期ウィンドウサイズを取得します。Shiny.onInputChangeは、光沢が接続されるまで使用できません。

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

これをありがとう。申し訳ありませんが、チェックするのに時間がかかりました。 SidebarPanelの外側にこれを追加するのが良い場所があるはずです。たとえば、fluidPage呼び出しの直後です。 –

+0

JavascriptはHTMLの 'head'セクションに表示されるので(Javascriptは' tags $ head'のように)、Javascriptをどこに追加しても問題ありません。 htmlページのソースコードを確認することができます。 –

0

パッケージhtmlwidgetsからJSと光沢のあるウィンドウのサイズを取得するための短いバージョン:

window_height <- JS('window.innerHeight') 
window_width <- JS('window.innerWidth') 
関連する問題