R Shiny 应用程序中的传单地图图例不显示颜色

Leaflet map legend in R Shiny app has doesn't show colors

当我尝试将图例添加到传单地图(使用 Leaflet for R 包)并入 Shiny 应用程序时,图例不显示调色板的颜色。相反,它只显示为 NA 值指定的颜色,在本例中为白色。

该应用执行以下操作:

这是我用来制作图例的代码:

addLegend(position = "bottomleft",
   pal = pal, values = shp.data()$stat.selected,
   title = "Legend",
   opacity = .5)

其中pal是分位数调色板如下

pal <-colorQuantile(c("#B2FF66","#66CC00","#4C9900","#336600","#193300"),
                    NULL, n = 5, na.color="#FFFFFF")

shp.data() 是一个反应式表达式,它是一个基于用户输入过滤的 shapefile,stat_selected 是用户选择用于映射到颜色的特定统计信息。

我收到以下警告:

Warning in is.na(x) :
  is.na() applied to non-(list or vector) of type 'NULL'
Warning in is.na(values) :
  is.na() applied to non-(list or vector) of type 'NULL'

我最初尝试按照 R 页面传单上的示例制作图例,并将参数 values = ~stat.selected 用于 addLegend 函数,但出现此错误:

Error in UseMethod("doResolveFormula") : 
  no applicable method for 'doResolveFormula' applied to an object of class "NULL"

我能够通过更改我在 AddLegend 函数的参数中引用值列的方式来显示颜色。我将 stat.selected 变量放在双括号中,这似乎解决了问题:

addLegend(position = "bottomleft",
          pal = pal, values = shp.data()[[stat.selected]],
          title = "Legend",
          opacity = 1
          )

