这个问题可能不太难,但是我找不到合适的词来搜索它。
我正在R中构建一个生成传单地图的函数。用户将能够以简单的函数参数field_color = "AREA"
的形式选择要用于颜色的字段,其中AREA
是sf
对象中的字段名称。
以下是可重现的示例:
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
设置为我要自动更改颜色的值。但是,它不起作用,并且出现错误。我觉得这是非标准评估之类的问题之王,但我并不是很了解所有这些。我玩过quo
,enquo
,quo_name
等功能,但没有成功。
使该工作正常进行的正确方法是什么?
答案 0 :(得分:1)
老实说,我建议您通过“预先计算”管道外部的颜色数据来回避问题,就像您已经预先计算了调色板一样。这听起来可能很不雅致,但是我认为卷积 magrittr 等人。强迫你进入这里至少是尴尬的。另外,我建议的方法正是“专业人士” here在制作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))
})))