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

23

自从 roxygen2 版本 4.0.0 开始,@S3method 标签已被弃用,建议使用 @export 代替。

现在该软件包会尝试检测函数是否为 S3 方法,并在认为是 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")

现在命名空间中包含一行S3method(check,arg)

check是在R.oo中的一个S3通用函数,因此roxygen试图聪明地猜测我想让check.arg成为一个S3方法。不幸的是,这些函数没有关系,所以我不需要这个。

(预先防止建议我只需重命名check.arg:这是由他人编写的遗留代码,我已创建了一个checkArg替代品,但我需要将 check.arg 作为过时的函数保留以保持兼容性。)


4
我认为你只需要使用@export和函数的完整名称即可。如果提供一个可复现的示例,将会有所帮助。 - MrFlick
@MrFlick 感谢您的解决方案,也感谢您提醒我不要懒惰。 - Richie Cotton
2个回答

23

正如Flick先生所评论的那样,在roxygen行中附加完整函数名是有效的。如果我将该行更改为:

#' @export check.arg

如果存在NAMESPACE文件,则其内容包含:

export(check.arg)

4
需要注意的另一个问题是使用说明,如果不加修正,它将显示“## S3 method for class 'check'\n check(...)”。一种方法是只需添加一个“##' @usage check.arg(x)”指示符,但不确定是否有更好的方法。 - Ken Williams
7
请注意,上述解决方案将为您在NAMESPACE文件中获取正确的条目。但是,要正确记录函数,您还需要添加一个@usage标记,否则在其.Rd文件中,在函数签名正上方会出现消息## S3 method for class 'arg',并且帮助文件中的签名将是check(...)而不是check.arg(...) - Jthorpe
1
@Jthorpe 很好的笔记(值得一份答案!)。R CMD check可能仍然会发出警告,例如*Found the following apparent S3 methods exported but not registered:*,您必须将函数重命名为成功提交到CRAN(他们不允许警告)。 - R Yoda

-1

2
这个问题不是关于如何记录S3方法的,而是关于记录不是S3方法的事物的相反问题(但roxygen认为它们是S3方法)。 - Richie Cotton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接