R包使用可选依赖ggrepel无法通过R CMD check的解决方法
解决R CMD check关于ggrepel依赖的警告问题
方法1:动态获取ggrepel对象,避免直接使用::
把代码中直接调用ggrepel::GeomTextRepel和ggrepel::GeomLabelRepel的部分,换成用utils::getFromNamespace动态获取对象,这样代码里不会出现明确的ggrepel::调用,同时保留仅在包安装时执行的逻辑:
#' Update font family for geom_text and geom_label #' @param family A valid font family name #' @importFrom ggplot2 update_geom_defaults #' @export #' update_geom_font <- function(family=""){ update_geom_defaults("text", list(family = family)) update_geom_defaults("label", list(family = family)) if (requireNamespace("ggrepel", quietly = TRUE)) { geom_text_repel <- utils::getFromNamespace("GeomTextRepel", "ggrepel") geom_label_repel <- utils::getFromNamespace("GeomLabelRepel", "ggrepel") update_geom_defaults(geom_text_repel, list(family = family)) update_geom_defaults(geom_label_repel, list(family = family)) } }
修改后,代码无直接的ggrepel::调用,可在不添加ggrepel依赖的情况下通过R CMD check的依赖检查。
方法2:用eval(parse(text=...))包裹ggrepel相关代码
通过动态解析代码的方式,让静态检查无法识别ggrepel::的调用,从而绕过警告:
#' Update font family for geom_text and geom_label #' @param family A valid font family name #' @importFrom ggplot2 update_geom_defaults #' @export #' update_geom_font <- function(family=""){ update_geom_defaults("text", list(family = family)) update_geom_defaults("label", list(family = family)) if (requireNamespace("ggrepel", quietly = TRUE)) { eval(parse(text = "update_geom_defaults(ggrepel::GeomTextRepel, list(family = family))")) eval(parse(text = "update_geom_defaults(ggrepel::GeomLabelRepel, list(family = family))")) } }
这种方式可读性稍差,属于“绕过”检查的取巧手段,不如方法1规范。
补充说明
从R包开发规范角度,可选依赖更推荐在DESCRIPTION的Suggests字段声明(添加Suggests: ggrepel),同时在帮助文档说明该功能需ggrepel支持。这种方式既不会强制用户安装ggrepel,又能合规消除警告,是更稳妥的选择。
内容的提问来源于stack exchange,提问作者mindlessgreen
相关产品推荐
相关产品推荐

