2015-08-07 16 views
5

Ho un'app lucida in cui la trama deve essere regolata in altezza in base all'input dell'utente. Fondamentalmente, la trama potrebbe avere uno, due o quattro sotto-grafici. Va tutto bene quando ce ne sono uno o due, ma con quattro, le sottotrame vengono schiacciate troppo piccole. Ho cercato di utilizzare una funzione reattiva di darmi un'altezza calcolata con il server, ma ottengo questo errore:Altezza di stampa dinamica in lucido

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.) 

Una versione molto semplificata di quello che sto cercando di fare è qui:

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) 

risposta

8

Uso renderUI:

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, 
      uiOutput("plot.ui") 
    ) 
) 
) 

server <- function(input, output) { 

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

    output$plots = renderPlot({ 

    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) 
    }) 

    output$plot.ui <- renderUI({ 
    plotOutput("plots", height = PlotHeight()) 
    }) 

} 

shinyApp(ui =ui, server = server) 
+0

Perfect !! Grazie!! – KirkDCO

Problemi correlati