使用roxygen2 v4导出名称中带点的非S3方法

Ric*_*ton 18 r roxygen2

roxygen2版本开始4.0.0,@S3method标签已被弃用,有利于使用@export.

程序包现在尝试检测函数是否为S3方法,如果认为它是一个,则自动将该行添加S3method(function,class)NAMESPACE文件中.

问题是,如果一个函数不是一个S3方法,但它的名字包含一个.然后roxygen有时会出错,并在不应该的时候添加该行.

有没有办法告诉roxygen函数不是S3方法?


根据要求,这是一个可重复的例子.

我有一个导入的包R.oo,其中包含一个名为的函数check.arg.

library(roxygen2)
package.skeleton("test")
cat("Imports: R.oo\n", file = "test/DESCRIPTION", append = TRUE)
writeLines(
  "#' Check an argument 
#' 
#' Checks an argument.
#' @param ... Some arguments.
#' @return A value.
#' @export
check.arg <- function(...) 0",
  "test/R/check.arg.R"
)
roxygenise("test")
Run Code Online (Sandbox Code Playgroud)

现在命名空间包含该行S3method(check,arg).

check是一个S3泛型R.oo,所以roxygen试图聪明,并猜测我想check.arg成为一个S3方法.不幸的是,这些功能是无关的,所以我没有.

(为了抢占我刚刚重命名的建议check.arg:这是其他人编写的遗留代码,我已经创建了一个checkArg替代品,但我需要将其check.arg作为兼容性的弃用函数保留.)

Ric*_*ton 17

正如Flick先生评论的那样,将完整的函数名称附加到roxygen线上可以正常工作.如果我将行更改为:

#' @export check.arg
Run Code Online (Sandbox Code Playgroud)

然后该NAMESPACE文件包含:

export(check.arg)
Run Code Online (Sandbox Code Playgroud)

  • **请注意**以上解决方案将为您在"NAMESPACE"文件中输入正确的内容.但是,为了正确地记录函数*,你还需要添加一个`@ usage`标签,否则消息`## S3方法的类'arg'`将出现在你的函数签名的正上方`. Rd`文件和帮助文件中的签名将是`check(...)`而不是`check.arg(...)`. (5认同)
  • 另一个需要注意的问题是用法语句,除非你修复它,否则会说'## S3方法为类'检查'\n check(...)`.一种方法是只添加一个`##'@ usage check.arg(x)`指令,不确定是否有更好的方法. (4认同)