3

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 课程,但欢迎提出任何实施建议。

问候奥斯卡

4

2 回答 2

2

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

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

> `$`
.Primitive("$")

它是很容易 可以改变这一点,以便我们首先测试bin是否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)。

于 2013-07-22T17:50:44.137 回答
0

如果我正确理解了您的问题,tryCatch应该相当于 method_missing:

tryCatch(foo(options, named=option1,...), EXCEPTION-CLAUSE-HERE)
于 2013-07-22T17:13:36.790 回答