r - 从字符串中动态选择传单颜色字段
问题描述
这个问题可能不太难,但我找不到合适的词来谷歌它。
我正在 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
是 unquote。如果我想要它作为参数,我需要这样称呼它:
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
但没有成功。
使这项工作的正确方法是什么?
解决方案
老实说,我建议通过“预先计算”管道外的颜色数据来回避这个问题,就像您已经预先计算了调色板一样。这可能感觉不雅,但我会争辩说卷积magrittr等人。强迫你进入这里至少同样尴尬。此外,我建议的方法正是“专业人士” 在制作此示例传单应用程序时使用的方法。
具体来说,我会使用这样的东西:
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方式”进行操作,这里是另一种解决方案,以此处记录的讨论为模型。不过,看看这还有多少不可读?
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))
})))
推荐阅读
- android - Android:在自定义适配器上修改数据集
- javascript - Strava API v3 获取所有运动员活动中的访问令牌问题
- python - 全局变量 - 引用后如何分配变量?
- qt-designer - 在 qt 设计器中 QButtonGroup 在 Widget Box 中不可用。
- drop-down-menu - Dropdown select start spinner in Angular 6
- javascript - 类方法在哪里被调用?
- sql-server - SQL Server 中的最后订单日期和年初至今销售额
- google-analytics - 在 Google Analytics 中,如何过滤整个 ISP 但允许特定 IP 地址?
- javascript - 查询选择没有被点击的div来增加它的宽度
- c# - 是否有必要使用构造函数注入检查空值?