假设
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
会弄清楚它是什么。