Карты листовок не отображаются в выводе HTML-документов с вкладками из Rmarkdown - PullRequest
1 голос
/ 06 мая 2019

Я использовал R Markdown для создания HTML-документа с разделами с вкладками, и каждая вкладка должна включать одну карту Leaflet.Когда я запускаю код, карты листовок появляются только на первых двух вкладках документа HTML и не отображаются ни на одной из последующих вкладок.Вот краткое изложение того, что я пробовал:

  • Я пытался просмотреть HTML-документ в RStudio Viewer, Chrome и Firefox, но все они имеют одинаковые результаты (т. Е. Карты не запускаютсяна третьей вкладке).Когда я открываю консоль браузера, возникает ошибка «Ошибка: установите центр карты и сначала увеличьте масштаб».Однако я установил центр карты и масштабирование с помощью setView () в Leaflet.

  • Когда я запускаю фрагменты кода независимо в файле Markdown или в консоли R, они отлично работают при генерациинужные карты.

  • Когда я удаляю разделы с вкладками из файла Markdown, все карты Leaflet появляются под соответствующими заголовками.

  • Порядок вкладок не имеет значения, карты всегда появляются на первых двух вкладках и не появляются на последующих вкладках (т. Е. В примере, если вы перемещаете блок east_map в начало, для cent_state карта не будет).

  • Я специально добавил полный набор кода в каждый фрагмент кода и переименовал каждую отфильтрованную итерацию, чтобы убедиться, что я не пропустил вытягиваниечто-то из глобальной среды.

  • Я также пытался использовать leafletOutput () и renderLeaflet (), но безрезультатно.Но я не думаю, что это уместно, поскольку это больше относится к интеграции Shiny.

  • Я обновил R (3.6.0), RStudio (1.2.1335), pandoc (2.7.2) и все соответствующие пакеты.

Я изучил StackOverview, но у меня совершенно нет идей и буду признателен за любые мысли и рекомендации.

В моем документе я имею10 вкладок, но для краткости я создал нижеприведенный пример, содержащий всего 3 вкладки, которые воспроизводят мою проблему.(Кроме того, я вырезал много кода из моего полного файла Markdown, чтобы сделать его как можно более простым, поэтому извиняюсь, если есть какие-то длительные пакеты и т. Д., Которые не имеют непосредственного отношения к делу.)

---
title: "REPRODUCIBLE EXAMPLE <br> April 2019"
always_allow_html: yes
output:
  html_document:
    df_print: paged
---


# {.tabset .tabset-fade}

## TAB 1

### HEADING 1

```{r natl_map, echo = FALSE, message=FALSE, warning=FALSE, comment=NA, out.width='100%'}
setwd()
library(tidyverse)
library(leaflet)
library(leaflet.extras)
library(htmltools)
library(htmlwidgets)
library(shiny)
library(rgdal)

dat <- tibble(
  state = c("lak", "cent", "east", "east"),
  org = c("abc", "cbs", "fox", "abc"),
  item = c("pump 1", "pump 2", "pump 3", "pump 4"),
  status = c("terrible", "poor", "good", "excellent"),
  lat = c(6.87239, 4.01313, 5.00959, 4.77239),
  lon = c(29.57524, 30.56462, 32.39547,     33.59156)
)

dat$status <- factor(dat$status, levels = c("terrible", "poor", "good", "excellent"))

#Set color pallette for by status
pal <- colorFactor(palette = c("#FF0000", "yellow", "#2cb42c", "blue"),
                   levels = levels(dat$status))

#Create factor layers by facility_type
abc_data <- dat %>%
  filter(org == "abc")

cbs_data <- dat %>%
  filter(org == "cbs")

fox_data <- dat %>%
  filter(org == "fox")

ssd_map <- leaflet() %>%
  addProviderTiles("OpenStreetMap.BlackAndWhite") %>%
  setView(lng = 30.2189853, lat = 7.1751893, zoom = 7) %>%
  setMaxBounds(
    lng1 = 22.625227,
    lat1 = 1.422041, 
    lng2 = 36.978083,
    lat2 = 13.528717 
  )

natl_map <- ssd_map %>% 
  clearMarkers() %>%
  addCircleMarkers(data =   abc_data,
                   color = ~pal(status),
                   radius   =   2,
                   group = "abc") %>%
  addCircleMarkers(data =   cbs_data,
                   color = ~pal(status),
                   radius   =   2,
                   group = "cbs") %>%
  addCircleMarkers(data =   fox_data,
                   color = ~pal(status),
                   radius   =   2,
                   group = "fox") %>%
  addLayersControl(overlayGroups = c("abc",
                                     "cbs",
                                     "fox")) %>%
  addLegend(position = "topright",
            pal = pal,
            title = "Status",
            values = dat$status) %>%
  addResetMapButton()

natl_map

```

## TAB 2

### HEADING 2.1

