2013-07-04 15 views
6

Zrobiłem błyszczącą aplikację, która przywraca statyczne mapy za pomocą ggmap. Jednak gdy chcę nadpisać granice kodów pocztowych, napotykam błąd, w którym ggplot nie może znaleźć zestawu danych.błyszcząca aplikacja - ggplot nie może znaleźć danych

Zbiór danych poa jest ramką danych z kodami pocztowymi, tj. Łats i lons z identyfikatorem wieloboku. Próbowałem już dodawać environment = environment(), ale to nie rozwiązuje mojego problemu. Wiem, że dane istnieją, ponieważ nazywam je print(str(poa)), która drukuje do konsoli R.

Czy ktoś może zaproponować mi pracę, aby ggplot mógł uzyskać dostęp do ramki danych poa? Przepraszam, że nie jest to bardzo powtarzalny przykład.

Aktualizacja: ggplot jest w stanie uzyskać dostęp do dataframe uzgodnienia kiedy używam tego kodu:

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

Ale muszę dokonać zagnieżdżone wywołanie ggplot dla warstwy bazowej mapy, kiedy to zrobić ggplot jest w stanie znaleźć dane

Oto mój kod server.R

Używam izolować jak mam przycisk działania w moim ui.R i chcę tylko fabułę zaktualizować, gdy został wciśnięty .

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

}) 

Edycja: dodano 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") 

) 
)) 

wyjściowy 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

Czy mógłbyś opublikować swój ui.R? Ułatwia testowanie. – MadScone

+0

Pewnie, że @MadScone ui.R dodane, dzięki – user1414259

+0

Czy to pomoże? http://stackoverflow.com/questions/14810409/save-plots-made-in-a-shiny-app –

Odpowiedz

5

Więc w końcu wymyśliłem ten jeden.

Aby ggplot być w stanie znaleźć dane określone w zagnieżdżonych zapytań ggplot, dane zawarte w pytaniu musi być przypisane użyciu < < -

Na przykład zbiór danych POA nie można znaleźć w tego pod-zapytania gdy zostanie wywołany w funkcji.

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

zanim trzeba używać POA w funkcji używać tej linii

poa <<- poa 

Z pomocą więc: „Operatorzy < < - i - >> są zwykle stosowane tylko w funkcji, a spowodować przeszukanie przez środowiska nadrzędne dla istniejącej definicji przypisywanej zmiennej. "

2

Jest to kłopotliwe. Mogę edytować tę odpowiedź, gdy będę trochę lepiej zaznajomiony z zagnieżdżaniem środowiska ggplota. Ale oto zmodyfikowany fragment, który sprawia, że ​​działa to dla mnie:

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

Kilka rzeczy do zapamiętania tutaj.

  1. Usunąłem dyrektywę group = order, ponieważ powoduje to błąd "różnej liczby wierszy". Nie wiem, po co tam jesteś, ale to nie wygląda dobrze.
  2. Przechowuję środowisko, w którym poa istnieje w zmiennej o nazwie env. Jest to środowisko, którego chcesz użyć w dowolnej funkcji, która odwołuje się do poa.
  3. Polecam wywołania geom_polygon i ggplot, aby użyć środowiska, które właśnie utworzyłem, określając parametr environment=env.
  4. Polecam zewnętrznemu wywoływaniu ggmap do wykonania w środowisku wywołującym, używając environment=environment() jako ostatniego parametru w tym poleceniu. Bez tego nie będzie w stanie znaleźć utworzonej przez nas zmiennej env.

Przy tych zmianach wszystko wydaje się działać poprawnie.

+0

Dzięki za odpowiedź Jeff, niestety nie mam wyników, które robisz. Nadal dostaję błąd "Błąd w ggplot (dane = poa, aes (x = LON, y = LAT), environment = env): obiekt" poa "nie został znaleziony". Dodałem wyjście sessionInfo do głównego pytania, aby upewnić się, że używamy podobnych ustawień – user1414259

0

Po zmianie na przykład group = POAOBS aplikacja działa.

Powiązane problemy