2016-03-25 10 views
8

Ho un'app shiny e desidero un ggplot con un brush all'inizio, quindi l'utente non deve selezionare alcuna area di interesse ogni volta che l'app viene avviata. Successivamente, l'utente può selezionare un'area diversa. Ecco un esempio per iniziare:È possibile inizializzare il pennello in ggplot in un'app lucida?

library(shiny) 
library(ggplot2) 

runApp(shinyApp(
    ui = fluidPage(plotOutput('plotA', brush = brushOpts(id = 'plotA_brush')), 
       plotOutput('plotZ')), 
    server = function(input, output, session) { 
    pollData <- reactivePoll(60 * 1000, session, 
          checkFunc = function(){ Sys.time() }, 
          valueFunc = function(){ data.frame(x = 1:100, y = cumsum(rnorm(100)))}) 
    output$plotA <- renderPlot({ 
     dt <- pollData() 
     ggplot(dt, aes(x, y)) + geom_line() 
    }) 
    ranges <- reactiveValues(x = NULL, y = NULL) 
    observe({ 
     brush <- input$plotA_brush 
     if(!is.null(brush)) { 
     ranges$x <- c(brush$xmin, brush$xmax) 
     ranges$y <- c(brush$ymin, brush$ymax) 
     } else { 
     ranges$x <- NULL 
     ranges$y <- NULL 
     } 
    }) 
    output$plotZ <- renderPlot({ 
     dt <- pollData() 
     ggplot(dt, aes(x, y)) + geom_line() + coord_cartesian(xlim = ranges$x, ylim = ranges$y) 
    }) 
    } 
)) 
+0

inizializzarlo a ciò però? Inizia "inizializzato" per l'intera area. Sospetto che tu voglia inizializzarlo su una porzione particolare, ma quale parte? Qualcos'altro che è più piccolo del tutto? –

+0

Sì, qualsiasi altra cosa è più piccola dell'intera cosa. In questo esempio, diciamo che voglio che 'x' sia nell'intervallo da 25 a 75 e' y' dal minimo al massimo. –

risposta

0

Sì, è possibile.

Nel codice qui sotto ho aggiunto solo alcune righe. Innanzitutto, ho aggiunto set.seed(42) in modo che la grafica sia riproducibile. Secondo, c'è un dput(brush) che è stato commentato. Questo è stato utile per identificare il pennello iniziale che volevo avere. Infine, nell'ambiente che controlla ho aggiunto un ifelse impostato per utilizzare il valore predefinito brush è un valore NULL dall'oggetto input$plotA_brush.

library(shiny) 
library(ggplot2) 
set.seed(42) 

runApp(shinyApp(
    ui = fluidPage(plotOutput('plotA', brush = brushOpts(id = 'plotA_brush')), 
       plotOutput('plotZ')), 
    server = function(input, output, session) { 


    pollData <- reactivePoll(60 * 1000, session, 
          checkFunc = function(){ Sys.time() }, 
          valueFunc = function(){ data.frame(x = 1:100, y = cumsum(rnorm(100)))}) 
    output$plotA <- renderPlot({ 
     dt <- pollData() 
     ggplot(dt, aes(x, y)) + geom_line() 
    }) 
    ranges <- reactiveValues(x = NULL, y = NULL) 
    observe({ 
     if (is.null(input$plotA_brush)) { 
     brush <- structure(list(xmin = 14.313925002001, xmax = 39.942241912585, ymin = 1.1077251080591, ymax = 5.5028180250535, mapping = structure(list(x = "x", y = "y"), .Names = c("x", "y")), domain = structure(list(left = -3.95, right = 104.95, bottom = -4.07771077213569, top = 9.69030145758825), .Names = c("left", "right", "bottom", "top")), range = structure(list(left = 32.3904099935947, right = 674.020527857828, bottom = 368.859578048224, top = 5.47945189149413), .Names = c("left", "right", "bottom", "top")), log = structure(list(x = NULL, y = NULL), .Names = c("x", "y")), direction = "xy", brushId = "plotA_brush", outputId = "plotA"), .Names = c("xmin", "xmax", "ymin", "ymax", "mapping", "domain", "range", "log", "direction", "brushId", "outputId")) 
     } else { 
     brush <- input$plotA_brush 
     } 
     # dput(brush) # Useful for finding the initial brush 
     if(!is.null(brush)) { 
     ranges$x <- c(brush$xmin, brush$xmax) 
     ranges$y <- c(brush$ymin, brush$ymax) 
     } else { 
     ranges$x <- NULL 
     ranges$y <- NULL 
     } 
    }) 
    output$plotZ <- renderPlot({ 
     dt <- pollData() 
     ggplot(dt, aes(x, y)) + geom_line() + coord_cartesian(xlim = ranges$x, ylim = ranges$y) 
    }) 
    } 
)) 

La pagina iniziale di partenza si presenta così:

enter image description here

Problemi correlati