gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:21:42 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com