2015-10-01 26 views
16

में साइडबार को दिखाने/छिपाने के बाद प्लॉट 100% चौड़ाई का आकार नहीं बदलता है मेरे पास एक प्लॉट है जो आर शाइन में दो-पैनल पृष्ठ के मुख्य पैनल में 100% चौड़ाई (डिफ़ॉल्ट) पर सेट है। एक टॉगल एक्शन बटन के माध्यम से साइडबार छिपाने योग्य है।आर चमकदार पृष्ठ

जब साइडबार दिखाई दे रहा है (डिफ़ॉल्ट), साजिश मुख्य पैनल की चौड़ाई भरती है। जब साइडबार छुपाया जाता है, तो मैं चाहता हूं कि साजिश अब उपलब्ध 100% स्पेस भरने के लिए विस्तार करे, यानी पूरी ब्राउज़र विंडो। लेकिन ऐसा नहीं होता! यह एक ही आकार रखता है।

library(shiny) 
library(shinyBS) 

UI <- fluidPage(
    bsButton("showpanel", "Show/hide sidebar", type = "toggle", value = TRUE), 
    sidebarLayout(
     conditionalPanel(condition = "input.showpanel == true", 
         sidebarPanel("This is my sidebar.") 
         ), 
     mainPanel(plotOutput("plot", width = "100%")) 
     ) 
    ) 

SERVER <- function(input, output) { 
     output$plot <- renderPlot({ 
     plot(1:10, main = "The width of this plot adjusts\nto window resizes but not to\nshow/hide sidepanel!") 
    }) 
} 

runApp(shinyApp(UI,SERVER)) 

अब तक प्रयास किया गया:

  • यूआई फ़ाइल के भीतर से भूखंड वस्तु को परिभाषित करना, जैसा कि ऊपर।
  • प्लॉट ऑब्जेक्ट को सर्वर फ़ाइल के भीतर से एक renderUI ऑब्जेक्ट के रूप में परिभाषित करना।
  • इस प्रश्न से tags$head(tags$style("#myplot{height:100vh !important;}")) के अनुसार पृष्ठ में सीएसएस टैग सेट करें, Scaling shiny plots to window height

संभव काम arounds:

  • साजिश गतिशील और टॉगल बटन की स्थिति के आधार पर की चौड़ाई बनाओ। तब मैं साजिश बना सकता हूं उदा। साइडबार छिपा हुआ है जब 140% चौड़ाई। यह अच्छी तरह से सामान्यीकृत नहीं होता है, और fluidPage की अनुकूलता का उपयोग करने के बिंदु को खो देता है।

(fluidPage लेआउट ब्राउज़र विंडो आकार पर निर्भर बदल जाता है। उदाहरण के लिए, यदि आप एक मोबाइल फोन के आकार के बारे अपने ब्राउज़र विंडो बनाना, यह मुख्य पैनल के ऊपर साइडबार स्थापित करेंगे।)

+0

समस्या यह है कि साइडबार का उपयोग करके आप साइडबार के लिए कक्षा 'col-sm-4' के साथ दो बूटस्ट्रैप स्तंभ बनाते हैं और प्लॉट के लिए कक्षा' col-sm-8' के साथ एक है, यही कारण है कि आपकी साजिश फिर से नहीं होगी- ~ 66% स्क्रीन से बड़ा आकार। –

उत्तर

5

ऐसा करने का एक तरीका एक प्रतिक्रियाशील लेआउट का उपयोग करना होगा (इस पर Switch between layouts reactively with shiny पर कई प्रश्न हैं)। आपके मामले में है कि हो सकता है की तरह

library(shiny) 
library(shinyBS) 

UI <- shinyUI(
     fluidPage(
      bsButton("showpanel", "Show/hide sidebar", type = "toggle", value = TRUE), 
      uiOutput('ui') 
     ) 
    ) 

SERVER <- function(input, output) { 

    output$ui <- renderUI({ 
     if (input$showpanel) { 
      sidebarLayout(
       sidebarPanel("This is my sidebar."), 
       mainPanel(plotOutput('plot')) 
      ) 
     } else { 
      plotOutput('plot') 
     } 
    }) 

    output$plot <- renderPlot({ 
     plot(1:10, main = "The width of this plot adjusts\nto window resizes and to\nshow/hide sidepanel!") 
    }) 
} 

runApp(shinyApp(UI,SERVER)) 
+0

पूरी तरह से काम करता है - धन्यवाद! मूल रूप से मेरे सभी कोड को एक फ़ाइल में रखने का लाभ भी है। मैं बस बॉक्स के बाहर सोच नहीं रहा था ... – dynamo

6

@konvas जवाब कुछ वास्तव में अच्छा है और शायद रास्ता है कि आप यह करना wan't लेकिन आप sidebarLayout उपयोग करना चाहते हैं (और एक अन्य जवाब देने की खातिर) आप की तरह बूटस्ट्रैप कॉलम टॉगल करने के लिए jQuery का उपयोग कर सकते हैं:

library(shiny) 

ui <- fluidPage(
    tags$head(
    tags$script(
     HTML(" 
      $(document).ready(function(){ 
       // Mark columns we want to toggle 
       $('body').find('div [class=col-sm-4]').addClass('sidebarPanel'); 
       $('body').find('div [class=col-sm-8]').addClass('mainPanel'); 
      }) 


      Shiny.addCustomMessageHandler ('resize',function (message) { 
       $('.sidebarPanel').toggle(); 
       $('.mainPanel').toggleClass('col-sm-8 col-sm-12'); 
       $(window).trigger('resize') 
      }); 

      ") 
    ) 
), 
    actionButton("showpanel", "Show/hide sidebar"), 
    sidebarLayout(
    sidebarPanel("This is my sidebar."), 
    mainPanel(plotOutput("plot", width = "100%")) 
) 
) 

server <- function(input, output, session) { 
    observeEvent(input$showpanel,{ 
    session$sendCustomMessage(type = 'resize', message = 1) 

    }) 
    output$plot <- renderPlot({ 
    plot(1:10, main = "The width of this plot adjusts\nto window resizes but not to\nshow/hide sidepanel!") 
    }) 
} 

runApp(shinyApp(ui,server)) 

एक ही पद्धति लागू होगा यदि आप एक fluidRow या कुछ इसी तरह के कॉलम का उपयोग।

+0

इसके अलावा एक अच्छा जवाब है, मुझे जावा के साथ ज्यादा अनुभव नहीं है, लेकिन यही वह है जिसे मैं समाधान की उम्मीद कर रहा था। पार्सिमनी के कारणों के लिए @ कोंवास जवाब के साथ गए। धन्यवाद! – dynamo

+0

धन्यवाद। मुझे लगता है कि उसका जवाब वास्तव में अच्छा है, खुशी है कि मैं वैसे भी मदद कर सकता हूं! –

संबंधित मुद्दे