我做了一些测试来试图找出答案,我认为这会非常不一致。
首先,如果您阅读 的文档InternalMethods
,您将看到以下内容:
以下原始函数和内部函数是通用的,即您可以为它们编写方法
因此,您可以拥有通用的原始函数。
这是我的一些测试,尽管我怀疑它们是否详尽。
library(rlang)
setClass("Foo", list(x="numeric"))
foo <- new("Foo", x=0)
首先,我尝试定义一个$
方法,该方法已经为列表和数据框使用引号:
setMethod("$", signature(x="Foo"), function(x, name) {
enquo(name)
})
foo$x
<quosure>
expr: ^"x"
env: empty
由于某种原因,我们定义的泛型会自动更改name
为字符,但也许您可以简单地使用sym
然后继续。
然后我想看看包含省略号的泛型会发生什么:
setMethod("predict", signature(object="Foo"), function(object, ...) {
enquos(...)
})
predict(foo, bar, baz=bak)
<list_of<quosure>>
[[1]]
<quosure>
expr: ^bar
env: global
$baz
<quosure>
expr: ^bak
env: global
那里没有惊喜(?)
然后我尝试定义[
,它有几个形式参数和...
:
setMethod("[", signature(x="Foo"), function(x, i, j, ..., drop=TRUE) {
enquos(i, j, ...)
})
foo[bar, , baz, bak]
<list_of<quosure>>
[[1]]
<quosure>
expr: ^bar
env: global
[[2]]
<quosure>
expr: ^
env: empty
[[3]]
<quosure>
expr: ^baz
env: global
[[4]]
<quosure>
expr: ^bak
env: global
似乎按预期工作,虽然我不确定如何理解空的 quosure,但它的行为并不像缺少的参数:
f <- function(x) {
print(missing(x))
ff <- function(xx) { missing(xx) }
eval_tidy(ff(!!enquo(x)))
}
f()
[1] TRUE
[1] FALSE
最后,我尝试向该[
方法添加一个正式参数:
setMethod("[", signature(x="Foo"), function(x, i, j, k, ..., drop=TRUE) {
enquos(i, j, k, ...)
})
foo[bar, , baz, bak]
<list_of<quosure>>
[[1]]
<quosure>
expr: ^i
env: 000001FCA36865F0
[[2]]
<quosure>
expr: ^j
env: 000001FCA36865F0
[[3]]
<quosure>
expr: ^baz
env: global
[[4]]
<quosure>
expr: ^bak
env: global
而且我不知道这种行为是错误还是功能或其他东西。