假设
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年开始?)足以在S3方法或普通方法之前编写#' @export
,而roxygen2
将会确定它是哪个。