问:在 rmarkdown html 的 for 循环中创建传单映射
Q: Create leaflet map in for loop in rmarkdown html
我正在尝试在 rmarkdown 文件中创建带有 for 循环的传单地图。
这是一个最小的例子:
---
title: "Test"
output: html_document
---
```{r quakes, echo=F}
data(quakes)
library(leaflet)
for (i in c(10:20))
{
leaflet(data = quakes[1:5 & quakes$stations == i,]) %>% addTiles() %>%
addMarkers(~long, ~lat, popup = ~as.character(mag))
}
```
这段代码没有得到任何输出。当 运行 单独的传单命令(并用整数替换 i
时)它起作用。我也试过 print 命令,但也没用。
知道我该怎么做吗?
您可以使用 tagList
来自 htmltools
:
library(htmltools)
maps <- lapply(c(unique(quakes$stations)),function(x){
leaflet(data = quakes[1:5 & quakes$stations == x,]) %>% addTiles() %>%
addMarkers(~long, ~lat, popup = ~as.character(mag))
})
tagList(maps)
它需要一个列表作为参数,所以我将你的 for
循环更改为 lapply
。
你把它复杂化了一点。
看到你必须创建一个传单并通过从独特的站点选择经度和纬度来在上面应用标记。
但在这里您正在循环创建传单。并且还在循环中添加图块,这是主要问题。
现在您可以在循环之外创建传单和 addTiles,在循环中添加标记,但您实际上根本不需要 for 循环并一次性添加所有标记。
首先,Select 独特站点的数据集
distinct_by_stations<-distinct(quakes,stations) #dplyr is needed for 'distinct'
使用上述筛选数据集作为数据创建传单并添加标记
leaflet(data = distinct_by_stations) %>% addTiles() %>% addMarkers(~long,~lat,popup=~as.character(mag))
在 rpubs
查看有效的 .rmd
http://rpubs.com/dhawalkapil/quakesdata
工作 R 块
```{r quakes, echo=T}
data(quakes)
library(leaflet)
library(dplyr)
distinct_by_stations<-distinct(quakes,stations)
leaflet(data = distinct_by_stations) %>% addTiles() %>% addMarkers(~long,~lat,popup=~as.character(mag))
```
有多个地图
让我们在年份上添加一列。然后我们将不得不使用 htmltools::tagList
正如@NicE 所解释的那样。在 'year' 上拆分并使用 lapply
```{r quakes, echo=T,results='asis'}
data(quakes)
library(leaflet)
library(dplyr)
library(htmltools)
##Add A Random Year Column
quakes$year=sample(2006:2015,length(quakes),replace=TRUE)
createMaps<-function(x){
distinct_by_stations<-distinct(x,stations)
lflt<-leaflet(data = distinct_by_stations) %>% addTiles() %>% addMarkers(~long,~lat,popup=~as.character(mag))
}
htmltools::tagList(lapply(split(quakes,quakes$year),function(x){createMaps(x)}))
```
请参阅上述 url 中的更新 rpub。
我正在尝试在 rmarkdown 文件中创建带有 for 循环的传单地图。
这是一个最小的例子:
---
title: "Test"
output: html_document
---
```{r quakes, echo=F}
data(quakes)
library(leaflet)
for (i in c(10:20))
{
leaflet(data = quakes[1:5 & quakes$stations == i,]) %>% addTiles() %>%
addMarkers(~long, ~lat, popup = ~as.character(mag))
}
```
这段代码没有得到任何输出。当 运行 单独的传单命令(并用整数替换 i
时)它起作用。我也试过 print 命令,但也没用。
知道我该怎么做吗?
您可以使用 tagList
来自 htmltools
:
library(htmltools)
maps <- lapply(c(unique(quakes$stations)),function(x){
leaflet(data = quakes[1:5 & quakes$stations == x,]) %>% addTiles() %>%
addMarkers(~long, ~lat, popup = ~as.character(mag))
})
tagList(maps)
它需要一个列表作为参数,所以我将你的 for
循环更改为 lapply
。
你把它复杂化了一点。
看到你必须创建一个传单并通过从独特的站点选择经度和纬度来在上面应用标记。
但在这里您正在循环创建传单。并且还在循环中添加图块,这是主要问题。
现在您可以在循环之外创建传单和 addTiles,在循环中添加标记,但您实际上根本不需要 for 循环并一次性添加所有标记。
首先,Select 独特站点的数据集
distinct_by_stations<-distinct(quakes,stations) #dplyr is needed for 'distinct'
使用上述筛选数据集作为数据创建传单并添加标记
leaflet(data = distinct_by_stations) %>% addTiles() %>% addMarkers(~long,~lat,popup=~as.character(mag))
在 rpubs
查看有效的 .rmdhttp://rpubs.com/dhawalkapil/quakesdata
工作 R 块
```{r quakes, echo=T}
data(quakes)
library(leaflet)
library(dplyr)
distinct_by_stations<-distinct(quakes,stations)
leaflet(data = distinct_by_stations) %>% addTiles() %>% addMarkers(~long,~lat,popup=~as.character(mag))
```
有多个地图
让我们在年份上添加一列。然后我们将不得不使用 htmltools::tagList
正如@NicE 所解释的那样。在 'year' 上拆分并使用 lapply
```{r quakes, echo=T,results='asis'}
data(quakes)
library(leaflet)
library(dplyr)
library(htmltools)
##Add A Random Year Column
quakes$year=sample(2006:2015,length(quakes),replace=TRUE)
createMaps<-function(x){
distinct_by_stations<-distinct(x,stations)
lflt<-leaflet(data = distinct_by_stations) %>% addTiles() %>% addMarkers(~long,~lat,popup=~as.character(mag))
}
htmltools::tagList(lapply(split(quakes,quakes$year),function(x){createMaps(x)}))
```
请参阅上述 url 中的更新 rpub。