使用pkgdown推送含sf依赖的R包至GitHub Pages时遇GEOS版本错误
解决pkgdown部署GitHub Pages时的GEOS版本错误
你的问题核心是GitHub Pages默认构建环境中GEOS版本低于3.11,而本地环境满足依赖要求,因此本地预览和rcmdcheck::rcmdcheck均能通过,但pkgdown构建时触发vignette里的sf::st_concave_hull调用导致报错。以下是几个无需新增依赖或大量改动的可行方案:
方案1:跳过vignette中依赖高版本GEOS的代码块
在PACKAGE_VIGNETTE.Rmd里,针对使用st_concave_hull的代码块添加版本判断逻辑,让构建环境自动跳过不兼容的代码:
# 在目标代码块前先判断GEOS版本 geos_version <- sf::sf_extSoftVersion()["GEOS"] eval_cond <- package_version(geos_version) >= package_version("3.11")
然后将对应代码块的eval参数设置为eval_cond:
# ```{r, eval=eval_cond} sf::st_concave_hull(your_data, ...) # ```
这样pkgdown在低GEOS版本环境中会自动跳过这段代码,不会触发报错。
方案2:在GitHub Actions中升级GEOS版本
如果你的pkgdown部署通过GitHub Actions完成,直接在部署工作流文件(.github/workflows/pkgdown.yaml)中添加安装高版本GEOS的步骤:
steps: # 保留原有步骤(如checkout、setup R等) - name: Install GEOS >=3.11 run: | sudo add-apt-repository ppa:ubuntugis/ppa sudo apt-get update sudo apt-get install -y libgeos-dev # 后续的pkgdown构建步骤
这会让构建环境安装符合要求的GEOS版本,确保st_concave_hull能正常运行。
方案3:封装函数做版本兼容处理
无需新增依赖,直接在包代码里封装一个兼容版的凹包函数,自动适配不同GEOS版本:
#' 兼容不同GEOS版本的凹包函数 #' @param x sf对象 #' @param ... 传递给st_concave_hull或st_convex_hull的参数 #' @return 凹包或凸包对象 concave_hull_compat <- function(x, ...) { geos_ver <- package_version(sf::sf_extSoftVersion()["GEOS"]) if (geos_ver >= package_version("3.11")) { sf::st_concave_hull(x, ...) } else { message("当前GEOS版本低于3.11,使用凸包替代凹包") sf::st_convex_hull(x, ...) } }
然后在vignette中调用这个封装后的函数,构建时就不会因版本不足报错。
内容的提问来源于stack exchange,提问作者steppe
相关产品推荐
相关产品推荐

