Отправка метода с использованием UseMethod в среде
Я хочу иметь возможность отправлять методы, определенные в 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')"
Как это исправить?
1 ответ
Я не знаю, как работает прото, но что касается сред, это работает:
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)