为澄清起见,stat.selected 变量来自以下 switch 语句:

 stat.selected <- isolate(switch(input$var.stat,
                                "Total employment" = "tot_emp",
                                "Mean annual wage" = "a_mean",
                                "Mean hourly wage" = "h_mean",
                                "Location quotient" = "loc_quotient"
)

其中 "tot_emp""a_mean""h_mean""loc_quotient"shp.data 空间多边形数据框中的列名称。

我想问题是我试图使用 $.

通过变量传递列名

我仍然是一个相当新的 R 用户,所以如果有人能解释为什么 Leaflet for R 文档中的示例在这种情况下不起作用,我将不胜感激。

之前我只有一个简单的代码片段,展示了如何添加图例。我没有像往常一样在图例值之前使用 ~ 。我做了传统的 dataframe$column,效果很好。

现在已更新,以了解它们如何组合在一起。这是在创建所有变量切割等之后的完整映射 运行。最终清理的数据帧称为 zipData

# create a full popup
# add some HTML for editing the styles

zipData$popUp <- paste('<strong>',zipData$Street, '</strong><br>',
                       'TIV = $',prettyNum(zipData$tiv, big.mark = ',',preserve.width = 'none'), '<br>',
                       'City: ', zipData$city, '<br>',
                       'YrBuilt = ', zipData$YearBuilt, '<br>',
                       'Construction = ', zipData$ConstructionCode, '<br>',
                       'Occupancy = ', zipData$OccupancyCode, '<br>',
                       'Premium = $' , prettyNum(zipData$Premium, big.mark = ',',preserve.width = 'none') , '<br>',
                       'GrossArea = ', prettyNum(zipData$GrossArea, big.mark = ',', preserve.width = 'none'), '<br>', 
                       'RoofYr = ', zipData$RoofYearBuilt, '<br>')

# set color scale for key factor
colorsConst <- colorFactor(rainbow(4), zipData$ConstructionCode)

# color scales for numerical bins
colorstivValue <- colorFactor(palette = 'Accent', zipData$tivValueLvl)
colorsYrBuilt <- colorFactor(palette = 'Spectral', zipData$yrBuiltLvl)
colorsRoofYrBuilt <- colorFactor(palette = "YlOrRd", zipData$roofYrBuiltLvl)


# begin the leaflet map construction
# create the map opbject

m <- leaflet() %>%
    addTiles() %>%

# add different tiles for different color schemes

    addProviderTiles(providers$OpenStreetMap, group = 'Open SM')  %>%
    addProviderTiles(providers$Stamen.Toner, group = 'Toner')  %>%
    addProviderTiles(providers$CartoDB.Positron, group = 'CartoDB')  %>%
    addProviderTiles(providers$Esri.NatGeoWorldMap, group = 'NG World') %>%
    setView(lng = -90, lat = 30, zoom = 10) %>%

##############################

    # this section is for plotting the variables
    # each variable below is a layer in the map

    # construction
    addCircleMarkers(data = zipData, lat = ~Lat, lng = ~Lon,
                     color = ~colorsConst(ConstructionCode), popup = zipData$popUp,
                     radius = 5, group = 'Construction') %>%
    # tiv
    addCircleMarkers(data = zipData, lat = ~Lat, lng = ~Lon, 
                     color = ~colorstivValue(tivLvl), popup = zipData$popUp,
                     radius = ~tiv/20000, group = 'Bldg Value') %>%

    # year built  
    addCircleMarkers(data = zipData, lat = ~Lat, lng = ~Lon, 
                     color = ~colorsYrBuilt(yrBuiltLvl), popup = zipData$popUp,
                     radius = ~YearBuilt/250, group = 'Yr Built') %>%


######################################

    # layer control

    addLayersControl(
        baseGroups = c('Open SM', 'Toner', 'Carto DB', 'NG World'),

        overlayGroups = c('Construction',
                          'TIV',
                          'Yr Built'
        ),
        options = layersControlOptions(collapsed = F)
    ) %>%


#################################################       
add the legends for each of the variables


    # construction        
    addLegend('bottomright', pal = colorsConst, values = zipData$ConstructionCode,
              title = 'Construction Code',
              opacity = 1) %>%

     # tiv 
    addLegend('bottomleft', pal = colorstivValue, values = zipData$tivLvl,
              title = 'TIV',
              opacity = 1) %>%

    # year built
    addLegend('topleft', pal = colorsYrBuilt, values = zipData$yrBuiltLvl,
              title = 'Yr Built',
              opacity = 1)


m  # Print the map

部分地图如下所示。

我收到了同样的消息

Error in UseMethod("doResolveFormula") : no applicable method for 'doResolveFormula' applied to an object of class "NULL" 

    data <- data.frame(lng1 = c(1, 2, 3), 
                   lng2 = c(2, 3, 4), 
                   lat1 = c(1, 2, 3), 
                   lat2 = c(2, 3, 4), 
                   values = c(1, 2, 3))

    pal_grid <- colorNumeric(palette = "YlGn", domain = data$values)

    leaflet() %>% 
      addRectangles(lng1 = data$lng1, lat1 = data$lat1, 
                lng2 = data$lng2, lat2 = data$lat2, 
                fillColor = ~pal_grid(data$values),
                fillOpacity = 0.2,
                weight = 2, opacity = 0.5)

解决方案是在对 leaflet() 的主调用或对之后添加的任何元素的调用中,向传单提供您用于创建元素的数据。

  1. 在leaflet()的主要调用中:

    data <- data.frame(lng1 = c(1, 2, 3), 
                   lng2 = c(2, 3, 4), 
                   lat1 = c(1, 2, 3), 
                   lat2 = c(2, 3, 4), 
                   values = c(1, 2, 3))
    
    pal_grid <- colorNumeric(palette = "YlGn", domain = data$values)
    
    leaflet(data = data) %>% 
      addRectangles(lng1 = data$lng1, lat1 = data$lat1, 
                lng2 = data$lng2, lat2 = data$lat2, 
                fillColor = ~pal_grid(data$values),
                fillOpacity = 0.2,
                weight = 2, opacity = 0.5)
    
  2. 添加元素时:

    data <- data.frame(lng1 = c(1, 2, 3), 
                   lng2 = c(2, 3, 4), 
                   lat1 = c(1, 2, 3), 
                   lat2 = c(2, 3, 4), 
                   values = c(1, 2, 3))
    
    pal_grid <- colorNumeric(palette = "YlGn", domain = data$values)
    
    leaflet() %>% 
      addRectangles(data = data,
                lng1 = data$lng1, lat1 = data$lat1, 
                lng2 = data$lng2, lat2 = data$lat2, 
                fillColor = ~pal_grid(data$values),
                fillOpacity = 0.2,
                weight = 2, opacity = 0.5)`