22

我正在创建一个包,对于 S3 方法,我使用它们导出它们

##' @method predict myclass
##' @export
predict.myclass <- function(object,...) { }

现在当我加载包时,然后predict在类的对象上工作myclass,但函数predict.myclass没有被导出。在 NAMESPACE 中,我只得到 entry S3method(predict,myclass)。那么有没有办法导出predict.myclass,这样用户就可以得到predict.myclass他(她)predict.myclass在控制台中写入的代码?

4

4 回答 4

14

如果您想在您的 中以自动方式同时包含 anS3methodexport指令,您可以简单地添加一个更明确的额外标签。NAMESPACEroxygen2@export

为了说明,我创建了一个虚拟包,exportTest. 这个包在R/子目录中只有一个文件,print.foo.R

#' Print method for "foo" class
#'
#' @param x An object of class "foo"
#' @param ... Other arguments passed to or from other methods
#'
#' @export print.foo
#' @export
print.foo <- function(x, ...) {
    cat("This is just a dummy function.\n")
}

ing后document(),我有以下内容NAMESPACE

# Generated by roxygen2: do not edit by hand

S3method(print,foo)
export(print.foo)

我从Hadley 关于导出名称中带有 a 的非 S3 方法函数的建议中.得到了这个想法。如果你使用

#' @export function.name

它明确地使用提供的export()指令function.name。然后我测试了你是否可以将它与更模糊的@export标签结合起来生成一个S3method()指令,瞧!有用。

但是,我会注意到,据我所知,在任何地方都没有记录能够肯定地做到这一点,因此有可能在某个时候停止工作,甚至可能没有警告。如果这是您想要确保存在和/或在某处记录的功能,我建议在他们的 GitHub 存储库中打开一个问题

于 2020-06-27T11:50:59.693 回答
12

我的回答是“不要那样做”。用户可以methods(predict); getAnywhere('predict.myclass')mypackage:::predict.myclass. 用户有一个学习曲线,但通过您的方法掌握这一点有助于用户浏览所有方法。不导出该方法的原因是它不打算直接调用,并且它用不必要的符号使搜索路径混乱(在提示符下键入的每个符号,例如,ls()必须通过查看返回的所有环境中的对象来找到bysearch()和像您这样的用户包介于这些常用功能的搜索开始和名称解析之间)。

于 2013-08-29T13:43:56.320 回答
3

只是对于那些迟到的人,在较新版本的 roxygen (=> 3.0) 中,@export标签将自动工作如何处理方法。

生成 Rd 文件小插图:

S3 泛型是常规函数,因此请照此记录。S3 类没有正式定义,因此请记录构造函数。您可以选择是否记录 S3 方法。您不需要为简单的泛型(如 print())记录方法。如果您的方法更复杂,您应该记录它,以便人们知道参数的作用。在基础 R 中,您可以找到更复杂方法的文档,例如 predict.lm()、predict.glm() 和 anova.glm()。

旧版本的 roxygen 需要所有 S3 方法的显式 @method 通用类标签。从 3.0.0 开始不再需要,因为 roxygen2 会自动计算出来。如果您正在升级,请确保删除这些旧标签。仅当泛型和类不明确时,自动方法检测才会失败。例如 all.equal.data.frame() 是 all 的 equal.data.frame 方法,还是 all.equal 的 data.frame 方法?如果发生这种情况,您可以使用(例如)@method all.equal data.frame 消除歧义。

于 2018-04-16T20:06:28.937 回答
2

我完全同意在某些情况下需要导入 S3 方法,并且我不知道有任何权威来源声称不建议这样做。甚至base包导出方法,如print.data.frame.

也就是说,除了手动修改 NAMESPACE 文件并添加该行之外,我还没有找到 roxygen2 的合理解决方案

export(print.myClass)

另一种方法是复制该功能:

 print_myClass <- function(x, ...) print.myClass(x, ...)

这两种解决方案都有缺点。前者有手动编辑 NAMESPACE 的明显缺点,后者引入了混乱。

于 2020-06-27T09:08:07.177 回答