gpt4 book ai didi

r - 在环境中使用 UseMethod 进行方法分派(dispatch)

转载 作者:行者123 更新时间:2023-12-01 03:52:55 24 4
gpt4 key购买 nike

我希望能够调度到 environment 中定义的方法.这将允许我为 proto 定义多态方法。对象(proto 对象又继承自 environment 类)。例如。:

x <- proto()
x$foo <- function(., obj) UseMethod("foo", obj)
x$foo.list <- function(., obj) "obj is a list!"
x$foo.data.frame <- function(., obj) "obj is a data.frame"
x$foo.default <- function(., obj) "obj is neither a list nor a data.frame!"

所以我可以这样做:
> x$foo(list())
[1] "obj is a list!"

> x$foo(1)
[1] "obj is neither a list nor a data.frame!"

但是,我现在在调用 x$foo 时得到的只是是
Error in UseMethod("foo") : 
no applicable method for 'foo' applied to an object of class "c('proto', 'environment')"

如何解决这个问题?

最佳答案

我不知道 proto 是如何工作的,但至于环境,它可以工作:

x <- environment()
x$foo <- function(obj) { UseMethod("foo", obj) }
x$foo.list <- function(obj) "obj is a list!"
x$foo.data.frame <- function(obj) "obj is a data.frame"
x$foo.default <- function(obj) "obj is neither a list nor a data.frame!"

x$foo(list())
# [1] "obj is a list!"

x$foo(iris)
# [1] "obj is a data.frame"

proto 似乎覆盖了 $ 运算符,因此您可以像这样破解它:
x <- proto()
assign('.foo', function(obj) { UseMethod(".foo", obj) }, envir = x)
assign('.foo.list', function(obj) "obj is a list2!", envir = x)
assign('.foo.data.frame', function(obj) "obj is a data.frame2!", envir = x)
x$foo <- function(., obj) { get('.foo', envir = .)(obj) }

x$foo(list())
x$foo(iris)

关于r - 在环境中使用 UseMethod 进行方法分派(dispatch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20501209/

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