2013-07-04 11 views
6

ho fatto un'applicazione lucida che porta mappe statiche indietro utilizzando ggmap. Tuttavia, quando voglio sovrapporre i limiti del codice postale, sto riscontrando un errore in cui ggplot non riesce a trovare il set di dati.lucido app - ggplot non riesce a trovare i dati

POA set di dati è un dataframe di NPA confini cioè dorsali e lons con un ID poligono. Ho già provato ad aggiungere environment = environment() ma questo non risolve il mio problema. So che i dati esiste come io chiamo print(str(poa)) che stampa alla console R.

Qualcuno può suggerire un lavoro in giro per me, in modo che possa accedere al ggplot dataframe poa? Mi scuso che questo non è un esempio molto riproducibile.

Aggiornamento: ggplot è in grado di accedere al dataframe poa quando uso questo codice:

print(ggmap(map)) + geom_polygon(data = poa, aes(x = LON, y = LAT, group = order), alpha = .5, colour = "black", fill = NA)) 

ma ho bisogno di fare una chiamata nidificato per ggplot per lo strato di base della mappa, quando faccio questo ggplot è in grado di trovare i dati

Ecco il mio codice server.R

sto usando isolare come ho un pulsante di azione nella mia ui.R e voglio solo la trama di aggiornare quando ha cliccato .

library(shiny) 
library(ggmap) 
library(RODBC) 

# Define server logic required to summarize and view the selected dataset 
shinyServer(function(input, output) { 

output$searchString <- renderText({ 
    if (input$searchButton == 0) 
     return()   
    isolate({input$searchString}) 
}) 

mapSourceInput <- reactive({ 
    switch(input$mapSource 
      , "google" = "google" 
      , "stamen" = "stamen") 
}) 

mapTypeInput <- reactive({ 
    switch(input$mapType 
      , "terrain" = "terrain" 
      , "satellite" = "satellite" 
      , "roadmap" = "roadmap" 
      , "hybrid" = "hybrid" 
      , "toner" = "toner" 
      , "watercolor" = "watercolor") 
}) 

overlayInput <- reactive({ 
    switch(input$overlay 
      , "postcodes" = "postcodes" 
      , "states" = "states" 
      , "nothing" = "nothing") 
}) 

output$map <- renderPlot({ 
    if (input$searchButton == 0) 
     return() 

    isolate({ 
     if (overlayInput() == "nothing"){ 
      map <- get_map(location = input$searchString, zoom = input$zoom, source = mapSourceInput(), maptype = mapTypeInput()) 
      mapPlot <- ggmap(map) 
      print(mapPlot) 
      #return()    
     } else { 
      if (overlayInput() == "postcodes"){ 
       #postcode boundaries 
       map <- get_map(location = input$searchString, zoom = input$zoom, source = mapSourceInput(), maptype = mapTypeInput()) 
       poa <- structure(list(POAOBS = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L) 
           , COORD_REF = 1:10 
           , COORD_POL = 1:10 
           , POLYGON = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L) 
           , LON = c(144.951431274414, 144.956451416016, 144.95539855957, 144.955993652344, 144.958465576172, 144.956634521484, 144.956817626953, 144.954727172852, 144.957550048828, 144.958831787109) 
           , LAT = c(-37.8131675720215, -37.8117561340332, -37.8094863891602, -37.8058776855469, -37.8061485290527, -37.8021659851074, -37.8010902404785, -37.7994079589844, -37.7997169494629, -37.799861907959) 
           , POA = c("3000", "3000", "3000", "3000", "3000", "3000", "3000", "3000", "3000", "3000")) 
          , .Names = c("POAOBS", "COORD_REF", "COORD_POL", "POLYGON", "LON", "LAT", "POA") 
          , row.names = c(NA, 10L) 
          , class = "data.frame") 

       print(str(poa)) 

       print(ggmap(map, base_layer = ggplot(data = poa, aes(x = LON, y = LAT), environment = environment()), extent = "normal", maprange = FALSE, environment = .GlobalEnv) + 
          geom_polygon(data = poa, aes(x = LON, y = LAT, group = order), alpha = .5, colour = "black", fill = NA) + 
          coord_map(projection = "mercator", 
            xlim = c(attr(map, "bb")$ll.lon, attr(map, "bb")$ur.lon), 
            ylim = c(attr(map, "bb")$ll.lat, attr(map, "bb")$ur.lat))) 

      } else { 
       if(overlayInput() == "states"){ 
        return() 
       }}} 
    }) 
}) 

}) 

edit: aggiunto ui.R

library(shiny) 
# Define UI for dataset viewer application 
shinyUI(pageWithSidebar(

# Application title. 
headerPanel("The New Map App"), 

# Sidebar with controls 
sidebarPanel(  
    textInput("searchString", "Get Map Of", value = "melbourne, australia") 

    , selectInput("mapSource", "Choose a Map Source", choices = c("google", "stamen")) 

    , numericInput("zoom", "Zoom Level", 10) 

    , helpText("Note: An integer from 3 (continent) to 21 (building), default value 10 (city)") 

    , selectInput("mapType", "Choose a Map Type", choices = c("terrain", "satellite", "roadmap", "hybrid", "toner", "watercolor")) 

    , helpText("Note: Options available are 'terrain', 'satellite', 'roadmap', and 'hybrid' (google maps), 'watercolor', and 'toner' (stamen maps)") 

    , radioButtons("overlay", "Overlay Polygon", 
        list("Postcodes" = "postcodes" 
         , "States" = "states" 
         , "Nothing" = "nothing")) 

    , actionButton("searchButton", "Get Map") 
    , tags$style(type='text/css', "button#searchButton { margin-bottom: 9px; }") 
), 

#output panel 
mainPanel(
    h3(textOutput("searchString")) 
    , plotOutput("map") 

) 
)) 

