如何导出S3方法,以便在命名空间中可用?

mpi*_*tas 11 r devtools roxygen2

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

##' @method predict myclass
##' @export
predict.myclass <- function(object,...) { }
Run Code Online (Sandbox Code Playgroud)

现在当我加载包时,然后predict处理类的对象myclass,但predict.myclass不导出函数.在NAMESPACE我只能获得参赛作品S3method(predict,myclass).那么有没有一种方法可以导出predict.myclass,这样用户就可以获得predict.myclass他(她)predict.myclass在控制台中写入的代码?

duc*_*ayr 13

如果您希望以自动方式在您的S3methodexport指令中同时NAMESPACE使用roxygen2,您可以简单地添加一个@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")
}
Run Code Online (Sandbox Code Playgroud)

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

# Generated by roxygen2: do not edit by hand

S3method(print,foo)
export(print.foo)
Run Code Online (Sandbox Code Playgroud)

我从这个想法哈德利的意见上有出口非-S3-方法函数.的名称。如果你使用

# Generated by roxygen2: do not edit by hand

S3method(print,foo)
export(print.foo)
Run Code Online (Sandbox Code Playgroud)

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

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


Mar*_*gan 9

我的回答是"不要那样做".用户可以methods(predict); getAnywhere('predict.myclass')mypackage:::predict.myclass.用户有一个学习曲线,但使用您的方法掌握这一点有助于用户导航所有方法.不导出方法的原因是它不是直接调用的,它会使搜索路径混乱不必要的符号(在提示符下键入的每个符号,例如,ls()必须通过查看返回的所有环境中的对象来找到by search(),和像你这样的用户软件包位于搜索开始和这些常用函数的名称解析之间.

  • @January 我想我说过不推荐?;) `print.data.frame` 是在基础包中定义的,其中没有命名空间,因此没有不导出它的选项。 (3认同)
  • 你确定吗 ?[根据Hadley的说法](https://cran.r-project.org/web/packages/roxygen2/vignettes/namespace.html),*必须导出每个S3方法*.也许我误解了你的答案. (2认同)
  • @StéphaneLaurent的OP已经有了"S3method(predict,myclass)",这是必要且充分的; 也许这就是Hadley所说的"必须出口".对于`export(predict.myclass)`既没有必要也没有建议. (2认同)