R中的method_missing等价物

时间:2013-07-22 17:09:15

标签: r oop s4

R的方法是否与method_missing相同? 换句话说,是否可以拦截对对象上不存在的方法的调用并对其执行某些操作? 所有类型的示例都很棒(S3,S4,引用类)。 我想要做的是构建一个对象a,这样就可以a$b这样的东西,而不必明确定义b。

编辑:这大约是我希望我的对象表现的方式:

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

这是S4课程,但欢迎任何实施建议。

关于奥斯卡

2 个答案:

答案 0 :(得分:2)

对于访问a$b,这是可能的 - 如果是凌乱的话。原因是$只是我们可以重新定义的运算符。

可以按如下方式检索默认定义:

> `$`
.Primitive("$")

可能更改此内容,以便我们首先测试b中的a$b是否确实存在。这是一个粗略的轮廓(但粗略轮廓,见下文):

`$` <- 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)。

答案 1 :(得分:0)

如果我理解你的问题,

tryCatch应该相当于method_missing:

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