在R闪亮页面

时间:2015-10-01 13:13:02

标签: css r shiny

我有一个在R Shiny的双面板页面的主面板中设置为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))

到目前为止尝试:

  • 从UI文件中定义绘图对象,如上所述。
  • 从服务器文件中定义绘图对象,作为renderUI对象。
  • 根据此问题Scaling shiny plots to window height按照tags$head(tags$style("#myplot{height:100vh !important;}"))在页面中设置CSS代码。

可能的解决方法:

  • 使绘图的宽度动态化,具体取决于切换按钮的状态。然后,我可以制作情节,例如隐藏侧边栏时的宽度为140%。这并没有很好地概括,并且失去了使用fluidPage的适应性的观点。

fluidPage根据浏览器窗口大小更改布局。例如,如果您使浏览器窗口大小与手机大小相同,则会将侧边栏放在主面板上方。)

2 个答案:

答案 0 :(得分:7)

@konvas回答非常好,可能就是你不想这样做但是如果你想使用$( ".selector" ) .change(function () { var selector = $(this).val(); if (selector == 'No') { $('.tester').attr( "disabled", "disabled" ); } else { $('.tester').removeAttr( "disabled"); } }) .change(); (并且为了给出另一个答案)你可以使用jQuery来切换引导程序列如:

sidebarLayout

如果您使用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)) 中的列或类似内容,则适用相同的方法。

答案 1 :(得分:6)

这样做的一种方法是使用反应式布局(关于此问题有许多问题,例如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))