闪亮的应用程序 - ggplot找不到数据 [英] shiny app - ggplot can't find data

查看:175
本文介绍了闪亮的应用程序 - ggplot找不到数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我制作了一个闪亮的应用程序,它使用ggmap将静态地图返回。
但是,当我想叠加邮政编码边界时,我遇到了一个错误,其中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 =订单),alpha = .5,color =black,fill = NA))

需要对地图的基础层进行ggplot的嵌套调用,当我这样做ggplot无法找到数据



这是我的server.R代码



我正在使用隔离功能,因为我在我的ui.R中有一个动作按钮,而且我只希望剧情在点击时更新。

 库(闪亮)
库(ggmap)
库(RODBC)

#定义所需的服务器逻辑(输入,输出){

输出$ searchString< - renderText({
if(input $ searchButton == 0))汇总并查看选定的数据集
shinyServer
return()
isolate({input $ searchString})
})

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

mapTypeInput< - reactive({
switch(input $ mapType
,terrain=terrain
,卫星=卫星
,路标=路线图
,混合=混合
,碳粉=碳粉
,水彩=水彩画)
})

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

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

isolate({
if(overlayInput()==nothing){
map< - get_map(location = input $ searchString,zoom = input $ zoom,source = mapSourceInput(),maptyp e = mapTypeInput())
mapPlot< - ggmap(map)
print(mapPlot)
#return()
} else {
if(overlayInput() ==postcodes){
#postcode边界
map< - get_map(location = input $ searchString,zoom = input $ zoom,source = mapSourceInput(),maptype = mapTypeInput())
poa < - 结构(列表(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,color =black,fill = NA)+
coord_map(projection =mercator,
xlim = c(att r(map,bb)$ ll.lon,attr(map,bb)$ ur.lon),
ylim = c(attr(map,bb)$ ll.lat,attr如果(overlayInput()==states)){
return()$ b $(
)$ ur.lat)))

} else {
b}}}
})
})

})

edit:added ui.R

  library(shiny)
#为数据集查看器应用程序定义UI
shinyUI(pageWithSidebar(

#应用程序标题。
headerPanel(新地图应用程序),

#边栏控件
sidebarPanel(
textInput(searchString,Get Map Of,value = (b)b
$ b,selectInput(mapSource,选择地图来源,选择= c(谷歌,雄蕊))

, numericInput(缩放,缩放级别,10)

,helpText(注意:从3(大陆)到21(建筑物),默认值10(城市)的整数)

,selectInput(mapType,选择地图类型,选择= c(terrain,satellite,roadmap,hybrid,toner,watercolor))$ (注意:可用的选项有'terrain','satellite','roadmap'和'hybrid'(谷歌地图),'水彩'和'碳粉'(雄蕊地图)。 )

,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; })
),

#输出面板
mainPanel(
h3(textOutput(searchString))
,plotOutput(map)


))

sessionInfo的输出: p>

  R版本3.0.1(2013-05-16)
平台:x86_64-pc-linux-gnu(64-位)

区域设置:
[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

附加的基本包:
[1] stats graphics grDevices utils数据集方法库

其他附加包:
[1] RODBC_1.3-7 ggmap_2.3 ggplot2_0.9.3。 1 shiny_0.6.0

通过命名空间加载(并未附加):
[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


解决方案

所以我终于弄明白了这一点。



要使ggplot能够在嵌套的ggplot查询中找到数据集,则需要使用<< - <<

例如,在函数内部调用时,无法在此嵌套查询中找到数据集poa。

  print(ggmap(map))+ geom_polygon(data = poa,aes(x = LON,y = LAT,group =订单),alpha = .5,color =black,fill = NA))

你需要在函数中使用poa使用这行

  poa <-p 


从帮助:
操作符< - 和 - >>通常只用于函数中,通过父环境进行搜索,以获得已分配变量的现有定义。


I have made a shiny app which brings static maps back using ggmap. However when I want to overlay postcode boundaries I am encountering an error where ggplot cannot find the data set.

The dataset poa is a dataframe of postcode boundaries i.e. lats and lons with a polygon ID. I have already tried adding environment = environment() but that doesn't solve my problem. I know that the data exists as I call print(str(poa)) which prints to the R console.

Can anyone suggest a work around for me so that ggplot can access the poa dataframe? I apologise that this is not a very reproducible example.

Update: ggplot is able to access the poa dataframe when I use this code:

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

But I need to make a nested call to ggplot for the base layer of the map, when I do that ggplot is unable to find the data

Here is my server.R code

I am using isolate as I have an action button in my ui.R and I only want the plot to update when it has been clicked.

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

)
))

output of 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   

解决方案

So I have finally figured this one out.

To have ggplot be able to find the data set in the nested ggplot query, the data set in question needs to be assigned using <<-

For example the data set poa cannot be found in this nested query when being called inside a function.

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

So before you need to use poa in the function use this line

poa <<- poa

From the help: "The operators <<- and ->> are normally only used in functions, and cause a search to made through parent environments for an existing definition of the variable being assigned."

这篇关于闪亮的应用程序 - ggplot找不到数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