Как сохранить карту листовки (созданную с помощью rMaps) в виде HTML-виджета?

Вопрос 1 Я пытаюсь сохранить листовую карту, созданную с помощью rMaps, в html-файле.

L2 <- Leaflet$new()
L2$setView(c(29.7632836,  -95.3632715), 10)
L2$tileLayer(provider = "MapQuestOpen.OSM")
L2
library(htmlwidgets)

saveWidget(L2,"t.html")

Но я получил ошибку:

Error in envRefInferField(x, what, getClass(class(x)), selfEnv) : 
  ‘width’ is not a valid field or method name for reference class “Leaflet”

Ответ 1 Благодаря LukeA мы можем использовать этот синтаксис:

leaflet(width = "100%") %>% 
  addProviderTiles("MapQuestOpen.OSM") %>% 
  setView(-95.3632715, 29.7632836, zoom = 10) -> L2 

Вопрос 2 Но тогда, как добавить addAssets и setTemplate:

# Add leaflet-heat plugin. Thanks to Vladimir Agafonkin
L2$addAssets(jshead = c(
  "http://leaflet.github.io/Leaflet.heat/dist/leaflet-heat.js"
))

# Add javascript to modify underlying chart
L2$setTemplate(afterScript = sprintf("
<script>
  var addressPoints = %s
  var heat = L.heatLayer(addressPoints).addTo(map)           
</script>
", rjson::toJSON(crime_dat)
))

L2

Ответ 2 Еще раз, благодаря LukeA, у нас есть ответ:

L2$save(tf <- tempfile(fileext = ".html"),standalone=TRUE)

Вопрос 3

Фактически, моя первоначальная проблема заключается в том, что я не могу написать код в rmarkdown, чтобы генерировать карту непосредственно в html-документе.

Теперь я могу сохранить карту в одиночку. Но как интегрировать его в HTML-документ? Быстрое решение состоит в том, чтобы сделать iframe. Есть ли еще какие-нибудь более изящные решения?

1 ответ

Решение

Хотя это и не прямой ответ на ваш вопрос, я предлагаю альтернативный подход, который дает аналогичный результат:

library(leaflet)
library(htmlwidgets)
leaflet() %>% 
  addProviderTiles("MapQuestOpen.OSM") %>% 
  setView(-95.3632715, 29.7632836, zoom = 10) -> m 
saveWidget(m, tf <- tempfile(fileext = ".html"))

или, используя rMaps:

library(plyr)
library(rCharts)
library(rMaps)
data(crime, package = 'ggmap')
crime_dat = ddply(crime, .(lat, lon), summarise, count = length(address))
crime_dat = toJSONArray(na.omit(unname(crime_dat)), json = F)

L2 <- Leaflet$new()
L2$setView(c(29.7632836,  -95.3632715), 10)
L2$tileLayer(provider = "MapQuestOpen.OSM")
# Add leaflet-heat plugin. Thanks to Vladimir Agafonkin
L2$addAssets(jshead = c(
  "http://leaflet.github.io/Leaflet.heat/dist/leaflet-heat.js"
))
# Add javascript to modify underlying chart
L2$setTemplate(afterScript = sprintf("
<script>
  var addressPoints = %s
  var heat = L.heatLayer(addressPoints).addTo(map)           
</script>
", rjson::toJSON(crime_dat)
))

L2$save(tf <- tempfile(fileext = ".html"),standalone=TRUE)
Другие вопросы по тегам