2013-07-04 44 views
6

我做了一个闪亮的应用程序,它使用ggmap返回静态地图。 但是,当我想叠加邮政编码边界时,我遇到了一个错误,其中ggplot无法找到数据集。闪亮的应用程序 - ggplot找不到数据

数据集poa是邮政编码边界的数据框,即具有多边形ID的lats和lons。 我已经尝试加入environment = environment()但这并不能解决我的问题。 我知道数据存在,因为我打电话给print(str(poa))打印到R控制台。

任何人都可以为我提出一个解决方案,让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

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

) 
)) 

输出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

你可以发布你的ui.R吗?使测试更容易。 – MadScone

+0

当然@MadScone ui.R增加了,谢谢 – user1414259

+0

这有帮助吗? http://stackoverflow.com/questions/14810409/save-plots-made-in-a-shiny-app –

回答

5

所以我终于想出了这一个。

要有ggplot能够找到数据嵌套ggplot查询设置,需要讨论的数据设置为使用< <分配 -

例如数据集POA不能在此嵌套查询发现当在函数内被调用时。

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. 我将poa存在于名为env的变量中。这是您想要在任何引用poa的功能中使用的环境。
  3. 我通过指定environment=env参数来指示拨打geom_polygonggplot的电话以使用我刚创建的环境。
  4. 我使用environment=environment()作为该命令的最后一个参数,指示要在呼叫环境中执行的外部ggmap调用。没有这个,它将无法找到我们创建的env变量。

随着这些变化,事情似乎正常工作。

+0

谢谢你的答案杰夫,不幸的是我没有得到你所做的结果。我仍然收到错误'ggplot(data = poa,aes(x = LON,y = LAT),environment = env):object'poa​​'not found'错误。我已将sessionInfo的输出添加到主要问题中,以确保我们使用类似的设置 – user1414259

0

当我更改group = order为例如group = POAOBS该应用程序的作品。

相关问题