2013-12-10 12 views
4

我希望能夠分派到environment中定義的方法。這將允許我爲proto對象定義多態方法(proto對象繼而從environment類繼承)。例如: -方法在環境中使用UseMethod

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')" 

如何解決這一問題?

回答

2

我不知道怎麼原始作品,但對於環境,它的工作原理:

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" 

原似乎覆蓋$運營商,所以你可以破解它是這樣的:

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) 
相關問題