r - 从 NAMESPACE 访问 S3methods 的正确方法

标签 r

TL;DR 版本:

为什么基本 R 方法的导出方式与 Roxygen2 的方式不同?作者建议您导出自己的方法?

进一步说明:

这是对可以找到的帖子的跟进问题 herehere .与其用很多问题来轰炸 Hadley,我认为最好问一下社区。

我试图更好地理解 S3method 导出的行为,因为基本 R 方法的导出方式与 Roxygen2 的导出方式之间似乎存在不一致。作者建议将它们导出。

例如,在 stats 中包裹在plot.tsplot.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/

相关文章:

mysql - 尝试使用 RODBC 将 R 连接到 MySQL 时出错

r - 翻转字符串的两侧

r - 在 R 中绘制棋盘

r - ggplot 在同一面板中组合线和区域(facet-grid)

r - 在 R 中执行常量插值

R正则表达式匹配已知字符以外的东西

r - 关于何时分解 R 中的列的好的经验法则是什么?

在不使用嵌套循环的情况下运行具有两个或多个变量的 for 循环

r - write.table(...,append=T) : Cannot open the connection

r - Vector,ggplot2不知道如何处理numeric类的数据