TL;DR 版本:
为什么基本 R 方法的导出方式与 Roxygen2
的方式不同?作者建议您导出自己的方法?
进一步说明:
这是对可以找到的帖子的跟进问题 here和 here .与其用很多问题来轰炸 Hadley,我认为最好问一下社区。p>
我试图更好地理解 S3method 导出的行为,因为基本 R 方法的导出方式与 Roxygen2
的导出方式之间似乎存在不一致。作者建议将它们导出。
例如,在 stats
中包裹在plot.ts
和 plot.stepfun
方法等。您也可以edit()
或 fix()
这些。然而,使用推荐的工作方式 Roxygen2
建议你@export
所有泛型和方法(哈德利的回答 here )。
那么,假设我们有一个 my_class
类的对象我们希望创建一个适用于此类的绘图函数,plot.my_class
.我们可以创建 Roxygen2
文档如下:
#' plot.my_class title
#'
#' @param x An object of class 'my_class'.
#'
#' @export
plot.my_class <- function (x, ...) # some magic
这会生成 NAMESPACE
入口
S3method(plot,my_class)
现在,当我安装包时,我将看不到方法 plot.my_class
当我使用 ls()
在我的包裹位置 search()
,我也不能 edit()
或 fix()
它(我可以使用 getAnywhere()
)。显然,这与基本 R 函数的行为不同,因为我可以 edit(plot.ts)
并看到它列在 stats
中包命名空间。我能看到解决这个问题的唯一方法是显式 @export plot.my_class
在我的 Roxygen2
文档,例如
#' plot.my_class title
#'
#' @param x An object of class 'my_class'.
#'
#' @export plot.my_class
plot.my_class <- function (x, ...) # some magic
生成 - 明显错误 - NAMESPACE
入口
export(plot.my_class)
Hadley 说使用 edit()
或 fix()
是个坏主意。我理解其中的一些原因(也许有人可以扩展一下?)但它们对于调试目的很有用,因为我正在使用的功能非常复杂。
总而言之,为什么 base R 的方法可见而我自己的方法不可见?
最佳答案
我怀疑基础 R 包中存在许多其他不一致的原因是相同的:它是一个经过多年发展的有机系统,许多方面都非常陈旧并保持与 S 语言的兼容性。
roxygen2 和其他软件包推荐的许多指南都源于多年使用 R 的经验。
如果今天从头开始重写基础 R 包而不考虑向后兼容性,它们看起来会非常不同。
如果您发现自己需要edit
和/或fix
来处理其他人的包,那么这表明这些包存在一些应该解决的主要问题。通常你不需要这样做——这就是为什么 fix
不是一个好主意的部分原因:它是潜在问题的征兆。
事实上,即使使用 Hadley 推荐的导出包泛型的模式,仍然可以(尽管更难)破解包的非导出方法。
关于r - 从 NAMESPACE 访问 S3methods 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32946779/