uscita del sessionInfo:

R version 3.0.1 (2013-05-16) 
Platform: x86_64-pc-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_AU.UTF-8  LC_NUMERIC=C    LC_TIME=en_AU.UTF-8   LC_COLLATE=en_AU.UTF-8  LC_MONETARY=en_AU.UTF-8 
[6] LC_MESSAGES=en_AU.UTF-8 LC_PAPER=C     LC_NAME=C      LC_ADDRESS=C    LC_TELEPHONE=C    
[11] LC_MEASUREMENT=en_AU.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] RODBC_1.3-7  ggmap_2.3  ggplot2_0.9.3.1 shiny_0.6.0  

loaded via a namespace (and not attached): 
[1] bitops_1.0-5  caTools_1.14  colorspace_1.2-2 dichromat_2.0-0   digest_0.6.3  grid_3.0.1   
[7] gtable_0.1.2  httpuv_1.0.6.3  labeling_0.1   mapproj_1.2-1   maps_2.3-2   MASS_7.3-26   
[13] munsell_0.4   plyr_1.8   png_0.1-5   proto_0.3-10   RColorBrewer_1.0-5 Rcpp_0.10.4   
[19] reshape2_1.2.2  RgoogleMaps_1.2.0.3 rjson_0.2.12  RJSONIO_1.0-3  scales_0.2.3  stringr_0.6.2  
[25] tools_3.0.1   xtable_1.7-1 
+0

Potresti pubblicare il tuo ui.R? Rende più facile testare. – MadScone

+0

Cosa sicura @MadScone ui.R aggiunto, grazie – user1414259

+0

Questo aiuto? http://stackoverflow.com/questions/14810409/save-plots-made-in-a-shiny-app –

risposta

5

Quindi ho finalmente capito questo.

Per avere ggplot essere in grado di trovare il set di dati nella query ggplot nidificato, il set di dati in questione deve essere assegnato attraverso < < -

Per esempio il set di dati di Poa non può essere trovato in questa query nidificate quando viene chiamato all'interno di una funzione.

print(ggmap(map)) + geom_polygon(data = poa, aes(x = LON, y = LAT, group = order), alpha = .5, colour = "black", fill = NA)) 

Quindi, prima è necessario utilizzare poa nella funzione utilizzare questa linea

poa <<- poa 

Dalla aiuto: "Gli operatori < < - e - >> sono normalmente utilizzati solo nelle funzioni, e fa sì che una ricerca venga fatta attraverso gli ambienti genitore per una definizione esistente della variabile assegnata. "

2

Questo è un ingannevole. Potrei modificare questa risposta quando avrò un po 'più di conoscenza con il nesting dell'ambiente di ggplot. Ma ecco il pezzo modificato che sembra farlo funzionare per me:

 env <- environment() 

     print(ggmap(map, base_layer = ggplot(data = poa, aes(x = LON, y = LAT), environment=env), extent = "normal", maprange = FALSE, environment=environment()) + 
        geom_polygon(data = poa, aes(x = LON, y = LAT), alpha = .5, colour = "black", fill = NA, environment=env) + 
        coord_map(projection = "mercator", 
          xlim = c(attr(map, "bb")$ll.lon, attr(map, "bb")$ur.lon), 
          ylim = c(attr(map, "bb")$ll.lat, attr(map, "bb")$ur.lat))) 

Un paio di cose da notare qui.

  1. ho rimosso la direttiva group = order, come quella provoca un "diverso numero di righe" errore. Non sei sicuro di cosa stai cercando lì, ma non sembra giusto.
  2. devo conservare l'ambiente in cui poa esiste in una variabile denominata env. Questo è l'ambiente che si desidera utilizzare in qualsiasi funzione che faccia riferimento a poa.
  3. mi istruiscono le chiamate a geom_polygon e ggplot di utilizzare l'ambiente che ho appena creato specificando un parametro environment=env.
  4. Ho ordinato alla chiamata esterna ggmap di essere eseguita nell'ambiente chiamante utilizzando environment=environment() come ultimo parametro in tale comando. Senza questo, non sarà in grado di trovare la variabile env che abbiamo creato.

Con queste modifiche, le cose sembrano funzionare correttamente.

+0

Grazie per la risposta Jeff, sfortunatamente non ottengo i risultati che fai. Ricevo ancora l'errore 'Errore in ggplot (data = poa, aes (x = LON, y = LAT), environment = env): oggetto 'poa' non trovato. Ho aggiunto l'output di sessionInfo alla domanda principale per assicurarci che stiamo usando impostazioni simili – user1414259

0

Quando cambio group = order ad esempio group = POAOBS l'app funziona.

Problemi correlati