过去 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!')
但这些对我来说没有任何改变。我在互联网上没有找到任何关于这个主题的信息,我不敢相信我是唯一一个尝试同时使用环境和泛型的人,因为如果可以的话,使用环境根本没有任何意义只保存“哑”列表和变量,但没有函数,它似乎在包的上下文中完美工作。
任何人都可以向我解释一下,我做错了什么吗?我感谢任何建设性的意见:)
类似:
# 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
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!"