首页 文章

闪亮的动态绘图高度

提问于
浏览
6

我有一个闪亮的应用程序,其中绘图需要根据用户输入调整高度 . 基本上,该图可以有一个,两个或四个子图 . 当有一个或两个时,一切都很好,但有四个,子图被压扁到太小的尺寸 . 我试过用一个反应函数给我一个服务器的计算高度,但是我得到了这个错误:

Error in .getReactiveEnvironment()$currentContext() : 
  Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)

我试图做的一个非常简化的版本是:

library(shiny)

ui <- fluidPage(

   fluidRow(
      column(2, 
             radioButtons( inputId = 'plotcount', label = 'Plot Count', 
                                 choices = c('1' = 1, 
                                             '2' = 2,
                                             '4' = 4
                                 ),
                           selected = '1'
             )
      ),
      column(10, 
             plotOutput( outputId = 'plots' )
      )
   )
)

server <- function(input, output) {

   PlotHeight = reactive(
      return( 500+250*(floor(input$plotcount/4)))
   )

   output$plots = renderPlot(height = PlotHeight(), {

      if( as.numeric(input$plotcount) == 0 ){
         plot.new()
         return()
      }
      print(c( floor(sqrt(as.numeric(input$plotcount))),
               ceiling(sqrt(as.numeric(input$plotcount)))
      ))
      opar = par( mfrow = c( floor(sqrt(as.numeric(input$plotcount))),
                             ceiling(sqrt(as.numeric(input$plotcount)))
                             )
                  )
      for( i in 1:as.numeric(input$plotcount) ){
         plot(1:100, 1:100, pch=19)
      }
      par(opar)
   })
}

shinyApp(ui =ui, server = server)

1 回答

  • 12

    使用 renderUI

    library(shiny)
    
    ui <- fluidPage(
      fluidRow(
        column(
          width = 2
          , radioButtons(
              inputId = 'plotcount'
            , label   = 'Plot Count'
            , choices = as.character(1:4)
          )
        ),
        column(
          width = 10
          , uiOutput("plot.ui")
        )
      )
    )
    
    server <- function(input, output) {
    
      plotCount <- reactive({
        req(input$plotcount)
        as.numeric(input$plotcount)
      })
    
      plotHeight <- reactive(350 * plotCount())      
    
      output$plots = renderPlot({
    
        req(plotCount())
    
        if (plotCount() == 0){
          plot.new()
          return()
        }
    
        opar <- par(mfrow = c(plotCount(), 1L))
    
        for (i in 1:plotCount()) {
          plot(1:100, 1:100, pch = 19)
        }
    
        par(opar)
      })
    
      output$plot.ui <- renderUI({
        plotOutput("plots", height = plotHeight())
      })
    
    }
    
    shinyApp(ui = ui, server = server)
    

相关问题