r - 没有出现闪亮的传单地图图块

时间:2018-01-30 09:44:35

标签: r shiny leaflet mapbox

我认识到有一些类似的SO问题(例如this one),并且已经研究过但无济于事。所以,也许你们中的一个可爱的人可能能够拯救一个崭露头角的R爱好者!

示例数据:

tab1_data <- data.table( id = c(1,2,3,4),
                         londd = c(-1.610245, -0.242566, -0.136315, -0.730095),
                         latdd = c(52.98752, 54.04599, 50.79249, 51.16059),
                         type = c("A", "B", "C", "D"),
                         price = c(175000, 61000, 62500, 72500))

我已按照this SO post中列出的示例(非常感谢,谢谢)。我尝试按照this link中的内容将地图提供程序更改为MapBox,但在输出时,地图不会渲染。请看下面的图片,代码也在下面。

Map Screenshot

代码:

#Set up ui
  fluidPage(
    titlePanel("Panel"),
    sidebarPanel(h5("", width=1),
                 checkboxGroupInput(inputId = "TypeFlag",label = h4("Type"), 
                                    choices = setNames(object = c("A", "B", "C", "D"),
                                                       nm = c("A", "B", "C", "D")),
                                    selected = c("A", "B", "C", "D")
                 ),
                 position="left"),

    #App mainPanel content and styles
    mainPanel(fluidRow(leafletOutput(outputId = "map")))
  )
)

#Set up server
server <- function(input, output){
  #Build leaflet map
  map <- leaflet(data = tab1_data) %>%
    addProviderTiles("MapBox", 
                     options = providerTileOptions(id = "mapbox.light", noWrap = FALSE, 
                                                   accessToken = Sys.getenv('MAPBOX_ACCESS_TOKEN'))) %>%
    fitBounds(~min(londd), ~min(latdd), ~max(londd), ~max(latdd))

  #Filter data
  datFilt <- reactive({
    MatSearch <- paste0(c('xxx', input$TypeFlag), collapse = "|")
    tab1_data[grepl(MatSearch,type)]
  })

  #Add markers based on selected flags
  observe({
    if(nrow(datFilt()) == 0) {
      print("Nothing selected")
      leafletProxy("map") %>%
        clearMarkerClusters()
    } else { #print(paste0("Selected: ", unique(input$InFlags&input$InFlags2)))
      print("Something Selected")
      leafletProxy("map", data=datFilt()) %>% 
        clearMarkerClusters() %>% 
        addCircleMarkers(lng = ~londd, lat = ~latdd,
                         clusterOptions = markerClusterOptions(), weight=3,
                         color = "#90EE90", opacity=1, fillColor = "#228B22", 
                         fillOpacity = 0.8)
    }
  })

  output$map <- renderLeaflet(map)
}

#Run app
shinyApp(ui = ui, server = server)

值得注意的是,如果我用下面的addProviderTiles()替换代码,它就可以工作了(但我更喜欢MapBox的美学,希望我可以使用它!):

"Stamen.TonerLite", options = providerTileOptions(noWrap = TRUE)

我希望它与注册到MapBox有关?但是,我使用this SO post作为示例而没有注册的地图。

我尝试在帖子开头设置地图参数a the link,但这不起作用(值得一试)。如果我像在弹出窗口中那样在浏览器中打开,我会得到相同的结果。最后,复选框是功能性和反应性的。

我不会撒谎并且说我确切知道shinyapp和传单地图的运作方式,所以任何解释都会令人惊讶,即使它只是一个教育评论!

谢谢, Simse

2 个答案:

答案 0 :(得分:1)

虽然这里可能会有一些闪亮的相关问题(稍后会详细介绍),似乎问题可以简化为以下几点:

library(leaflet)

## Works
leaflet() %>%
  addProviderTiles("Stamen.TonerLite") 

## Doesn't Work
leaflet() %>%
  addProviderTiles("MapBox", 
                   options = providerTileOptions(id = "mapbox.light",
                                                 noWrap = FALSE, 
                                                 accessToken = Sys.getenv('MAPBOX_ACCESS_TOKEN'))) 

如果使用Mapbox的第二个仍然不适合你,那么你的accessToken要么无效,要么已过期,要么没有像你期望的那样作为环境变量存储/返回。

要消除您是否拥有有效令牌的问题,请尝试暂时对其进行硬编码以代替环境变量调用。

注意:我在博客文章中找到了要测试的实际工作令牌,以下代码段包含部分编辑版本。

library(leaflet)

MBaccessToken <- "pk.eyJxIjxxxWJyZxNraGxiLxxxIjQoxxxxHX1xpRSx9.9xPQxA3xdxyxAxPkxYxYE"

leaflet() %>%
  addProviderTiles("MapBox", 
                   options = providerTileOptions(id = "mapbox.light",
                                                 noWrap = FALSE, 
                                                 accessToken = MBaccessToken)) 

显示以下内容:

map

如果(且仅当)有效,请继续执行以下操作。

第2部分:潜在的shiny问题

如果您可以在交互式会话中运行时正确呈现地图(我假设为RStudio)但地图不会呈现为shiny应用程序,则可以打开故障排除方法。

  • 应用程序是否仅在交互式RStudio会话中,在本地管理的闪亮服务器,shinyapps.io或其他第三方云服务上运行?
  • 当应用程序在该环境中运行时,应用程序运行的用户是什么?如何定义该用户的环境变量,您是否可以控制它们?

简而言之,如果应用程序未部署在您正在测试并作为同一用户运行的同一服务器上,则Sys.getenv()调用将在部署时提供与测试时不同的结果在RStudio。

测试此方法的一种简单方法是将以下行添加到示例应用程序中以进行测试,以确保正在按预期从环境变量中读取令牌。

在ui中添加:

textOutput("token")

添加到服务器:

output$token <- renderText(Sys.getenv('MAPBOX_ACCESS_TOKEN'))

答案 1 :(得分:1)

您的申请工作正常。我尝试了两个不同的mapbox令牌,它们都在工作。试试这个:

accessToken = 'your_token_from_your_mapbox_account')) %>%