R语言如何将leaflet::addMarkers的参数存为对象后传入调用
R语言leaflet包addMarkers参数打包复用解决方案
错误原因
你遇到的两个问题根源如下:
- 定义参数列表时将参数写为了字符串,R无法将字符串解析为有效参数赋值,即使不用管道也无法正常识别参数
- 管道符默认会将左侧输出作为下一个函数的第一个入参,你直接在管道后写
do.call(leaflet::addMarkers,flowStations)时,实际入参顺序变成了do.call(地图对象, leaflet::addMarkers, flowStations),不符合do.call(函数名, 参数列表)的语法要求,因此报second argument must be a list错误。
正确实现方式
方法1:do.call配合参数列表(符合你原本的实现思路)
首先正确定义参数列表,列表的键对应addMarkers的参数名,值为实际参数对象:
flowStations_params <- list( data = flow_stations, label = flow_stations$Station )
管道调用时需要将管道传递的leaflet地图对象作为addMarkers的第一个参数map,合并到参数列表中:
map_basic <- leaflet::leaflet() %>% do.call( what = leaflet::addMarkers, args = c(list(map = .), flowStations_params) )
方法2:封装自定义函数(更适合重复调用)
如果需要频繁添加同类标记,直接封装函数调用更简洁:
# 封装自定义标记添加函数 add_flow_stations <- function(map) { leaflet::addMarkers( map = map, data = flow_stations, label = flow_stations$Station ) } # 直接插入管道调用即可 map_basic <- leaflet::leaflet() %>% addTiles() %>% # 可叠加其他地图操作 add_flow_stations()
完整可运行示例
library(leaflet) library(sf) library(dplyr) # 构造站点数据,注意经纬度不要存为字符串,使用数值型 Station <- c("Station 1","Station 2") Lat <- c(45.11373, 45.07123) Long <- c(-121.8151, -121.9406) flow_stations <- data.frame(Station, Lat, Long) %>% st_as_sf(coords = c("Long","Lat"), crs = st_crs("EPSG:4326")) # 方法1调用 flowStations_params <- list( data = flow_stations, label = flow_stations$Station ) map_basic1 <- leaflet() %>% do.call(what = addMarkers, args = c(list(map = .), flowStations_params)) # 方法2调用 add_flow_stations <- function(map) { addMarkers(map = map, data = flow_stations, label = flow_stations$Station) } map_basic2 <- leaflet() %>% addTiles() %>% add_flow_stations()
内容的提问来源于stack exchange,提问作者Angel
相关产品推荐
相关产品推荐

