【发布时间】:2020-12-28 02:47:09
【问题描述】:
我在 R 包中有一个类 myclass,我想为其定义一个方法 as.raw,因此与原始函数 as.raw() 同名。如果构造函数、泛型和方法定义如下...
new_obj <- function(n) structure(n, class = "myclass") # constructor
as.raw <- function(obj) UseMethod("as.raw") # generic
as.raw.myclass <- function(obj) obj + 1 # method (dummy example here)
...然后R CMD check 导致:
Warning: declared S3 method 'as.raw.myclass' not found
See section ‘Generic functions and methods’ in the ‘Writing R
Extensions’ manual.
如果泛型是as_raw 而不是as.raw,那么没有问题,所以我假设这是因为原始函数as.raw 已经存在。是否可以通过将as.raw 定义为泛型来“重载”as.raw(或者是否需要使用不同的名称?)?
更新:NAMESPACE 包含
export("as.raw") # export the generic
S3method("as.raw", "myclass") # export the method
This 似乎有些相关,但dimnames 有一个泛型,所以有一个解决方案(只是不要定义你自己的泛型),而上面不清楚(对我来说)解决方案是什么。
【问题讨论】:
-
此问题可能重复:stackoverflow.com/questions/59056308/… 或 stackoverflow.com/questions/42986174/…。您需要隐藏基本函数,因为它不是通用的。
-
谢谢,这很有趣。我尝试了两个版本,首先是
setGeneric("as.raw"),然后按照您发布的链接中的建议定义as.raw.default <- function(x) base::as.raw(x)。我仍然收到同样的警告。会不会是 R 对as.raw.myclass中的两个点感到困惑,因此找不到方法? -
你是在导出这些函数吗?您的 NAMESPACE 文件是什么样的?这两个点应该无关紧要。
-
我更新了帖子以显示
NAMESPACE包含的内容。 -
如果我也像您发布的第二个链接那样通过
S3method("as.raw", "default")导出默认方法,我会收到两次警告,一次是as.raw.myclass,一次是as.raw.default。