在自定义环境中定义通用函数

问题描述 投票:0回答:2

过去 2 天我试图在自己的环境中定义一个通用函数,但不知何故我没有成功。 首先,一些代码来演示我的问题:

# my custom environment
my_env <- new.env()

# my generic function foo
my_env$foo <- function(x, ...) {
   UseMethod('foo', x)
}

my_env$foo.character <- function(x, ...) {
   print(paste('I am a character!', x))
}

my_env$foo('Hello!')

这给了我以下错误消息:

Error in UseMethod("foo", x): no applicable method for 'foo' applied to an object of class "character"

到目前为止我从

UseMethod
的文档中学到了什么:

为了支持这一点,UseMethod 和 NextMethod 在两个地方搜索方法:在调用泛型函数的环境中,以及在定义泛型的环境(通常是命名空间)的注册数据库中 据我了解,它在全局环境(它被称为的地方)和

my_env
中搜索,因为那是它的定义所在。但如果是这样的话,我就不会收到错误消息。

因此,在定义泛型之后,我还尝试将函数附加到环境中:

# my custom environment
my_env <- new.env()

# my generic function foo
foo <- function(x, ...) {
   UseMethod('foo', x)
}

foo.character <- function(x, ...) {
   print(paste('I am a character!', x))
}

my_env$foo <- foo

my_env$foo('Hello!')

我还尝试了

UseMethod
与环境参考:

# my custom environment
my_env <- new.env()

# my generic function foo
my_env$foo <- function(x, ...) {
   UseMethod('my_env$foo', x)
}

my_env$foo.character <- function(x, ...) {
   print(paste('I am a character!', x))
}

my_env$foo('Hello!')

我还附上了

my_env

# my custom environment
my_env <- new.env()

# my generic function foo
my_env$foo <- function(x, ...) {
   UseMethod('foo', x)
}

my_env$foo.character <- function(x, ...) {
   print(paste('I am a character!', x))
}

attach(my_env)

my_env$foo('Hello!')

但这些对我来说没有任何改变。我在互联网上没有找到任何关于这个主题的信息,我不敢相信我是唯一一个尝试同时使用环境和泛型的人,因为如果可以的话,使用环境根本没有任何意义只保存“哑”列表和变量,但没有函数,它似乎在包的上下文中完美工作。

任何人都可以向我解释一下,我做错了什么吗?我感谢任何建设性的意见:)

r generics r-environment
2个回答
0
投票

类似:

# my custom environment
my_env <- new.env()

# my generic function foo
my_env$foo <- function(x, ...) {
  UseMethod('foo', x)
}

foo.character <- function(x, ...) {
  print(paste('I am a character!', x))
}

my_env$foo("ala")
#> [1] "I am a character! ala"

创建于 2024 年 10 月 30 日,使用 reprex v2.1.0


0
投票
with(my_env, foo('Hello!'))
#[1] "I am a character! Hello!"

with(my_env,.S3method("foo", "character", "foo.character"))

my_env$foo('Hello!')
#[1] "I am a character! Hello!"
© www.soinside.com 2019 - 2024. All rights reserved.