R中的传单:根据因子变量

时间:2016-12-16 21:05:28

标签: r leaflet

我想根据数据框中的因子变量在R中的传单图中使用不同的图标。因子变量可能有100个不同的级别,但我只有几个级别的图标,可能是10个左右。如果有图标我想使用它,否则绘制CircleMarkers。

我可以使用for循环执行此操作:

library(leaflet)

# Some icons
fruits_icons <- iconList(
  apple = makeIcon("apple.png", iconWidth = 20, iconHeight = 20),
  banana = makeIcon("banana.png", iconWidth = 20, iconHeight = 20)
)

# Some data
latitude <- 48 + runif(20)
longitude <- 10 + runif(20)
fruit <- sample(c("banana", "apple", "pear"), 20, replace = TRUE)
df <- data.frame(latitude, longitude, fruit)

map <- leaflet(df) %>% addTiles()

# check if fruit is in names(icons), then use icons, else circles
for(i in seq_len(nrow(df))){
  if(df$fruit[i] %in% names(fruits_icons)){
    map <- map %>% addMarkers(lng = df$longitude[i], 
                              lat = df$latitude[i], 
                              icon = ~fruits_icons[df$fruit[i]])
  } else {
    map <- map %>% addCircleMarkers(lng = df$longitude[i], 
                                    lat = df$latitude[i])
  }
}

map

如果没有for循环,有没有更好的方法呢?

1 个答案:

答案 0 :(得分:3)

您可以将要在每个add*()方法

中使用的数据进行子集化
leaflet() %>% addTiles() %>%
  addMarkers(data = df[df$fruit %in% names(fruits_icons),], 
             lng = ~longitude, 
             lat = ~latitude, 
             icon = ~fruits_icons[fruit]) %>%
  addCircleMarkers(data = df[!df$fruit %in% names(fruits_icons), ],
                   lng = ~longitude,
                   lat = ~latitude)