【问题标题】:Method Dispatch with UseMethod within an environment在环境中使用 UseMethod 进行方法分派
【发布时间】:2013-12-28 08:49:34
【问题描述】:

我希望能够分派到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')"

如何解决这个问题?

【问题讨论】:

    标签: r oop polymorphism prototype proto


    【解决方案1】:

    我不知道 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)
    

    【讨论】:

      猜你喜欢
      • 2020-07-29
      • 2012-09-02
      • 2018-11-28
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      相关资源
      最近更新 更多