```{r cent_map, echo = FALSE, message=FALSE, warning=FALSE, comment=NA, out.width='100%'}
setwd()
library(tidyverse)
library(leaflet)
library(leaflet.extras)
library(htmltools)
library(htmlwidgets)
library(shiny)
library(rgdal)

dat <- tibble(
  state = c("lak", "cent", "east", "east"),
  org = c("abc", "cbs", "fox", "abc"),
  item = c("pump 1", "pump 2", "pump 3", "pump 4"),
  status = c("terrible", "poor", "good", "excellent"),
  lat = c(6.87239, 4.01313, 5.00959, 4.77239),
  lon = c(29.57524, 30.56462, 32.39547,     33.59156)
)

dat$status <- factor(dat$status, levels = c("terrible", "poor", "good", "excellent"))

#Set color pallette for by status
pal <- colorFactor(palette = c("#FF0000", "yellow", "#2cb42c", "blue"),
                   levels = levels(dat$status))

cent_dat <- dat %>%
  filter(state == "cent")

#Create factor layers by facility_type
cent_abc_data <- cent_dat %>%
  filter(org == "abc")

cent_cbs_data <- cent_dat %>%
  filter(org == "cbs")

cent_fox_data <- cent_dat %>%
  filter(org == "fox")


cent_map <- leaflet() %>%
  addProviderTiles("OpenStreetMap.BlackAndWhite") %>%
  setView(lng = 31.3222933, lat = 4.734494, zoom = 8) %>%
  setMaxBounds(
    lng1 = 32.149583,
    lat1 = 6.259701, 
    lng2 = 29.753375,
    lat2 = 3.501536 
  )

cent_map <- cent_map %>% 
  clearMarkers() %>%
  addCircleMarkers(data =   cent_abc_data,
                   color = ~pal(status),
                   radius   =   2,
                   group = "abc") %>%
  addCircleMarkers(data =   cent_cbs_data,
                   color = ~pal(status),
                   radius   =   2,
                   group = "cbs") %>%
  addCircleMarkers(data =   cent_fox_data,
                   color = ~pal(status),
                   radius   =   2,
                   group = "fox") %>%
  addLayersControl(overlayGroups = c("abc",
                                     "cbs",
                                     "fox")) %>%
  addLegend(position = "topright",
            pal = pal,
            title = "Status",
            values = dat$status) %>%
  addResetMapButton()

cent_map

```

## TAB 3

### HEADING 3

```{r east_map, echo = FALSE, message=FALSE, warning=FALSE, comment=NA, out.width='100%'}
setwd()
library(tidyverse)
library(leaflet)
library(leaflet.extras)
library(htmltools)
library(htmlwidgets)
library(shiny)
library(rgdal)

dat <- tibble(
  state = c("lak", "cent", "east", "east"),
  org = c("abc", "cbs", "fox", "abc"),
  item = c("pump 1", "pump 2", "pump 3", "pump 4"),
  status = c("terrible", "poor", "good", "excellent"),
  lat = c(6.87239, 4.01313, 5.00959, 4.77239),
  lon = c(29.57524, 30.56462, 32.39547,     33.59156)
)

dat$status <- factor(dat$status, levels = c("terrible", "poor", "good", "excellent"))

#Set color pallette for by status
pal <- colorFactor(palette = c("#FF0000", "yellow", "#2cb42c", "blue"),
                   levels = levels(dat$status))

east_dat <- dat %>%
  filter(state == "east")

#Create factor layers by facility_type
east_abc_data <- east_dat %>%
  filter(org == "abc")

east_cbs_data <- east_dat %>%
  filter(org == "cbs")

east_fox_data <- east_dat %>%
  filter(org == "fox")

east_map <- leaflet() %>%
  addProviderTiles("OpenStreetMap.BlackAndWhite") %>%
  setView(lng = 33.731222, lat = 5.084033, zoom = 8) %>%
  setMaxBounds(
    lng1 = 35.964000,
    lat1 = 3.556817, 
    lng2 = 31.597152,
    lat2 = 5.906979  
  )

east_map <- east_map %>% 
  clearMarkers() %>%
  addCircleMarkers(data =   east_abc_data,
                   color = ~pal(status),
                   radius   =   2,
                   group = "abc") %>%
  addCircleMarkers(data =   east_cbs_data,
                   color = ~pal(status),
                   radius   =   2,
                   group = "cbs") %>%
  addCircleMarkers(data =   east_fox_data,
                   color = ~pal(status),
                   radius   =   2,
                   group = "fox") %>%
  addLayersControl(overlayGroups = c("abc",
                                     "cbs",
                                     "fox")) %>%
  addLegend(position = "topright",
            pal = pal,
            title = "Status",
            values = dat$status) %>%
  addResetMapButton()

east_map

```

Ожидаемый результат - HTML-документ с тремя вкладками, на каждой из которых имеется одна карта Leaflet.

Ответы [ 2 ]

1 голос
/ 27 мая 2019

Благодаря некоторой поддержке на других форумах решение было предоставлено здесь: https://github.com/rstudio/leaflet/issues/623

1 голос
/ 21 мая 2019

Я впервые публикую ответ на переполнение стека, поэтому извиняюсь за неправильный формат!

У меня была точно такая же проблема, как и у вас. Кажется, я решил проблему в вашем коде, удалив пакетную функцию leaflet.extras addResetMapButton() из кода карты на вкладке 2 и на вкладке 3. Вы можете оставить ее на вкладке 1.

Я не слишком задумывался о том, что происходит за кулисами, чтобы это вызвать. Когда addResetMapButton() включен в ваш код, на третьей вкладке карты появляется ошибка javascript с надписью Uncaught Error: Set map center and zoom first.. Надеюсь, кто-то, кто лучше разбирается в Javascript, может объяснить, что происходит между addResetMapButton() и вкладками карты, чтобы вызвать эту ошибку.

...