Выберите поле для цвета листовки динамически из строки символов - PullRequest
1 голос
/ 05 апреля 2019

Вопрос, вероятно, не слишком сложный, но я не смог найти слов, чтобы правильно его погуглить.

Я строю функцию в 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))

Этот код работает и дает:

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 на значение, которое я хочу автоматически изменить цвет.Однако, это не работает, и я получаю ошибку.У меня такое ощущение, что это какой-то король проблем с Нестандартной оценкой или что-то в этом роде, но я не совсем понимаю все это.Я безуспешно играл с такими функциями, как quo, enquo, quo_name и т. Д.

Как правильно заставить эту работу работать?

1 Ответ

1 голос
/ 05 апреля 2019

Честно говоря, я бы посоветовал просто обойти проблему, "предварительно вычислив" ваши цветовые данные вне канала, так же, как вы уже предварительно вычислили свою цветовую палитру.Это может показаться неуместным, но тогда я бы сказал, что свертки 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 way", вот другое решение, смоделированное из записанного обсуждения здесь .Видите, насколько это еще нечитабельно?

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))
})))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...