所以我正在开发一个使用 S3 类的 R 包,如果我可以使用sample
作为我的一门课的方法。然而,base
已经声明了sample
作为一个非S3功能,所以我想知道的是:
重新定义非S3是不是不好的风格base
函数如sample
作为 S3 功能?这会给我的包的用户带来麻烦吗?
一种你可以重新定义的方式sample
并且仍然保留base
功能工作是:
sample.default <- base::sample
sample <- function(x, ...) {
UseMethod("sample")
}
# This allows me to define a new sample method for my_special_class
sample.my_special_class <- function(...) {...}
但我不确定这是否会导致任何麻烦或命名空间问题,例如在加载其他包时。我还注意到没有多少包重新定义sample
,例如 dplyr 使用sample_n
和 igraph 使用sample_
,我想这可能有一些原因......
“风格”是否不好主要取决于观点。但是编写 R 扩展,第 7.1 节 - 添加新的泛型告诉您如何添加新的泛型来掩盖基本基本/推荐函数。也就是说,您提出的解决方案在该部分中被明确警告:
...包可以接管基础包中的功能并通过类似的方法使其通用
foo <- function(object, ...) UseMethod("foo")
foo.default <- function(object, ...) base::foo(object)
本手册的早期版本建议分配foo.default <- base::foo
。这不是一个好主意,因为它在安装时捕获了基本功能,并且可能会随着 R 的修补或更新而更改。
其他人可能遇到的一个问题是另一个包是否也注册了summary
作为通用。然后,根据您的包或其他包需要决定使用哪个泛型来注册其方法。
没有多少包重新定义sample
因为屏蔽基本/推荐函数通常不是一个好主意。这使得用户有可能根据您的包是否加载而在顶层获得不同的行为。
您肯定要避免的一件事是在基本/推荐(或高度使用)包中屏蔽泛型。这样做会阻止顶层的方法分派,从而给希望泛型工作的用户带来麻烦(例如dplyr::lag
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)