2013-07-04 6 views
6

私はggmapを使って静的マップを返します。 しかし、私はポストコード境界をオーバーレイしたいとき、私はggplotがデータセットを見つけることができないエラーに遭遇しています。shiny app - ggplotがデータを見つけることができません

データセットpoaはポストコード境界のデータフレームです。ポリゴンIDを持つlatsとlonsです。 私はすでにenvironment = environment()を追加しようとしましたが、それでも問題は解決しません。 Rコンソールに印刷するprint(str(poa))という名前のデータが存在することがわかりました。

ggplotがpoaデータフレームにアクセスできるように誰も私のために回避策を提案できますか? これは非常に再現可能な例ではないことをお詫び申し上げます。

更新: ggplotが、私はこのコードを使用する場合、POAのデータフレームにアクセスすることが可能である:

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

しかし、私はそれを行うとき、私は、マップのベース層のためのggplotするネストされた呼び出しを行う必要がありggplotはここ

は私server.Rコードであるデータを見つけることができない私は、私は私のui.Rにアクションボタンを持っていると私はそれがクリックされたときに更新するプロットをしたいと隔離使用しています

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

}) 

編集:追加ui.RのSessionInfoの

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

) 
)) 

出力:

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

ui.Rを投稿できますか?テストを簡単にします。 – MadScone

+0

確かに@MadScone ui.Rが追加されました。 – user1414259

+0

これは役に立ちますか? http://stackoverflow.com/questions/14810409/save-plots-made-in-a-shiny-app –

答えて

5

だから私はこの1つを最終的に考え出しました。 POAを設定したデータは、このネストされたクエリで見つけることができない例えば

- 質問に設定されたデータは< <を使用して割り当てる必要があり、ネストされたggplotクエリに設定されているデータを見つけることができるggplot持って

関数の中で呼び出されたとき。

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

あなたが助けから関数を使用して、この行

poa <<- poa 

をPOAを使用する必要があります前に: 「演算子< < - とは - >>のみ通常の関数で使用され、割り当てられている変数の既存の定義のために親環境を通じて検索が行われます。

2

これは難しいものです。私はggplotの環境入れ子について少し知っているので、この答えを編集するかもしれません。しかし、ここに私のために働くように見える修正されたチャンクがあります:

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

ここで注意するべきことがいくつかあります。

  1. group = orderディレクティブを削除しました。その結果、「異なる数の行」エラーが発生します。後に何をしているのかはっきりしないが、正しく見えない。
  2. envという名前の変数にpoaが存在する環境を保存します。これは、poaを参照する任意の関数で使用したい環境です。
  3. geom_polygonggplotへの呼び出しで、私が作成したばかりの環境でenvironment=envパラメータを指定するように指示します。
  4. 私は外側のggmap呼び出しを、そのコマンドの最後のパラメータとしてenvironment=environment()を使用して呼び出し環境で実行するよう指示します。これがなければ、私たちが作成した変数envを見つけることができなくなります。

これらの変更により、状況が適切に機能しているように見えます。

+0

答えのジェフのおかげで、残念ながら私はあなたが行う結果を得ることはありません。私はまだ 'エラーggplot(data = poa、aes(x = LON、y = LAT)、environment = env)エラー:オブジェクト 'poa' not found'を取得しています。メインの質問にsessionInfoの出力を追加して、同様の設定を使用していることを確認しました – user1414259

0

group = ordergroup = POAOBSに変更すると、アプリが機能します。

関連する問題