R包二元运算符roxygen2文档含示例触发警告/错误问题排查
R包自定义二元运算符roxygen2文档示例问题排查
问题描述
在R包中添加自定义二元运算符%nin%并编写roxygen2文档时,出现以下异常:
- 不添加示例时,文档生成完全正常
- 使用
@example标签会触发包检查警告 - 使用
@examples标签直接导致包检查失败
测试代码
无示例(正常运行)
#' @title #' 反向值匹配 #' #' @description #' \code{%in%}的补集,返回\code{x}中不在\code{y}里的元素。 #' #' @usage x \%nin\% y #' #' @param x 向量 #' @param y 向量 #' #' @export #' @rdname nin #' #' @export # ----------------------------------------------------------------------------- "%nin%" <- function(x, y) { return( !(x %in% y) ) } # -----------------------------------------------------------------------------
使用@example(触发警告)
#' @title #' 反向值匹配 #' #' @description #' \code{%in%}的补集,返回\code{x}中不在\code{y}里的元素。 #' #' @usage x \%nin\% y #' #' @param x 向量 #' @param y 向量 #' #' @export #' @rdname nin #' #' @export #' @example c(1:3) \%nin\% c(3:5) # ----------------------------------------------------------------------------- "%nin%" <- function(x, y) { return( !(x %in% y) ) } # -----------------------------------------------------------------------------
使用@examples(检查失败)
#' @title #' 反向值匹配 #' #' @description #' \code{%in%}的补集,返回\code{x}中不在\code{y}里的元素。 #' #' @usage x \%nin\% y #' #' @param x 向量 #' @param y 向量 #' #' @export #' @rdname nin #' #' @export #' @examples #' c(1:3) \%nin\% c(3:5) # ----------------------------------------------------------------------------- "%nin%" <- function(x, y) { return( !(x %in% y) ) } # -----------------------------------------------------------------------------
问题根源
@example标签的警告原因:@example的语法要求后面跟示例文件的路径,而非直接写内联代码。你直接把示例代码写在@example后面,roxygen2会误认为这是一个文件名,找不到对应文件就会触发警告。@examples标签的检查失败原因:包检查时会优先解析示例代码,此时自定义运算符%nin%还未被正确加载到执行上下文,R解析器无法识别这个特殊符号;同时未用反引号包裹运算符,也会让解析器难以正确识别这是一个函数,最终导致检查失败。
解决方案
1. 正确使用@examples并包裹运算符
在@examples块中,用反引号包裹自定义运算符,让R解析器能正确识别,同时移除重复的@export标签:
#' @title #' 反向值匹配 #' #' @description #' \code{%in%}的补集,返回\code{x}中不在\code{y}里的元素。 #' #' @usage x \%nin\% y #' #' @param x 向量 #' @param y 向量 #' #' @export #' @rdname nin #' @examples #' # 用反引号包裹运算符,确保解析正确 #' c(1:3) `%nin%` c(3:5) #' # 验证结果正确性 #' all(c(1:3) `%nin%` c(3:5) == c(TRUE, TRUE, FALSE)) # ----------------------------------------------------------------------------- "%nin%" <- function(x, y) { !(x %in% y) } # -----------------------------------------------------------------------------
2. 额外注意事项
- 一个运算符只需要一次
@export标签,重复添加无意义。 - 示例中可以加入结果验证代码,既保证示例可运行,也能辅助包检查环节确认功能正确性。
内容的提问来源于stack exchange,提问作者G4lActus
相关产品推荐
相关产品推荐

