Вы можете перечислить кучу возможных значков (здесь я выбрал font-awesome) в выбранном HTML-теге следующим образом:
1) Получить полный список значков font-awesome
fa_list <- read_html("http://astronautweb.co/snippet/font-awesome/") %>%
html_nodes("span.icon-name") %>%
html_text()
fa_pretty <- gsub("^fa-", "", fa_list)
2) Загрузите в ui
загруженные шрифты
tags$head(
tags$link(rel = "stylesheet", href = "https://maxcdn.bootstrapcdn.com/font-awesome/4.6.1/css/font-awesome.min.css")
)
3) Создайте виджет пользовательского интерфейса, который может отображать различные значки
shinyWidgets::pickerInput("defaultIcon", "Default Marker", choices = fa_pretty,
options = pickerOptions(liveSearch = TRUE),
choicesOpt = list(icon = paste("fa", fa_list),
iconBase = "fontawesome"))
Пользователь может выбрать значок, который он / она хочет, и ваша панель инструментов может уважать его, написав:
... %>%
addDrawToolbar(...,
markerOptions = list(markerIcon = makeAwesomeIcon(icon = input$defaultIcon, library = "fa"))
Однако addDrawToolbar
, похоже, не очень хорошо работает с leafletProxy
, так что если вы изменитемаркер-значок в пользовательском интерфейсе, он будет стереть карту листовки, и вы должны начать все сначала.Вместо этого, если вы хотите переключать значки и сохранять существующие маркеры, вы можете определить свои собственные функции для добавления маркеров.На мой взгляд, это более гибкое решение, которое по-прежнему обрабатывает все ваши запросы пользовательского интерфейса и функциональности.Полный пример ниже:
library(shiny)
library(leaflet)
library(leaflet.extras)
library(rvest)
fa_list <- read_html("http://astronautweb.co/snippet/font-awesome/") %>%
html_nodes("span.icon-name") %>%
html_text()
fa_pretty <- gsub("^fa-", "", fa_list)
# Awesome-icon markers only support the colors below...
fa_cols <- c("red", "darkred", "lightred", "orange", "beige", "green", "darkgreen",
"lightgreen", "blue", "darkblue", "lightblue", "purple", "darkpurple",
"pink", "cadetblue", "white", "gray", "lightgray", "black")
ui <- fluidPage(
tags$head(
tags$link(rel = "stylesheet",
href = "https://maxcdn.bootstrapcdn.com/font-awesome/4.6.1/css/font-awesome.min.css")
),
tags$style(type = "text/css", "#map {height: calc(100vh - 20px)!important;}"),
fluidRow(
splitLayout(cellArgs = list(style = "overflow: visible;"),
shinyWidgets::pickerInput("defaultIcon", "Default Marker", choices = fa_pretty,
options = shinyWidgets::pickerOptions(liveSearch = TRUE),
choicesOpt = list(icon = paste("fa", fa_list),
iconBase = "fontawesome")),
colourpicker::colourInput("defaultColor", "Default icon color"),
colourpicker::colourInput("defaultBg", "Default marker color", palette = "limited",
allowedCols = fa_cols, returnName = TRUE, value = "red")
),
tags$div( tags$b("Place Marker"),
shinyWidgets::switchInput("edit_mode", "Edit Mode",
onLabel = "Click on the map to add a marker"))
),
leafletOutput("map")
)
server <- function(input,output,session){
react_list <- reactiveValues()
# While the user has toggled the edit-mode input, register any future map-clicks
# as reactive values.
observe({
if (input$edit_mode & !isTRUE(input$map_click$.nonce == react_list$nonce)) {
react_list$mapEditClick <- input$map_click
}
react_list$nonce <- input$map_click$.nonce
})
output$map <- renderLeaflet(
leaflet() %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addMeasure(
primaryLengthUnit = "kilometers",
secondaryAreaUnit = FALSE) %>%
setView(lat = 45, lng = 9, zoom = 3)
)
# When a user clicks on the map while being in edit-mode, place a marker with
# the chosen icon, color and marker-color at the click coordinates.
observeEvent(react_list$mapEditClick, {
leafletProxy("map") %>%
addAwesomeMarkers(
lng = react_list$mapEditClick$lng,
lat = react_list$mapEditClick$lat,
layerId = as.character(react_list$mapEditClick$.nonce),
icon = makeAwesomeIcon(icon = input$defaultIcon,
library = "fa",
iconColor = input$defaultColor,
markerColor = input$defaultBg),
label = "Click to delete",
labelOptions = labelOptions(TRUE))
})
# Delete the marker when it has been clicked.
observeEvent(input$map_marker_click, {
leafletProxy("map") %>%
removeMarker(as.character(input$map_marker_click$id))
})
}
shinyApp(ui,server)