【问题标题】:Leaflet not rendering in dynamically generated R markdown html knitr传单未在动态生成的 R markdown html knitr 中呈现
【发布时间】:2020-12-09 04:56:56
【问题描述】:

我创建了一个 R markdown 报告,其中部分和标签集是动态创建的。

我有一个问题,即在输出中未生成传单地图,而是在空白处生成。然而,它们确实在 R 工作室中渲染。

这是一张图片,显示了输出当前的外观以及它的外观。

这是我尝试过的代码:

{r, echo = FALSE, results='asis', warning=FALSE, message=FALSE}

for (estates in filtered_list){
map_data <- x_estates %>% filter(Street_Postcode == estates)

    cat("###", estates, "{.tabset .tabset-fade .tabset-pills}", "\n")
    cat("\n\n\n")
    cat("This is where the map will go ")
    
# generate leaflet plot (doesn't even show white space if not stored in tagList)
    page <- tagList(
leaflet() %>% addTiles() %>% 
  addMarkers(map_data$Longitude, map_data$Latitude)
)

### options i've tried for getting the Leaflet map to plot correctly
   
page
print(page)
print(page[[1]])
page[[1]]
 
print(
 tagList(
     page[[1]]
    ))
 
 print(
    tagList(
     page
    ))
### end 

        cat("\n\n\n")
    

     for (major in Major$Titles) {
     
         cat("####", major, "\n")
         cat("\n\n\n") 
         
##### 
rest of code
#####

}
}


我认为这与 html 渲染有关,因为我使用 ggmap 工作生成的静态图;但是我希望我的地图是交互式的。

注意地图在 R studio 中渲染得很好,只是在 knitr html 输出中没有。

编辑

按照 Susan Switzer 的建议,我对代码进行了一些更改。现在显示传单图(也具有交互性)。可以更改代码以动态命名和加载正确的 HTML 文件。

    m <- leaflet() %>% addTiles() %>% 
addMarkers(map_data$Longitude, map_data$Latitude)
library(mapview)
m <- mapshot(m, url = paste0(getwd(), "/map.html"))
# m <- htmltools::includeHTML("map.html") produces an odd output where the entire document becomes a laggy leaflet map
# print(m) 

m <- htmltools::tags$iframe(title = "Map", src = "map.html")
print(m)

编辑 2

Waldi 已经解决了使用积分的问题。然而,在使用集群或热图时也会出现同样的问题。例如

library(tidyverse)
library(leaflet)
library(leaflet.extras)
leaflet()

显示具有 3 组坐标的示例的最少代码

long <- as.numeric(c("0.005638", "0.005648", "0.005658"))
lat <- as.numeric(c("51.62879", "51.62889", "51.62879"))
data1 <- data.frame(long, lat)


filtered_list <- 1:3
cat("## Tabs {.tabset .tabset-fade .tabset-pills}", "\n")
for (estates in filtered_list){
    cat("###", estates, "\n")
    cat("\n\n\n")
    cat("This is where the map will go ")
    
        cat("1 ")
# generate leaflet plot (doesn't even show white space if not stored in tagList)
    page <- htmltools::tagList(
         leaflet() %>%
            addTiles() %>%  # Add default OpenStreetMap map tiles
            addMarkers(lng=data1$long, lat=data1$lat, popup="The birthplace of R")
    )
    cat(as.character(page))
    
            cat("2 ")
    page <- htmltools::tagList(
         leaflet() %>%
            addTiles() %>%  # Add default OpenStreetMap map tiles
            addMarkers(lng=data1$long, lat=data1$lat, popup="The birthplace of R", clusterOptions = markerClusterOptions()) 
    )
    cat(as.character(page))
    
    
        
            cat("3 ")
    page <- htmltools::tagList(
         leaflet() %>%
            addTiles() %>%  # Add default OpenStreetMap map tiles
           addMarkers(lng=data1$long, lat=data1$lat, popup="The birthplace of R") %>% 
           addHeatmap(
    lng = data1$lat, lat = data1$long,
    blur = 20, max = 5, radius = 40
    )
    )
    cat(as.character(page))
    
    
        
            cat("4 ")
    page <- htmltools::tagList(
         leaflet() %>%
            addTiles() %>%  # Add default OpenStreetMap map tiles
           addMarkers(lng=data1$long, lat=data1$lat, popup="The birthplace of R") %>% 
           addHeatmap(
    lng = data1$lat, lat = data1$long,
    blur = 20, max = 5, radius = 40
    )
    )
    cat(as.character(page))
    
    
    }

【问题讨论】:

  • 您是否查看过以下内容:stackoverflow.com/questions/31336898/…?我认为这里使用 mapshot 或 webshot 是相关的。
  • 我认为这将解决问题。我已经尝试过了,并取得了一些进展。传单地图现在以交互方式显示,尽管都是相同的图。大概是因为我正在覆盖地图 html。将进一步探索这一点。 i.imgur.com/8nKwuRA.png。我已经更新了上面的代码以显示

标签: r leaflet maps r-markdown


【解决方案1】:

这是与here with Highcharter 描述的类似问题

试试:

---
title: "Test Leaflet Tabs"
output: html_document
---

`r knitr::opts_chunk$set(echo = FALSE, warning = FALSE, message = FALSE, cache = F)`

```{r setup, include=FALSE}
library(leaflet)
leaflet()
```

```{r,results='asis'}

filtered_list <- 1:3
cat("## Tabs {.tabset .tabset-fade .tabset-pills}", "\n")
for (estates in filtered_list){
    cat("###", estates, "\n")
    cat("\n\n\n")
    cat("This is where the map will go ")
    
# generate leaflet plot (doesn't even show white space if not stored in tagList)
    page <- htmltools::tagList(
         leaflet() %>%
            addTiles() %>%  # Add default OpenStreetMap map tiles
            addMarkers(lng=174.768, lat=-36.852, popup="The birthplace of R")
    )
    cat(as.character(page))
    }
```

【讨论】:

  • 感谢分享。我确实尝试过,不幸的是遇到了同样的白盒子。尽管在检查元素时“出现”,但它仍呈现为空白:i.imgur.com/EOp5w7H.png
  • 您是否在 init chunck 中运行了一次 leaflet() ?共享的示例适用于我的系统(Win 10/R 4.0.2)
  • StackOveflow 上的 Markdown 副本很棘手:我编辑了答案,因为反引号在第一次尝试时就消失了,应该会更好,
  • 我将您的代码复制到了一个新文档中,并且可以正常工作。然后我将代码部分粘贴到其中以确保它仍然有效,现在它可以了。我不知道您的代码的哪个方面解决了我的问题,也许它确实是 init 块中的传单()。非常感谢,我昨天花了大约 6 个小时来解决这个问题。
  • 我到Highcharter的链接错误,你可以在这里阅读说明
【解决方案2】:

我有一个类似的问题,通过将传单放入小部件框架中解决了。

l <- leaflet() %>% 
  addTiles() %>% 
  addMarkers(map_data$Longitude, map_data$Latitude)

widgetframe::frameWidget(l, width = "100%")

这具有保存 html 切片以用于渲染的效果。我很确定它只是将传单包装在 HMTL 标记中。

【讨论】:

  • 刚刚再次遇到这个问题,接受的答案适用于从 R Studio 本地渲染。但如果你是通过 Shiny Server 显示 Rmarkdown,则需要使用widgetframe 解决方案。
猜你喜欢
  • 2019-02-04
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
相关资源
最近更新 更多