从字符串动态选择传单颜色的字段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从字符串动态选择传单颜色的字段相关的知识,希望对你有一定的参考价值。

问题可能不是太难,但我找不到正确谷歌的话。

我正在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))

此代码有效并提供:

enter image description here

但在前面的例子中,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等功能都没有成功。

做这项工作的正确方法是什么?

答案

老实说,我建议只是通过在管道外“预先计算”你的颜色数据来回避这个问题,就像你已经预先计算了调色板一样。这可能感觉不够优雅,但后来我认为旋转magrittr et al。迫使你进入这里至少是尴尬。另外,我建议的方法正是“pros”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))
)))

以上是关于从字符串动态选择传单颜色的字段的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS,传单。如何从第三方服务动态获取纬度和经度坐标?

闪亮的传单不适用于动态菜单

Swiftui:从 JSON 中获取动态颜色渐变?

使用动态菜单时,闪亮的传单无法正常工作

React Apollo 从状态动态创建查询

从 1 和 0 的字符串中选择随机数并更改颜色