对于访问a$b
,是的,这是可能的——如果混乱的话。原因是它$
只是一个我们可以重新定义的运算符。
可以按如下方式检索默认定义:
> `$`
.Primitive("$")
它是很容易 可以改变这一点,以便我们首先测试b
in是否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)。