Leaflet地图添加交互式滑块失败及保存报错问题求助
问题:Crosstalk交互式滑块不显示且无法保存地图
问题重现
按照Crosstalk官方教程运行以下代码:
library(crosstalk) library(leaflet) library(DT) # 将数据框包装为SharedData对象 sd <- SharedData$new(quakes[sample(nrow(quakes), 100),]) # 创建筛选滑块 filter_slider("mag", "Magnitude", sd, column=~mag, step=0.1, width=250) # 使用SharedData创建联动组件 map = bscols( leaflet(sd) %>% addTiles() %>% addMarkers(), datatable(sd, extensions="Scroller", style="bootstrap", class="compact", width="100%", options=list(deferRender=TRUE, scrollY=300, scroller=TRUE)) )
出现两个问题:
- 地图可正常渲染,但交互式滑块(Magnitude)未显示(滑块区域为空白)
- 执行保存代码时报错:
library(htmlwidgets) saveWidget(map, "map.html", selfcontained = F, libdir = "lib")
错误信息:
Error in .getNamespace(pkg) : invalid type/length (symbol/0) in vector allocation
已知滑块可能需要额外插件,但不清楚操作方法,寻求解决方案。
Session信息
R version 4.1.3 (2022-03-10) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows 10 x64 (build 22000) Matrix products: default attached base packages: 1 stats graphics grDevices utils datasets methods base other attached packages: 1 DT_0.23 leaflet_2.1.1 crosstalk_1.2.0 loaded via a namespace (and not attached): 1 jquerylib_0.1.4 pillar_1.7.0 compiler_4.1.3 bslib_0.3.1 tools_4.1.3 digest_0.6.29 lubridate_1.8.0 [8] jsonlite_1.8.0 lifecycle_1.0.1 tibble_3.1.6 pkgconfig_2.0.3 rlang_1.0.2 cli_3.3.0 DBI_1.1.2 [15] yaml_2.3.5 xfun_0.30 fastmap_1.1.0 dplyr_1.0.9 stringr_1.4.0 generics_0.1.3 vctrs_0.4.1 [22] htmlwidgets_1.5.4 sass_0.4.1 hms_1.1.1 tidyselect_1.1.2 glue_1.6.2 R6_2.5.1 fansi_1.0.3 [29] purrr_0.3.4 tidyr_1.2.0 readr_2.1.2 tzdb_0.3.0 magrittr_2.0.2 ellipsis_0.3.2 htmltools_0.5.2 [36] assertthat_0.2.1 utf8_1.2.2 tinytex_0.40 stringi_1.7.6 lazyeval_0.2.2 crayon_1.5.1
解决方案
1. 修复滑块不显示问题
滑块未显示的核心原因是没有将filter_slider的输出纳入bscols的布局体系。原代码单独调用了filter_slider(),但未将其加入最终的map对象中。修改代码如下:
library(crosstalk) library(leaflet) library(DT) sd <- SharedData$new(quakes[sample(nrow(quakes), 100),]) # 将滑块、地图、表格统一放入bscols布局 map = bscols( filter_slider("mag", "Magnitude", sd, column=~mag, step=0.1, width=250), leaflet(sd) %>% addTiles() %>% addMarkers(), datatable(sd, extensions="Scroller", style="bootstrap", class="compact", width="100%", options=list(deferRender=TRUE, scrollY=300, scroller=TRUE)) )
修改后滑块会和地图、表格一同渲染,实现数据联动效果。
2. 修复保存地图报错问题
报错原因是bscols返回的是htmltools的标签对象,而saveWidget仅支持保存htmlwidget对象。需使用htmltools::save_html()替代:
library(htmltools) # 非自包含模式,依赖文件存放在lib目录 save_html(map, "map.html", libdir = "lib") # 若需要自包含的单HTML文件 save_html(map, "map.html", self_contained = TRUE)
另外,可更新相关依赖包到最新稳定版,避免版本兼容问题:
update.packages(c("crosstalk", "htmlwidgets", "htmltools", "leaflet", "DT"))
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

