ggplot2自定义位置调整打包时出现`_inherit`需为ggproto对象错误
问题原因
这个报错的核心原因是打包过程中,你定义ggproto类时继承的Position父类没有被正确识别为ggplot2提供的ggproto对象,同时roxygen2注释的配置不符合ggproto类的导出规范,具体分为几个点:
- 定义ggproto时没有指定
Position的命名空间,R在包构建环境下找不到对应对象,误判为普通对象 - ggproto类的roxygen2注释没有和对外调用的函数关联,单独生成文档时触发类型校验错误
- 缺失必要的依赖声明,部分被调用的函数没有正确关联来源
解决步骤
1. 修正所有命名空间引用
所有ggproto定义时的父类、调用的ggplot2内部函数都补全命名空间前缀:
# 父类补全ggplot2::前缀 PositionSpread <- ggproto("PositionSpread", ggplot2::Position, # 内部用到的函数也补全前缀,比如 sep = self$sep %||% (ggplot2::resolution(data$x, zero = FALSE) * .05), # 其余的has_flipped_aes、flip_data、transform_position等都统一加ggplot2::前缀 )
同理PositionSpreaddodge定义时的父类也改成ggplot2::Position,内部所有ggplot2提供的函数都补全前缀。
2. 修正roxygen2注释配置
给ggproto类的注释加上@rdname标签,和对外的位置调整函数关联,避免单独生成类的文档:
#' 同时执行点的规避和均匀分布 #' #' 主要用于对齐`geom_point()`生成的点和已经做过规避的箱线图(比如设置了fill美学的`geom_boxplot()`)。 #' #' @family 位置调整函数 #' @param spread.width x方向的最大分布宽度,当点的总宽度超过该值时,点间距会被自动压缩 #' @param spread.sep 压缩前的点间距默认值 #' @param dodge.width x方向的规避宽度,默认值为0.75,和`position_dodge()`的默认宽度一致 #' @export position_spreaddodge <- function(spread.width = NULL, spread.sep = NULL, dodge.width = 0.75) { ggplot2::ggproto(NULL, PositionSpreaddodge, spread.width = spread.width, spread.sep = spread.sep, dodge.width = dodge.width ) } #' @rdname position_spreaddodge #' @format NULL #' @usage NULL #' @export # 如果不需要对外暴露这个类,可以删掉这行 PositionSpreaddodge <- ggproto("PositionSpreaddodge", ggplot2::Position, # 内部实现代码 )
同样的配置也应用到position_spread和对应的PositionSpread类上。
3. 补全依赖声明
修改DESCRIPTION文件,把依赖从Depends移动到Imports,同时补全你代码用到的所有第三方包:
Imports: ggplot2 (>= 3.0.0), dplyr, magrittr, vctrs
4. 重新生成文档
清理之前生成的旧文档文件,重新运行devtools::document()即可正常生成文档。
内容的提问来源于stack exchange,提问作者Melissa Key
相关产品推荐
相关产品推荐

