![](/img/trans.png)
[英]How to add multiple polygons and layers in leaflet with a for loop?
[英]For loop for multiple polygons in leafletproxy?
我正在波士頓對鄰居多邊形進行中途停留的可視化。 這是一個按比例縮小的工作代碼:
library(shiny)
library(leaflet)
library(plyr)
library(dplyr)
library(rgdal)
#setwd
setwd("C:/Users/580048/Downloads")
#read hubway station data
hubway <- read.csv("Hubway_Stations.csv")
#read shapefiles
neighborhoods <-readOGR("C:/Users/580048/Downloads/bosneigh/Bos_neighborhoods_new.shp","Bos_neighborhoods_new")
neighborhoods <- spTransform(neighborhoods, CRS("+proj=longlat +datum=WGS84"))
#ui layout
ui <- bootstrapPage(
#style of tags
tags$style(type = "text/css", "html, body {width:100%;height:100%}"),
tags$style(type = "text/css", 'label[for="range"] {color: white;}'),
tags$style(type = "text/css", 'label[for="range2"] {color: white;}'),
tags$style(type = "text/css", 'label[for="team"] {color: white;}'),
tags$style(type = "text/css", 'label[for="away"] {color: white;}'),
tags$style(type = "text/css", 'label {color: white;}'),
#the map
leafletOutput("bosmap", width = "100%", height = "100%")
)
#server functions
server <- function(input, output, session) {
#plot static map
output$bosmap <- renderLeaflet({
leaflet(randomtaxi) %>%
addProviderTiles("CartoDB.DarkMatterNoLabels",
options= providerTileOptions(opacity = 0.99)) %>%
fitBounds(-71.0, 42.3, -71.1, 42.4)
})
#plot filtered cabs
observe({
longMark <- -71.0589
latMark <- 42.3601
poppy <- "Boston"
hotBorough <- subset(neighborhoods, neighborhoods$Name %in% c("Allston"))
totalBorough <- subset(neighborhoods, neighborhoods$Name %in% c("Back Bay"))
leafletProxy("bosmap", data = hubway) %>%
clearShapes() %>% clearMarkers %>% clearPopups() %>%
addPolygons(data = subset(neighborhoods, neighborhoods$Name %in% c(toString(neighborhoods$Name[1]))),
stroke = FALSE,
color = "red",
smoothFactor = 0.5,
fillOpacity = 0.3,
popup = toString(neighborhoods$Name[1])) %>%
addPopups(longMark, latMark, poppy,
options = popupOptions(closeButton = FALSE)
) %>%
addCircles(~hubway$long_,
~hubway$lat,
radius = 200,
weight = 20,
stroke = FALSE, fillOpacity = 0.5)
})
}
shinyApp(ui, server)
我想要做的是在leaftletproxy()中創建一個for循環來循環並為波士頓的26個鄰域創建個體多邊形 - 如下所示:
leafletProxy("bosmap", data = hubway) %>%
clearShapes() %>% clearMarkers %>% clearPopups() %>%
for(i in 1:26){
addPolygons(data = subset(neighborhoods, neighborhoods$Name %in% c(toString(neighborhoods$Name[i]))),
stroke = FALSE,
color = "red",
smoothFactor = 0.5,
fillOpacity = 0.3,
popup = toString(neighborhoods$Name[i])) %>%
}
addPopups(longMark, latMark, poppy,
options = popupOptions(closeButton = FALSE)
) %>% ...(and so on)
但由於某種原因,leafletProxy()似乎不喜歡在其中放置for循環 - 是否有更簡單的方法來繪制一些不同的多邊形,我可以附加不同的彈出窗口,顏色和值?
Bos社區文件在這里: https : //data.cityofboston.gov/City-Services/Boston-Neighborhood-Shapefiles/af56-j7tb
樞紐站: http ://bostonopendata.boston.opendata.arcgis.com/datasets/ee7474e2a0aa45cbbdfe0b747a5eb032_4
我同意@warmoverflow是%>% for(){}
是不使用正確的方法%>%
用for
。 在一般情況下,我不認為使用for
在管道中真的是很好的做法,但這里是你有什么建議的模式。
library(magrittr)
"test" %>%
{
for(i in 1:26){
. <- paste0(.,i)
}
return(.)
}
所以在你的例子中,你可以這樣做,但我稍后會提出一個“更好”的方法。
leafletProxy("bosmap", data = hubway) %>%
clearShapes() %>% clearMarkers %>% clearPopups() %>%
{
for(i in 1:26){
. <- addPolygons(.,data = subset(neighborhoods, neighborhoods$Name %in% c(toString(neighborhoods$Name[i]))),
stroke = FALSE,
color = "red",
smoothFactor = 0.5,
fillOpacity = 0.3,
popup = toString(neighborhoods$Name[i])
)
}
return(.)
} %>%
addPopups(longMark, latMark, poppy,
options = popupOptions(closeButton = FALSE)
) %>% ...(and so on)
我認為這是一種更好的處理方式。
leafletProxy("bosmap", data = hubway) %>%
clearShapes() %>% clearMarkers %>% clearPopups() %>%
addPolygons(
data = neighborhoods[1:26,],
stroke = FALSE,
color = "red",
smoothFactor = 0.5,
fillOpacity = 0.3,
popup = ~Name
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.