2

假设

Roxygen2 使用启发式。如果句点前面的前缀已知(merge, cut),则该方法是 S3 方法,否则(slice),它是普通方法。

问题

这种启发式记录了吗?更重要的是,有没有办法避免它?我应该能够为函数名称编写任何未使用的标识符,而无需注意前缀,这也意味着未来将无法保证给定包的稳定性。我知道“S3 类没有正式定义”(下面引用的最后一个小插曲),但混淆有正式定义的内容似乎很荒谬。此外,任何将来为使用新包而对包进行的编辑都可能突然使现有 API 失效。

我试图通过NAMESPACE在生成文件后手动编辑文件来解决这个问题,但这有时会与包安装混淆(以我还不理解的方式)。以下实验是问题的设置。

实验

运行后devtools::create("MyPackage"),输入以下代码

#' @export
merge.apples <- function() {}

#' @export
merge.oranges <- function() {}

#' @export
cut.apples <- function() {}

#' @export
cut.oranges <- function() {}

#' @export
slice.apples <- function() {}

#' @export
slice.oranges <- function() {}

MyPackage/R/somefile.R.

现在运行devtools::document()(两次)。你会看到内容

# Generated by roxygen2: do not edit by hand

S3method(cut,apples)
S3method(cut,oranges)
S3method(merge,apples)
S3method(merge,oranges)
export(slice.apples)
export(slice.oranges)

已在文件中生成MyPackage/NAMESPACE。换言之,四个函数被假定为S3函数。

从页面

vignette("namespace", package = "roxygen2") 
vignette("roxygen2", package = "roxygen2") 
vignette("rd", package = "roxygen2") 

现在(大约从 2014 年开始?)#' @export在 S3 方法或普通方法之前编写就足够了,并且roxygen2会弄清楚它是什么。

4

0 回答 0