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课程,但欢迎任何实施建议。
关于奥斯卡
答案 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)