gpt4 book ai didi

r - 如何定义与原始函数同名的 S3 泛型?

转载 作者:行者123 更新时间:2023-12-05 04:55:15 25 4
gpt4 key购买 nike

我在 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 检查 导致:

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(或者是否需要使用不同的名称?)?

更新:NAMESPACE 包含

export("as.raw") # export the generic
S3method("as.raw", "myclass") # export the method

This似乎有些相关,但是 dimnames 有一个通用的,所以有一个解决方案(只是不要定义您自己的通用),而上面(对我来说)不清楚解决方案是什么。

最佳答案

这里的问题似乎是 as.raw是原始函数 ( is.primitive(as.raw) )。来自?setGeneric帮助页面,它说

A number of the basic R functions are specially implemented as primitive functions, to be evaluated directly in the underlying C code rather than by evaluating an R language definition. Most have implicit generics (see implicitGeneric), and become generic as soon as methods (including group methods) are defined on them.

并且根据?InternalMethods帮助页面,as.raw是这些原始泛型之一。所以在这种情况下,您只需要导出 S3 方法即可。并且您想确保您的函数签名与现有原始函数的签名相匹配。

所以如果我有以下 R 代码

new_obj <- function(n) structure(n, class = "myclass")
as.raw.myclass <- function(x) x + 1

和一个 NAMESPACE 文件

S3method(as.raw,myclass)
export(new_obj)

然后这为我通过了包检查(在 R 4.0.2 上)。我可以运行代码

as.raw(new_obj(4))
# [1] 5
# attr(,"class")
# [1] "myclass"

因此在这种特殊情况下,您需要保留 as.raw <- function(obj) UseMethod("as.raw")分开。

关于r - 如何定义与原始函数同名的 S3 泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65472475/

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