Select 来自字符串的传单颜色动态字段

Select field for leaflet color dynamically from a character string

问题可能不太难,但我找不到合适的词 google。

我正在用 R 构建一个函数来制作传单地图。用户将能够以简单函数参数 field_color = "AREA" 的形式选择他想要用于颜色的字段,其中 AREAsf 对象中的字段名称。

这是一个可重现的例子:

library(sf)  
library(leaflet)

# preparing the shapefile
nc <- st_read(system.file("gpkg/nc.gpkg", package="sf"), quiet = TRUE) %>% 
  st_transform(st_crs(4326)) %>% 
  st_cast('POLYGON')

# setting the colors
colpal <- colorNumeric(palette = "plasma", domain=nc$AREA, n=10)

# making the first map like in your example:
leaflet(nc) %>%
  addTiles() %>%
  addPolygons(color = ~colpal(AREA))

此代码有效并给出:

但在前面的示例中,AREA 未被引用。如果我想要它作为参数,我需要这样称呼它:

chosen_field = "AREA"

# setting the colors
colpal2 <- colorNumeric(palette = "plasma", domain=nc[[chosen_field]], n=10)

# making the first map like in your example:
leaflet(nc) %>%
   addTiles() %>%
   addPolygons(color = ~colpal2(chosen_field))
Error in UseMethod("rescale") : 
  no applicable method for 'rescale' applied to an object of class "character"

这样,我可以将 chosen_field 设置为我想要自动更改颜色的值。但是,它不起作用,我收到错误消息。我有一种感觉,这是非标准评估之类的问题之王,但我并不真正理解所有这些。我尝试了 quoenquoquo_name 等函数,但没有成功。

实现该功能的正确方法是什么?

老实说,我建议通过 "pre-computing" 管道外的颜色数据来回避这个问题,就像您已经预先计算了调色板一样。这可能感觉不雅,但我认为卷积 magrittr 等。强迫你进入这里至少同样尴尬。此外,我建议的方法正是 "pros" here in their production of this 示例传单应用程序所使用的方法。

具体来说,我会使用这样的东西:

library(sf)  
library(leaflet)

## User-selected parameter
chosen_field <- "AREA"

## Shapefile preparation
nc <- st_read(system.file("gpkg/nc.gpkg", package="sf"), quiet = TRUE) %>% 
  st_transform(st_crs(4326)) %>% 
  st_cast('POLYGON')

## Color setup
colpal <- colorNumeric(palette = "plasma", domain=nc[[chosen_field]], n=10)
colorData <- nc[[chosen_field]]

## Putting it all together
leaflet(nc) %>%
  addTiles() %>%
    addPolygons(color = ~colpal(colorData))

或者,如果您必须按照“rlang方式”,这里是另一个解决方案,以讨论记录为蓝本here。不过,看看这有多难读?

library(sf)  
library(leaflet)

## User-selected parameter
chosen_field <- "AREA"

## Prep user-selected parameter for passage into pipe
v <- as.symbol(chosen_field)
v <- enquo(v)

## Shapefile preparation
nc <- st_read(system.file("gpkg/nc.gpkg", package="sf"), quiet = TRUE) %>% 
  st_transform(st_crs(4326)) %>% 
  st_cast('POLYGON')

## Color setup
colpal <- colorNumeric(palette = "plasma", domain=nc[[chosen_field]], n=10)
colorData <- nc[[chosen_field]]

## Putting it all together
rlang::eval_tidy(rlang::quo_squash(quo({
    leaflet(nc) %>%
      addTiles() %>%
        addPolygons(color = ~colpal(!!v))
})))