2013-07-22 124 views
3

R等價於method_missing嗎? 換句話說,是否有可能攔截對某個對象上不存在的方法的調用並對其執行某些操作? 所有類型的例子都很棒(S3,S4,參考類)。 我想要做的是構建一個對象a,以便類似於a$b這樣的東西是可能的,而不必明確地定義b。R中的method_missing等效於

編輯:這是我約怎麼想我的對象的行爲:

setClass("myClass", representation(url = "character")) 
a <- new("myClass", url = "http://www.example.com") 
a$b$c 
# => 'http://www.example.com/b/c' 

這是S4類,但任何實現的建議是值得歡迎的。

關於奧斯卡

+2

您可能想要包括是否使用S3,S4或參考類(或者如果您問的是全部三種)。 – joran

+0

看起來像一個可重複的例子在這裏會有所幫助。我假設你想要一些比'foo.bar'的'methods('foo')'的輸出更復雜的東西? –

+0

現在我很困惑。 'a $ b'與方法幾乎沒有關係.... –

回答

2

對於接入a$b,這是可能的 - 如果凌亂。原因是$只是我們可以重新定義的一個運算符。

默認定義可以檢索如下:

> `$` 
.Primitive("$") 

容易夠可能改變這種做法,我們首先測試是否在a$bb確實存在。這裏有一個大致的輪廓(但一個大致的輪廓,見下文):

`$` <- function (a, b) { 
    if (exists(as.character(substitute(b)), where = a)) 
     .Primitive("$")(a, b) 
    else 
     methodMissing(as.character(substitute(a)), as.character(substitute(b))) 
} 

...現在我們只需要提供methodMissing

methodMissing <- function (a, b) 
    cat(sprintf('Requested missing %s on %s\n', b, a)) 

...我們可以使用它:

> foo <- list(bar = 'Hello') 
> foo$bar 
[1] "hello" 
> foo$baz 
Requested missing baz on foo 

但是,請注意,這對其他類型有趣的方式 - 例如,它不再適用於數據幀:

> cars$speed 
NULL 

我不知道是否是微不足道的解決這個問題 - 這是足夠的測試is.list(a),例如 - 所以謹慎行事。

S3和S4的解決方案留給讀者練習(實際上,我沒有線索 - 我不使用S4,很少使用S3)。

0

tryCatch應的method_missing相當於,如果我正確地理解你的問題:

tryCatch(foo(options, named=option1,...), EXCEPTION-CLAUSE-HERE)